QA@IT

UTF-7 エンコーディングの存在意義は?

2907 PV

Ruby 1.9.3 に UTF-7 というエンコーディングがありますが、UTF-8 から変換することができません。

% ruby -ve '"a".encode("utf-7","utf-8")'
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
-e:1:in `encode': code converter not found (UTF-8 to UTF-7) (Encoding::ConverterNotFoundError)
    from -e:1:in `<main>'

また、UTF-7 はダミーエンコーディングなので、文字単位の処理もできません。

他のエンコーディングからの変換もできないダミーエンコーディングは何のために存在しているのでしょうか。

ISO-2022-JP-2 も同様のようです。

% ruby -e 'Encoding.list.each{|enc| begin; "a".encode(enc,"utf-8"); rescue=>e; p e; end}'     
#<Encoding::ConverterNotFoundError: code converter not found (UTF-8 to ISO-2022-JP-2)>
#<Encoding::ConverterNotFoundError: code converter not found (UTF-8 to UTF-7)>

回答

それが UTF-7、あるいは ISO-2022-JP-2 であるとわかるようにです。
ステートフルエンコーディングですし、Ruby本体ではこれまで特に要望も無かったので変換も入れていませんが、
他のiconvとかではエンコーディングを見て変換してくれるかもしれません。

編集 履歴 (0)
  • Ruby の標準ライブラリを調べてみました。`URI.encode_www_form_component` が UTF-7 から UTF-8 に変換できるのを前提としたコードになっているようです。実際に UTF-7 エンコーディング文字列を渡すと `Encoding::ConverterNotFoundError` になりました。 -
  • そこに限らず、暗黙で変換するところはだいたいそうじゃないでしょうか。で、URI.encode_www_form_componentに限って言えばUTF-7をWebで使うとか狂気の沙汰ですよね… -
  • URI.encode_www_form_component は暗黙ではなくて、文字列が UTF-7, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE だったら、UTF-8 に変換するように書かれています(それ以外だったらそのまま ASCII-8BIT にする)。
    狂気の沙汰というのは同感です :-)
    -
  • おぉ、言われてみればそんなコードを書いた記憶があります。うーん、なんかバグな気もしますが、まぁ、そのままでいいかな… -
ウォッチ

この質問への回答やコメントをメールでお知らせします。