vine-users ML アーカイブ



[vine-users:057099] Re: gnumeric xml 保存時の日本語 文字化け及び脱落

  • From: Masaki Shinomiya <shino@xxxxxx>
  • Subject: [vine-users:057099] Re: gnumeric xml 保存時の日本語 文字化け及び脱落
  • Date: Sat, 21 Dec 2002 18:25:08 +0900
シノバーです

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/