Project

General

Profile

Bug #5176

UTF-8以外でpsychを使用し、YAML.dumpを実行するとエラーが発生する

Added by Masafumi Kiribayashi about 5 years ago. Updated about 5 years ago.

Status:
Closed
Priority:
Normal
ruby -v:
ruby 1.9.2p290 (2011-07-09) [i686-linux]
[ruby-dev:44363]

Description

Windows環境(mingw)、Linux環境において、添付したファイルで現象が発生します。
libyamlが「YAMLで使用する文字列はUTF-8である」ことを主張するのが原因かと思います。
Stringをdumpする前にUTF-8に変換する作業をライブラリですべきではないでしょうか。
現状、私は添付したファイルのコメントアウトした箇所を有効にすることで、問題を回避しています。

test.rb View (598 Bytes) Masafumi Kiribayashi, 08/09/2011 05:17 PM

History

#1 [ruby-dev:44364] Updated by Yui NARUSE about 5 years ago

  • Status changed from Open to Assigned
  • Assignee set to Aaron Patterson

libyamlが「YAMLで使用する文字列はUTF-8である」ことを主張するのが原因かと思います。
これは以下の通り規格が UTF-8 と UTF-16 しかないと言っているので libyaml は正しいと思います。

A YAML processor must support the UTF-16 and UTF-8 character encodings.
If a character stream does not begin with a byte order mark (#FEFF), the character encoding shall be UTF-8.
http://yaml.org/spec/1.1/#id868742

Stringをdumpする前にUTF-8に変換する作業をライブラリですべきではないでしょうか。

うーん、一度変換するともう戻らないのでどうなんでしょうかね。
Encoding.default_internal が指定されているときは変換したほうが良いとは思います。

#2 [ruby-dev:44365] Updated by Shyouhei Urabe about 5 years ago

戻んないような変換が発生しそうな時はEncoding::InvalidByteSequenceErrorでいいんじゃないかなあ

#3 [ruby-dev:44366] Updated by Yui NARUSE about 5 years ago

Shyouhei Urabe wrote:

戻んないような変換が発生しそうな時はEncoding::InvalidByteSequenceErrorでいいんじゃないかなあ

InvalidByteSequence はある String の内容であるバイト列がそのエンコーディングとして正しくない時の例外なので、
不可逆変換の時は意味的にちょっと違いますね。
何か一つ指定したらできるくらいのノリがいいかなぁと思っているんですが、SQLite とかでも黙って変換しちゃうので、
YAML 使うという時点でそういうもんだってことでもいいかなとも。

#4 [ruby-dev:44388] Updated by Aaron Patterson about 5 years ago

If you use the psych gem, I think it will fix this. Psych should automatically encode to UTF-8, but I think I added that after 1.9.2 was released.

Can you try with the Psych gem please?

Here is a test case I am using: https://gist.github.com/1144463

#5 [ruby-dev:44394] Updated by Masafumi Kiribayashi about 5 years ago

Thanks Aaron!
I tried Psych gem on Linux and Windows, your test was passed.
And my sample code ran with no errors.

#6 [ruby-dev:44396] Updated by Aaron Patterson about 5 years ago

  • Status changed from Assigned to Closed
  • Target version changed from 1.9.2 to 1.9.3
  • % Done changed from 0 to 100

Thank you for testing! The fix is in trunk, and should be in 1.9.3 as well. I will close this now.

Also available in: Atom PDF