シノバーです On Sat, 21 Dec 2002 09:39:54 +0900 Masaki SHINOMIYA <shino@xxxxxx> wrote:> parser.c中のxmlCopyCharMultiByteという関数です。 > 非ASCII文字をCOPY_BUFしようとするとこの関数が呼ばれます。 > この関数の中で非ASCII文字はUTF-8に変換したうえでコピーします。 > libxmlの仕様だとこれまで考えていたのですが、腑に落ちないところもありますね。 > どうして無条件にこの変換をやってしまうのか? > 入力はiso8859-1を仮定しているようですが。 そもそも正当なUTF-8で書かれたXMLもこれを通すと崩れてしまうので 仕様ではなくバグと言えるかもしれません。 この部分はlibxmlのデフォルト動作の old_parserは関係なくて new_parserを使うときだけなので、変更しても影響は少ないかも。 で、libxmlのほうにパッチを当ててみました。 --- parser.org Fri Sep 14 23:09:41 2001 +++ parser.c Sat Dec 21 13:22:00 2002 @@ -1126,9 +1126,11 @@ int xmlCopyChar(int len, xmlChar *out, int val) { /* the len parameter is ignored */ +#if true /* suppress converting */ if (val >= 0x80) { return(xmlCopyCharMultiByte (out, val)); } +#endif *out = (xmlChar) val; return 1; } これで gnumeric(どのバージョンでも可)を $ LIBXML_USE_NEW_PARSER=1 gnumeric で起動すると無用な変換をされずに、かつ4096byte目の欠落もなくなります。 (テストデーター1、テストデーター2ともOK) 試したい方は http://shino.pos.to/linux/libxml-1.8.16-0.nosrc.rpm を置いていますので、リビルドしてお使いください。 libxmlのソースはVineのlibxml-1.8.16-0vl1.src.rpmを 予めインストールしておくという方法もあります。 できたバイナリのインストールはroot権限で # rpm -Uvh --oldpackage libxml-*1.8.16-0.i386.rpm のように --oldpackage オプションを付けてください。 gnumericも多少手を加えたものを作りました。 http://shino.pos.to/linux/gnumeric-1.0.11-0.nosrc.rpm このパッケージでは いちどlibxmlのnew_parserの使用を試み、おかしな変換をするようならば new_parserの使用を諦めてold_parserのほうを使います。 つまり、 修正されないlibxmlとの組み合わせでは gnumeric-1.0.11-0vl2と同等 (テストデーター1でエラー、テストデーター2はOK)。 修正されたlibxmlがあるとまともに動きます (テストデーター1、テストデーター2ともOK)。 #テストデーター1 http://shino.pos.to/linux/a2z.gnumeric 正しくは次のように見えるべきもの abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz A-Z #テストデーター2 http://shino.pos.to/linux/aiueo.gnumeric 正しくは次のように見えるべきもの 123 ABC 123 あいうえお -- Masaki Shinomiya <shino@xxxxxx> http://shino.pos.to/linux/