[ruby-dev:45283] [ruby-trunk - Bug #5390] YAML.load が、正しく解析できないエンコーディングの文字列も受け付けてしまう

From: Aaron Patterson <aaron@...>
Date: 2012-02-24 19:18:31 UTC
List: ruby-dev #45283
Issue #5390 has been updated by Aaron Patterson.


返事が遅くなって、ごめんなさい。

YAML のファイルフォーマットは UTF8, UTF16LE, と UTF16BE のみサポートしますが、Psych だけは String をパースする時に文字コードを UTF8 に変換します。

例: https://gist.github.com/1902995

ファイルを使用する場合、ファイルの文字例は以下の UTF8 、UTF16LE 、 UTF16BEの一つのみ使用可能です。

例:https://gist.github.com/1903026
----------------------------------------
Bug #5390: YAML.load が、正しく解析できないエンコーディングの文字列も受け付けてしまう
https://bugs.ruby-lang.org/issues/5390

Author: yu nobuoka
Status: Assigned
Priority: Normal
Assignee: Aaron Patterson
Category: 
Target version: 2.0.0
ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]


[[ruby-list:48419]] にてバグ扱いでいいだろうという話がありましたのでバグとして報告します。

YAML.load がどのように実装されているのかコードを追いきれなかったのですが、動きを見る限り、与えられた文字列のエンコーディングを気にせずにパースしているように思います。 このため、Shift_JIS のようなエンコーディングの文字列の一部を正しくパースできません。

 --- source code ---
 # coding: Shift_JIS
 require "yaml"
 text = '[ "噂" ]' # Shift_JIS の '噂' の 2 バイト目はバックスラッシュと同じバイト値
 str = YAML.load( text ).first # エラー発生

 --- output ---
 /home/nobuoka/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/syck.rb:135:in `load': syntax error on line 0, col 9: `' (ArgumentError)
 	from /home/nobuoka/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/syck.rb:135:in `load'
 	from yaml_cp932.rb:4:in `<main>'

Shift_JIS の文字列でもほとんどの場合は例外発生せずにパースされるので、Shift_JIS の文字列を使っている場合に問題が起こる可能性をユーザーが認識しづらいという問題があります。 よって、現在の動きはバグとして、以下のいずれかの動きに変更した方が良いのではないでしょうか。

*UTF-8 (UTF-16 も?) 以外のエンコーディングの文字列が渡された場合に例外を発生させる
*UTF-8 以外のエンコーディングの文字列が渡された場合に、自動的に UTF-8 に変換して処理を進める
*YAML の解析部分でエンコーディングを考慮するようにして、Shift_JIS などでも正しく解析できるようにする



-- 
http://bugs.ruby-lang.org/

In This Thread