Project

General

Profile

Feature #1951

openのBOM指定拡張

Added by naruse (Yui NARUSE) almost 10 years ago. Updated over 1 year ago.

Status:
Closed
Priority:
Normal
Target version:
[ruby-dev:39106]

Description

#747と#802で議論された、openのBOM指定拡張ですが、現在の仕様は、

  • BOMを捨てる
  • BOMを見てencodingを設定する という2つの機能が混在しています。

このために、たとえば「UTF-8-BOM」という指定でも、
BOMがUTF-16LEを示していた場合には実際に返ってくるStringはUTF-16LEになってしまいます。

この問題に対する解決案として、

  • UTF-*-BOM はBOMを捨てるだけ。別のencodingだった場合は例外
  • BOM|UTF-*を追加、これが現在のUTF-*-BOM相当の動作 (BOMを見る OR UTF-*と指定、というイメージ) というものを考えています。

皆さんはどのように思われますか?


Related issues

Related to Ruby trunk - Feature #747: /\A/u ignores BOMRejected11/12/2008Actions
Related to Ruby trunk - Feature #802: IO.open optional argument to properly handle BOMsClosed11/30/2008Actions

History

#1

Updated by naruse (Yui NARUSE) almost 10 years ago

  • Category set to M17N
#2

Updated by naruse (Yui NARUSE) almost 10 years ago

  • Target version set to 1.9.2

記述が正確でないという指摘を受けたので訂正します。

現状の機能は、
「BOMに従ってencodingを設定するが、BOMがない場合のデフォルト値を指定できる」
というものですが、現状の指定方法である「UTF-*-BOM」から見て直観的ではありません。
ゆえに、「BOM|UTF-*」と変更する案です。

念のため、「BOM|UTF-*」の動作をおさらいしますと、
冒頭にU+FEFFがあった場合、これをBOMとみなし、それに基づきencodingを設定します。
この場合は冒頭のU+FEFFはBOMなのですから、これを読み込んだStringには含めません。
冒頭にU+FEFFがなかった場合、後半のUTF-*をencodingとして設定します。

一方で、「UTF-*-BOM」に対しては、encodingがUTF-でかつ、冒頭のU+FEFFはBOMであるという指定です。
この場合も、冒頭のU+FEFFはBOMなのですから、これを読み込んだStringには含めません。
読み込んだBOMや文字列が指定のencodingと矛盾した場合は例外が上がります。
冒頭にU+FEFFがなかった場合は、普通の`UTF-
`と動作が変わりません。

ちなみに、普通の「UTF-*」だった場合は、冒頭にU+FEFFがあった場合、これをZWNBSPとみなし保持します。
なかった場合は無論何も起きません。

#3

Updated by usa (Usaku NAKAMURA) almost 10 years ago

こんにちは、なかむら(う)です。

In message "[ruby-dev:39111] [Feature #1951] openのBOM指定拡張"
on Aug.19,2009 01:10:38, redmine@ruby-lang.org wrote:

現状の機能は、
「BOMに従ってencodingを設定するが、BOMがない場合のデフォルト値を指定できる」
というものですが、現状の指定方法である「UTF-*-BOM」から見て直観的ではありません。
ゆえに、「BOM|UTF-*」と変更する案です。

元仕様、つまり、「UTF-*-BOM」という指定を提案したのは私だった
わけですが、trunkに入れてもらった直後くらいから非常に後悔して
おります。
というわけで、「BOM|UTF-*」と変更することに全面的に賛成です。
# 今なら間に合いますよね?

以下は、「BOM|UTF-*」への変更が採用されるという前提で、頭の体
操レベルの提案です。

なお、「BOMに従ってencodingを設定する」と「BOMがない場合のデ
フォルト値を指定する」という機能は分割可能と考えることもでき
なくはありません。
その場合、「BOM」というencoding指定を導入し、BOMがなければ例
外を発生させる、という案があります。
実用性がある気はあまりしないのですが、需要はあるでしょうか?

また、「BOM|UTF-*」に限らず、「BOM|任意のエンコーディング」と
いう指定を許すという案もあります。
これまた実用性はなさそうですが、需要はあるでしょうか?

それでは。
--
U.Nakamura usa@garbagecollect.jp

#4

Updated by matz (Yukihiro Matsumoto) almost 10 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:39106] [Feature #1951] openのBOM指定拡張"
on Tue, 18 Aug 2009 23:47:17 +0900, Yui NARUSE redmine@ruby-lang.org writes:

この問題に対する解決案として、

  • UTF-*-BOM はBOMを捨てるだけ。別のencodingだった場合は例外
  • BOM|UTF-*を追加、これが現在のUTF-*-BOM相当の動作 (BOMを見る OR UTF-*と指定、というイメージ) というものを考えています。 皆さんはどのように思われますか?

"BOM|UTF-*"という指定に若干の抵抗を覚えるのですが、基本的に
賛成です。

#5

Updated by naruse (Yui NARUSE) almost 10 years ago

とりあえずBOM|UTF-*への変更をr24605で入れました。

#6

Updated by mame (Yusuke Endoh) about 9 years ago

  • Status changed from Assigned to Closed
#7

Updated by nobu (Nobuyoshi Nakada) over 1 year ago

  • Description updated (diff)

Also available in: Atom PDF