シノバーです ちょっと見えてきました。 まず、新旧parserのテストですが、簡単な方法が見付かりました。 libxml(-1.8.16)は旧来のparserと libxml2からバックポートしたという新parserの両方を内蔵しています。 普段は旧parserを使いますが、環境変数で新parserの使用を強制できます。 今VinePlusにあるgnumeric-1.0.11-0vl2あるいは昔のバージョンでもよい。 そのままでは旧parser。これを次のように起動すると新parserを使います。 $ LIBXML_USE_NEW_PARSER=1 gnumeric On Tue, 17 Dec 2002 01:38:13 +0900 加藤 雅 <mkato@xxxxxxxxxxxxx> wrote: > 新旧の xml-io.c の diff を取ると、 > gboolean xml_parser_flag; > xml_parser_flag = xmlUseNewParser (TRUE); > xmlUseNewParser (xml_parser_flag); > の 3行だけが違うようで、 というのはこの環境変数LIBXML_USE_NEW_PARSER=1 をセットすることと等価です。 # libxmlのソース parser.c の最後のほうを見るとこれが分かりました。 # オープン・ソースって便利ですね。 On Wed, 18 Dec 2002 01:44:26 +0900 加藤 雅 <mkato@xxxxxxxxxxxxx> wrote: > > > 全角1文字を、読み込み時に、 > > > 何故か別の全角2文字にエンコードしてるみたいです。 > > > > > > 「あ」のeuc-jpコードは16進表記で a4a2、 > > > > 1byteづつ10進表記すると164,162となります。 > > > > これを新parserで読み込み保存すると ¤¢ > > 10進で194=16進でC2をそれぞれ挿入してますね。なんだろ、こりゃ? > > Âはiso8859-? では'A'の上に'^'を載せた字ということで、 > > 格別の意味があるようには思えないし…。 > > (char *) で拾ったデータを、無意味なデータ(Â等)と一緒に、(short *) で > 書き出してる、とかでは無いか等と想像できますが、何処でそうやってるのか、 この194が加えられるのは、iso8859-1(?)→UTF-8への変換みたいです。 たとえば0xa7=167はiso8859-1(ASCII?)では半角「§」です。 これに0xc2をくっつけて0xc2a7は同じ文字のUTF-8コードらしい。 ASCII文字(0-128)では変なバイトが付け加えられていない理由もこれで分かる。 ASCII文字(0-128)はUTF-8コードでも同じだから。 けっきょくlibxml新parserのバグではなく仕様みたいです。 入力をiso8859-1(あるいはASCII?)とみなしてUTF-8コードに変換して出力するという。 # libxml2 ではどうなっているのか気になりますね。 gnumeric側で受け取った上位バイトを落すというのが現実的対処法と思います。 # gnumeric開発元では問題を認識はしているようですが、 # gnumeric側でやるつもりはないみたい? # http://bugzilla.gnome.org/show_bug.cgi?id=101415 -- Masaki Shinomiya <shino@xxxxxx> http://shino.pos.to/linux/