Feature #1951

openのBOM指定拡張

Added by Yui NARUSE over 2 years ago. Updated 10 months ago.

[ruby-dev:39106]
Status:Closed Start date:08/18/2009
Priority:Normal Due date:
Assignee:Yui NARUSE % Done:

0%

Category:M17N
Target version:1.9.2

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 BOM Rejected 11/12/2008
related to ruby-trunk - Feature #802: IO.open optional argument to properly handle BOMs Closed 11/30/2008

History

Updated by Yui NARUSE over 2 years ago

  • Category set to M17N

Updated by Yui NARUSE over 2 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とみなし保持します。
なかった場合は無論何も起きません。

Updated by Usaku NAKAMURA over 2 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>

Updated by Yukihiro Matsumoto over 2 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-*"という指定に若干の抵抗を覚えるのですが、基本的に
賛成です。

Updated by Yui NARUSE over 2 years ago

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

Updated by Yusuke Endoh almost 2 years ago

  • Status changed from Assigned to Closed

Also available in: Atom PDF