Bug #3360
closedrdoc fails when including BOM
Description
=begin
whiteleaf と申します。
BOM を含むファイルを rdoc にかけると処理が固まります。
rdoc が BOM を見てないせいなので、以下のパッチでなおりました。
・":bom|utf-8" オプションを使っていないのは 1.8 のためと
結局 ASCII-8BIT に force_encoding しないといけないため意味がないからです。
(rdoc のエンコーディングを UTF-8 にするなら別ですが)
・UTF-8 の BOM しか見ていないのは ruby スクリプトに使わない(使えない)
ので意味がないからです。
・encode してるのは複数のファイルが異なるエンコーディングを使っている場合に
charset とエンコーディングが異なる可能性があるためです。
余談ですが、bom|utf-* オプションはエンコーディングが未知の場合には¶
ほとんど意味が無いなあと思いました。¶
Index: generator/template/darkfish/classpage.rhtml¶
--- generator/template/darkfish/classpage.rhtml (リビジョン 28052)
+++ generator/template/darkfish/classpage.rhtml (作業コピー)
@@ -1,4 +1,4 @@
-
+"?>
def read_file_contents(filename)
-
utf8_bom = [0xEF, 0xBB, 0xBF].pack("C*")
content = open filename, "rb" do |f| f.read end -
if content[0..2] == utf8_bom then
-
content = content[3..-1]
-
end
if defined? Encoding then
if /coding[=:]\s*([^\s;]+)/i =~ content[%r"\A(?:#!.\n)?.\n"]
if enc = ::Encoding.find($1)
content.force_encoding(enc) -
content.encode!(@options.charset) end end
end
=end
Updated by mame (Yusuke Endoh) over 14 years ago
=begin
遠藤です。
2010年5月29日2:17 white leaf redmine@ruby-lang.org:
BOM を含むファイルを rdoc にかけると処理が固まります。
rdoc が BOM を見てないせいなので、以下のパッチでなおりました。
ありがとうございます。
再現しました。また、頂いたパッチで直ることを確認しました。
・":bom|utf-8" オプションを使っていないのは 1.8 のためと
結局 ASCII-8BIT に force_encoding しないといけないため意味がないからです。
(rdoc のエンコーディングを UTF-8 にするなら別ですが)
・UTF-8 の BOM しか見ていないのは ruby スクリプトに使わない(使えない)
ので意味がないからです。
・encode してるのは複数のファイルが異なるエンコーディングを使っている場合に
charset とエンコーディングが異なる可能性があるためです。
要するに、このパッチは 2 つの問題を修正していますよね。
- BOM があるとパースが固まる
- html 出力の charset 指定が無視されている
成瀬さん、M17N 関係なのでパッチが正しいか見ていただけますか。
正しいようなら Eric に転送します。
チケットを翻訳してくれる人はいないかなあ……。¶
--
Yusuke Endoh mame@tsg.ne.jp
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r28062.
white, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end
Updated by mame (Yusuke Endoh) over 14 years ago
=begin
遠藤です。
2010年5月29日12:07 Nobuyoshi Nakada redmine@ruby-lang.org:
This issue was solved with changeset r28062.
Eric を通さずに直していただいてしまったようですが、「html 出力の
charset 指定が無視されている」の方も直していただけますでしょうか。
diff --git a/lib/rdoc/generator/template/darkfish/index.rhtml
b/lib/rdoc/generator/template/darkfish/index.rhtml
index e853235..8dad4f4 100644
--- a/lib/rdoc/generator/template/darkfish/index.rhtml
+++ b/lib/rdoc/generator/template/darkfish/index.rhtml
@@ -1,4 +1,4 @@
-
+"?>
diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb
index 3c08b5e..7f41163 100644
--- a/lib/rdoc/rdoc.rb
+++ b/lib/rdoc/rdoc.rb
@@ -414,6 +414,7 @@ The internal error was:
if enc ||= (Encoding::UTF_8 if utf8)
content.force_encoding(enc)
end
-
content.encode!(@options.charset)
end
content
--
Yusuke Endoh mame@tsg.ne.jp
=end
Updated by whiteleaf (whiteleaf _) over 14 years ago
=begin
whiteleaf です。
--charset オプションは「html の charset を指定する」という解釈ですと、
encode しないほうが正しい挙動といえなくもないですが、やっぱり
2つ以上の異なるエンコーディングのファイルを対象にする場合は
charset と中身のエンコーディングは揃えてほしいところです。
それと遠藤さんのパッチですと、
ASCII-8BIT のデータを encode してしまう可能性がある(Encoding::UndefinedConversionError)
ので、force_encoding をした場合のみ encode するべきです。
(私のパッチではそう処理していたはずです)
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
=begin
なかだです。
At Sun, 30 May 2010 00:36:49 +0900,
whiteleaf wrote in [ruby-dev:41460]:
--charset オプションは「html の charset を指定する」という解釈ですと、
encode しないほうが正しい挙動といえなくもないですが、やっぱり
2つ以上の異なるエンコーディングのファイルを対象にする場合は
charset と中身のエンコーディングは揃えてほしいところです。
そのへんが確信がなかったこともあり、別のissueと考えてそのままに
しました。
それと遠藤さんのパッチですと、
ASCII-8BIT のデータを encode してしまう可能性がある(Encoding::UndefinedConversionError)
ので、force_encoding をした場合のみ encode するべきです。
(私のパッチではそう処理していたはずです)
BOMもmagic commentもない場合は、US-ASCIIとして処理すべきでしょう。
diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb
index 3c08b5e..d605a26 100644
--- a/lib/rdoc/rdoc.rb
+++ b/lib/rdoc/rdoc.rb
@@ -411,9 +411,8 @@ The internal error was:
if /coding[=:]\s*([^\s;]+)/i =~ content[%r"\A(?:#!.\n)?.\n"]
enc = ::Encoding.find($1)
end
-
if enc ||= (Encoding::UTF_8 if utf8)
-
content.force_encoding(enc)
-
end
-
enc ||= (utf8 ? Encoding::UTF_8 : Encoding::US_ASCII)
-
content.encode!(@options.charset, enc)
end
content
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by naruse (Yui NARUSE) over 14 years ago
=begin
成瀬です。
(2010/05/29 2:17), white leaf wrote:
・UTF-8 の BOM しか見ていないのは ruby スクリプトに使わない(使えない)
ので意味がないからです。
rdoc の書かれているファイルが ruby スクリプトだとは限らなかったような。
・encode してるのは複数のファイルが異なるエンコーディングを使っている場合に
charset とエンコーディングが異なる可能性があるためです。
これができてないのは現状の仕様だったと思います。
なので、この部分は feature ですね。
余談ですが、bom|utf-* オプションはエンコーディングが未知の場合には¶
ほとんど意味が無いなあと思いました。¶
エンコーディングが未知な場合のための物では無いので当然です。
--
NARUSE, Yui naruse@airemix.jp
=end
Updated by naruse (Yui NARUSE) over 14 years ago
=begin
成瀬です。
(2010/05/30 1:11), Nobuyoshi Nakada wrote:
At Sun, 30 May 2010 00:36:49 +0900,
whiteleaf wrote in [ruby-dev:41460]:--charset オプションは「html の charset を指定する」という解釈ですと、
encode しないほうが正しい挙動といえなくもないですが、やっぱり
2つ以上の異なるエンコーディングのファイルを対象にする場合は
charset と中身のエンコーディングは揃えてほしいところです。そのへんが確信がなかったこともあり、別のissueと考えてそのままに
しました。
そろえて欲しいという動機は理解できます。
HTML の charset と、Ruby での encoding が一致するとは限らないんですよね。
cf. Windows-31J, CP51932, Windows-1252
それと遠藤さんのパッチですと、
ASCII-8BIT のデータを encode してしまう可能性がある(Encoding::UndefinedConversionError)
ので、force_encoding をした場合のみ encode するべきです。
(私のパッチではそう処理していたはずです)BOMもmagic commentもない場合は、US-ASCIIとして処理すべきでしょう。
rdoc が書かれているのが ruby スクリプトならばそれは US-ASCII のはずです。
が、それを UTF-8 として扱っても別に支障はありません。
rdoc が書かれているのが rdoc 専用ファイルだったり、別の何かへの埋め込みデータの場合、
それは rdoc やそのフォーマットの事情に依存します。それは Ruby M17N の判断する事柄では
ありません。それらが UTF-8 であるべきだと判断するならばこれも問題ありません。
--
NARUSE, Yui naruse@airemix.jp
=end