お報せ

童帝雑談所自動抽出でAAではないレスを拾う場合がある件に関する説明

Google chrome使用時に順番がズレるケースがある問題について












スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

一部文字が化ける件。

サクラエディッタで一部文字が化けるので、サクラを使っているなら変えてみては?、という意見を頂きました。
手元ではJava上で編集しているため、サクラの問題は無関係でした。
せっかくのアドバイスですが活かすことができずすいません。

…と思ったんですが、間接的にですが、非常に有益なコメントでした!
調査のとっかかりになりました。感謝です。

 
 
         *     *     *
 
 


まず、せっかくなのでサクラエディッタさんの化ける問題について軽く調べてみました。
調べてみたところ、サクラエディッタさんは内部コードSJISなようです。なので、SJISで表現できない文字で問題がおこるっぽいデスネ。

こちらちょっとヒントを得て、「そういえば化ける文字はのきなみShift_JISの機種依存文字エリアのコードだなぁ」と気づき、文字コード間の相違についてちょっと調査。
(このヒントになったのが超大事。感謝です。)

編集環境の内部コードがunicodeでしたらばがEUC_jpで、fc2が…不明です。(何でアップしても受け付けてくれるっぽい)





とりあえず、化けるモノの具体例(by 悪の化身ルイズとやる夫 1スレ目)。

                      ヽ人_从人__从_从人__从人_人_从人__从人ノ
                     <                         >
          __          -‐<   ヒーーーーーーーーーーーッ!!    >__          -‐- 、
            /: :≠⌒ヽ、_ /∠二<                         >/: :≠⌒ヽ、_ /∠二ヽ〉_
        .' :/ . : :´: : :ヘ: : : :_:_: : : : Y⌒YW⌒Y⌒WW⌒⌒YW⌒Y⌒WY⌒⌒Y .' :/ . : :´: : :ヘ: : : :_:_: : : : `ヽ
         {: {/: : : : :〈: : V´: : : :`ヽ: : :ー={: {/: : : : :〈: : V´: : : :`ヽ: : :ー==ミ{: {/: : : : :〈: : V´: : : :`ヽ: : :ー==ミ、
        乂ゝ: : /: : ', : }: : : : : : : :\: : : '乂ゝ: : /: : ', : }: : : : : : : :\: : : '. ー:、 乂ゝ: : /: : ', : }: : : : : : : :\: : : '. ー:、 \
       /: :/ : : :′ : : :}: :|: : : : : : 、 : : \/: :/ : : :′ : : :}: :|: : : : : : 、 : : \: :∨ /: :/ : : :′ : : :}: :|: : : : : : 、 : : \: :∨ :}
       .′/ : : /: : : : : :! 八: : : : ノ: \ : .′/ : : /: : : : : :! 八: : : : ノ: \ : : >': .′/ : : /: : : : : :! 八: : : : ノ: \ : : >': 人 _
        {: イ : : /: : : : : :ノイ 小: /: : : : :≧{: イ : : /: : : : : :ノイ 小: /: : : : :≧ー= {: イ : : /: : : : : :ノイ 小: /: : : : :≧ー=彡'/⌒ヽ`:ー.、
     {__乂{: : /: : : :ナ个} :ー!_´≧xzz一{__乂{: : /: : : :ナ个} :ー!_´≧xzz一: < {__乂{: : /: : : :ナ个} :ー!_´≧xzz一: <´i} {⌒  _}\: :ヽ
     rーrヘ: :{: _:_イムイ !: :ムイ:::::::::} } `rーrヘ: :{: _:_イムイ !: :ムイ:::::::::} } `ト、: ンrーrヘ: :{: _:_イムイ !: :ムイ:::::::::} } `ト、: ン、_≧ーくヽ
      { (  'ソ: : : ム≦ミ、}: :' 乂::::イ/ { (  'ソ: : : ム≦ミ、}: :' 乂::::イ/  ハ: :ー{ (  'ソ: : : ム≦ミ、}: :' 乂::::イ/  ハ: :ー―`   /
     ゝへノ: : : :イ弋:::::::}ン  __  ̄   ゝへノ: : : :イ弋:::::::}ン  __  ̄   イノ: /.:ゝへノ: : : :イ弋:::::::}ン  __  ̄   イノ: /.:.、__/
     乂´:_: ィ介:、  ̄´rー ´   `ヽ/乂´:_: ィ介:、  ̄´rー ´   `ヽ/: /:.乂´:_: ィ介:、  ̄´rー ´   `ヽ/: /:.:.:.:.:.:.:/
        \ムイ: : 、    {     //: ∧\ムイ: : 、    {     //: ∧〉:.:.:.:\ムイ: : 、    {     //: ∧〉:.:.:.:.∧
       /:lヽヘ!: : :}>‐-ゝ、_ イ / : :{:.:/:lヽヘ!: : :}>‐-ゝ、_ イ / : :{:.:.:.:.:.:.//:lヽヘ!: : :}>‐-ゝ、_ イ / : :{:.:.:.:.:.:./i:i:iヽ
         {从{ .ノ : : l.:.:.:.:|:.{{:ゝ、/⌒ヽi: : 八:{从{ .ノ : : l.:.:.:.:|:.{{:ゝ、/⌒ヽi: : 八:.:.:.:.:.{{从{ .ノ : : l.:.:.:.:|:.{{:ゝ、/⌒ヽi: : 八:.:.:.:.:.{i:i:i:i:/
        /: : : :ノ `ヽト:.:、:.:.:ーヘ{: : : : ヽ:/: : : :ノ `ヽト:.:、:.:.:ーヘ{: : : : ヽ:.:.:.ヽ /: : : :ノ `ヽト:.:、:.:.:ーヘ{: : : : ヽ:.:.:.ヽ/
        .′ : イ    \:.\.:.:ヽ_〈:ヽ: : : :.′ : イ    \:.\.:.:ヽ_〈: ...┌─────────────────────┐
        {: : イ リ       \:.ヽ/  ヽ:.\: {: : イ リ       \:.ヽ/  ヽ.│  フロシャイム所属 戦闘員 シオニーちゃん   │
          :l           ー′   ーヘ:l           ー′  . └─────────────────────┘
          ヽ{                 ヽ{                    ヽ{


これが、


                      ヽ人_从人__从_从人__从人_人_从人__从人ノ
                     <                         >
          __          -‐<   ヒーーーーーーーーーーーッ!!    >__          -‐- 、
            /: :≠⌒ヽ、_ /∠二<                         >/: :≠⌒ヽ、_ /∠二ヽ〉_
        .' :/ . : :´: : :ヘ: : : :_:_: : : : Y⌒YW⌒Y⌒WW⌒⌒YW⌒Y⌒WY⌒⌒Y .' :/ . : :´: : :ヘ: : : :_:_: : : : `ヽ
         {: {/: : : : :〈: : V´: : : :`ヽ: : :ー={: {/: : : : :〈: : V´: : : :`ヽ: : :ー==ミ{: {/: : : : :〈: : V´: : : :`ヽ: : :ー==ミ、
        乂ゝ: : /: : ', : }: : : : : : : :\: : : '乂ゝ: : /: : ', : }: : : : : : : :\: : : '. ー:、 乂ゝ: : /: : ', : }: : : : : : : :\: : : '. ー:、 \
       /: :/ : : :′ : : :}: :|: : : : : : 、 : : \/: :/ : : :′ : : :}: :|: : : : : : 、 : : \: :∨ /: :/ : : :′ : : :}: :|: : : : : : 、 : : \: :∨ :}
       .′/ : : /: : : : : :! 八: : : : ノ: \ : .′/ : : /: : : : : :! 八: : : : ノ: \ : : >': .′/ : : /: : : : : :! 八: : : : ノ: \ : : >': 人 _
        {: イ : : /: : : : : :ノイ 小: /: : : : :≧{: イ : : /: : : : : :ノイ 小: /: : : : :≧ー= {: イ : : /: : : : : :ノイ 小: /: : : : :≧ー=彡'/⌒ヽ`:ー.、
     {__乂{: : /: : : :ナ个} :ー!_´≧xzz一{__乂{: : /: : : :ナ个} :ー!_´≧xzz一: < {__乂{: : /: : : :ナ个} :ー!_´≧xzz一: <´i} {⌒  _}\: :ヽ
     rーrヘ: :{: _:_イムイ !: :ムイ:::::::::} } `rーrヘ: :{: _:_イムイ !: :ムイ:::::::::} } `ト、: ンrーrヘ: :{: _:_イムイ !: :ムイ:::::::::} } `ト、: ン、_≧ーくヽ
      { (  'ソ: : : ム≦ミ、}: :' 乂::::イ/ { (  'ソ: : : ム≦ミ、}: :' 乂::::イ/  ハ: :ー{ (  'ソ: : : ム≦ミ、}: :' 乂::::イ/  ハ: :ー―`   /
     ゝへノ: : : :イ弋:::::::}ン  __  ̄   ゝへノ: : : :イ弋:::::::}ン  __  ̄   イノ: /.:ゝへノ: : : :イ弋:::::::}ン  __  ̄   イノ: /.:.、__/
     乂´:_: ィ介:、  ̄´rー ´   `ヽ/乂´:_: ィ介:、  ̄´rー ´   `ヽ/: /:.乂´:_: ィ介:、  ̄´rー ´   `ヽ/: /:.:.:.:.:.:.:/
        \ムイ: : 、    {     //: ∧\ムイ: : 、    {     //: ∧〉:.:.:.:\ムイ: : 、    {     //: ∧〉:.:.:.:.∧
       /:lヽヘ!: : :}>‐-ゝ、_ イ / : :{:.:/:lヽヘ!: : :}>‐-ゝ、_ イ / : :{:.:.:.:.:.:.//:lヽヘ!: : :}>‐-ゝ、_ イ / : :{:.:.:.:.:.:./i:i:iヽ
         {从{ .ノ : : l.:.:.:.:|:.{{:ゝ、/⌒ヽi: : 八:{从{ .ノ : : l.:.:.:.:|:.{{:ゝ、/⌒ヽi: : 八:.:.:.:.:.{{从{ .ノ : : l.:.:.:.:|:.{{:ゝ、/⌒ヽi: : 八:.:.:.:.:.{i:i:i:i:/
        /: : : :ノ `ヽト:.:、:.:.:Yーヘ{: : : : ヽ:/: : : :ノ `ヽト:.:、:.:.:Yーヘ{: : : : ヽ:.:.:.ヽ /: : : :ノ `ヽト:.:、:.:.:Yーヘ{: : : : ヽ:.:.:.ヽ/
        .′ : イ    \:.\.:.:ヽ_〈:ヽ: : : :.′ : イ    \:.\.:.:ヽ_〈: ...┌─────────────────────┐
        {: : イ リ       \:.ヽ/  ヽ:.\: {: : イ リ       \:.ヽ/  ヽ.│  フロシャイム所属 戦闘員 シオニーちゃん   │
          Y:l           ー′   ーヘY:l           ー′  . └─────────────────────┘
          ヽ{                 ヽ{                    ヽ{


このへんが化ける。

※このエントリは頑張ってfc2のフォーム直書きで作ってるので何とかなってます。つかいにきぃ…。

コレは……化けてる「Ⅵ」は、Shift_JISの0x8759のコードですね。俗に言う機種依存文字だな。これが0x870x59に泣き別れして、0x87は表現できないから潰れて、0x59はアルファベット半角大文字のYになった、と…。

これ何でだろー。
「Ⅵ」には対応するUTF-8のコードあるはずなんだけど、その変換がうまくいってないのかな?
他にも、同じくShift_JISの機種依存文字のアドレスにある0x8794の「∑」(「Σ」ではない)も問題おこすし……。

 

というわけで、そのへんに焦点を絞って調べてみました。


結果、EUCの「Ⅵ」をUTF-8に変換するさいに、UTF-8の「Ⅵ」である 0xE285 ではなく、Shift_JISの機種依存文字コードの「Ⅵ」である 0x8759 にしてしまっているんじゃないかと……。
つまり、文字コード変換系の問題ですね。

実際、現在使っている変換エンジンのJcode.pmではなく別の変換エンジン、具体的にはnkf やサクラエディッタ(ちょうど手元にあったので)を使って「Ⅵ」とだけ書かれたファイルをUTF-8に変換してみた/tmp/a.txt をバイナリダンプすると、

user@host:/tmp$ od -x -w16 -A x /tmp/a.txt
000000 85e2 0aa5
000004
user@host:/tmp$

このように、ちゃんと 0xE285になります。
(逆に見えるけど、i386アーキテクチャはリトルエンディアンだから、これで正しい)
で、手元のDATはUTF8なので、 0x8759 ではなく 0xE285 で保存されるのが正しいんですが……なぜか Shift_JIS の 0x8759 になってる。


ということは、ロボットがDATを持ってきて保存するさいの文字コード変換でしくってるのかな。

先に少し触れましたが、現在この文字コード変換を行っている処理系は、Perlの Jcode.pm です。

Jcode.pmは結構問題を抱えてるようで、たとえば私の把握している範囲ですと、DATを持ってきて文字コード変換かましたさいの「変換前文字コード」の解釈で結構ミスを犯します。
具体的には、元のコードが EUC_jp なので自動判別後の変換は EUC_jp→utf8 となるハズなのに、変換前コードを誤認して、binary とか ascii と判断するケースがかなり多いです。具体的には binary と判断するのが5~6%、asciiと判断するのが40~45%。精度が本当に酷い。

関係が強そうなので、NKF.pm に変えてみるとか、/usr/bin/nkf をパイプ起動してみるとか、EUC_jp のままストレージにためて Java 側で変換かけるとかやってみようと思います。




2012/08/22経過

文字コード変換を Jcode.pm から NKF.pm に変えてみたんですが、今度は別の化け方をするように。
化ける文字そのものは同じですねぇ。
これどーしたらいいんだろ。
EUCのまま使おうにも、外字エリアの文字だからミドルウェア側ではじかれてしまう。
機種依存文字をうまくマッピングしつつUTF-8に変換してくれるライブラリとか無いかなぁ。
PHPだとこんなことするとうまくマッピングしてくれるようなんですが、この機能だけ切り出したライブラリとか…。
ロボットを全部PHPで書き直すか、PHPでSJIS-winを意識した文字コード変換してくれるサーバでも作って文字コード変換処理をサーバに問い合わせるか。
うむむ……。

関連記事
[ 2012/08/20 18:26 ] 雑事 | TB(0) | CM(0)

コメントの投稿













管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://evevn.blog.fc2.com/tb.php/424-f53ba6c5


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。