From: "NARUSE, Yui" Date: 2011-02-22T23:32:17+09:00 Subject: [ruby-dev:43248] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv 成瀬です。 (2011/02/22 22:12), Kouhei Sutou wrote: > In > "[ruby-dev:43246] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv" on Tue, 22 Feb 2011 18:13:38 +0900, > "NARUSE, Yui" wrote: > >>> XMLDecl#encoding は String であるべき >>> >>> というよりは、 >>> >>> XML宣言に記述するエンコーディング(=情報交換用符号ですよ >>> ね?)と内部処理に使うエンコーディング(=内部処理用符号 >>> =transcode ですよね?)を別々に管理できるようにするべき >>> >>> ですよね? >> >> 「別々に管理できる」に加えて、どのような名を名乗るかまで必要です。 >> で、Encodingを用いるとEncoding#nameを実際に記述するエンコーディング名に >> 用いると思いますが、この場合名前の正規化が走ってしまうのでまずいのです。 >> 具体例としては 「csWindows31J」を用いたい時とか。 > > むぅ。「csWindows31J」ですか。 > 「csWindows31J」を使いたいときというのは、ようはMicrosoft向 > けにXMLを出力したいときですよね。であれば、文字列化するとき > に:for_microsoft => trueみたいなオプションを指定するような > APIの方がよいと考えています。理由はそっちの方が意図を表現し > ているからです。 出力のエンコーディングは Windows-31J だけど名乗りは Shift_JIS にさせたい という例もありえますね。また、さらに Solaris 用に PCK と名乗らせたいとか。 (PCK は Windows-31J か Shift_JIS の alias として追加予定) 別のユースケースだと、ケータイ絵文字を含んだUTF-8なXHTMLをREXMLで処理して、 UTF8-DoCoMoとして出力しつつ、そいつにUTF-8と名乗らせたいとか。 一般論としては XML 宣言の encoding 属性は受信側のXMLパーサの 文字コード変換器の引数なので、Ruby が変換は可能だが名前を知らない場合や、 Ruby では alias になっちゃってる例が考えられます。 > そもそも、私がXML宣言のエンコーディングにEncodingを使いたいの > はtypoとかの間違いをなるべく起こしづらかったり、気付きやすい > APIにしたいからです。REXMLはRubyのtranscode(ですよね?)をベー > スにしているため、transcodeが対応しているエンコーディング以外 > は扱えないので、XML宣言をEncodingで表現すれば、サポート外のも > のを検出しやすくなると思っています。 そもそも、Encoding は鬼車のモジュールに対応するオブジェクトで、 transcode の変換器に対する引数とは別の話ですよ。 例えば変換時に Apple 版 NFD を行うことを意味する UTF8-MAC なんかは、 現状 encoding としても別になってますが、これは失敗だった気がするので UTF-8 に統合しようかとも思っていたり。 また、encoding 宣言は送信側である Ruby/REXML ではなく、 受信側が解釈するものなので、こちらがサポートしているかどうかは本質的には 問題ではありませんね。Encoding オブジェクトを受け付けてもいいとは思いますが。 >>> それとは別に「内部処理用符号」を持つようにしようと思っていま >>> す。名前はXMLDecl#transcode, XMLDecl#transcode=がいいんじゃな >>> いかと思っています。これにもEncodingを使うつもりです。 >> >> 内部処理用符号を持つことには賛成します。 >> >> けれども「transcode」はCRubyのエンコーディング変換エンジンの実装名で、 >> Rubyレイヤにはその名は出していないはずです。 >> よって、ここで「transcode」というメソッド名を用いるのは不適だと考えます。 > > なんと。一般的な用語なのかと思っていました。 > であれば、別にアクセサを提供しなくてもよいかなぁという気になっ > てきました。そんなに頻繁に使うような気もしないので、属性や内 > 容をとってきてencodingしてもらうのでも困らなそう。 うむむ?ここの「内部処理用符号」って現在もっぱら UTF-8 を使っている、 REXML 内部でXML断片に用いる encoding とは別でしたか? 念のためまとめ直すと、登場人物は以下の三者ですね。 * REXML 内部エンコーディング * REXML 内部での処理で用いるエンコーディング * 現在もっぱら UTF-8 * Encoding オブジェクト可 * REXML 出力エンコーディング * 文字列化して出力した結果の encoding * transcode が「内部to出力」の変換を扱える必要 * Encoding オブジェクト可 * 出力結果のXML宣言のencoding属性の値 * 出力結果を解釈するどこかのXMLパーサが見る値 * Ruby が理解できる必要はない * String が望ましい -- NARUSE, Yui