2016-05-04 8 views
1

二重コード化されたUTF-8キャラクタを構成するように見えるとき、私はXMLファイルを持っています。進ダンプ、その後、例えば「Gesch ....フィート」の部分はGeschäftする必要があります:UTF-8の二重コード化されたXMLファイルを修正する方法

00009f0: 4365 6c6c 3e3c 4861 7368 4365 6c6c 3e3c Cell><HashCell>< 
0000a00: 5374 7220 7661 6c75 653d 2253 746f 7265 Str value="Store 
0000a10: 735f 4d65 6e75 222f 3e3c 5374 7220 7661 s_Menu"/><Str va 
0000a20: 6c75 653d 2247 6573 6368 c383 c2a4 6674 lue="Gesch....ft 
0000a30: 6522 2f3e 3c2f 4861 7368 4365 6c6c 3e3c e"/></HashCell>< 
0000a40: 4861 7368 4365 6c6c 3e3c 5374 7220 7661 HashCell><Str va 

私は、UTF-8エンコードされた二重のデータベース、ファイル名またはデータ・ストリームを修正するためにかなりの数の方法を発見しました。しかし、私はプレーンテキストやXMLファイルの修正に何も見つかりませんでした。

+1

え:それをデコードしますか? – wildplasser

+0

どうすればいいですか?どのツールを使用するのですか?どのパラメータを使用するのですか? - 答えていない、私はそれを自分で考え出した。 – Martin

+1

私はそれに取り組んでいた...ちょうどそれを解読する(1と2バイトのシーケンスだけを仮定して) – wildplasser

答えて

0

私はUNIX™でそれを行う方法を考え出しました。 Z-シェルスクリプトに次の4行は、それをするためにします:

#!/bin/zsh 
setopt No_Err_Exit 
iconv -f "UTF-8" -t "ISO-8859-1" "${1}" >"${1}.new" 
mv "${1}"  "${1}.old" 
mv "${1}.new" "${1}" 
0

はダブルエンコーディングのみ、(あなたは、このためのチェックを追加することができます)間に合わせ&を2バイトのUTF8-シーケンスが得られると仮定すると:

#include <stdio.h> 
int main (void) 
{ 
int state,ch; 
unsigned val; 

for(state = 0; ; ) { 
    ch = getc(stdin); 
    if (ch==EOF) break; 
    switch(state) { 
    case 0: 
      if ((ch & 0xe0) == 0xc0) { 
        val = (ch & 0x1f) << 6; 
        state = 1; 
        } 
      else putc(ch, stdout); 
      break; 
    case 1: 
      val |= (ch & 0x3f); 
      putc(val, stdout); 
      state = 0; 
      break; 
      } 
    } 
return 0; 
} 

これは、結果のバイトが有効なコードポイントであれば何もチェックがないというさらなる利点を有する(それができない必要がある) 結果:


$ ./a.out <gesel.in> gesel.out 
$ hexdump -C gesel.in 
00000000 47 65 73 65 6c c3 83 c2 a4 66 74 65 0a   |Gesel....fte.| 
0000000d 
$ hexdump -C gesel.out 
00000000 47 65 73 65 6c c3 a4 66 74 65 0a     |Gesel..fte.| 
0000000b 
0

これはISO-8859-1としてデコードされたUTF-8ファイルで、UTF-8でエンコードされたUTF-8ファイルです。あか。 Mojibake。 Pythonでこれを修正するには

は行います

import io 
with io.open('mojibake.xml', 'r+', encoding='utf-8') as mojibaked_input_file: 
    input_baked = mojibaked_input_file.read() 
    # Reverse the wrong interpretation 
    input_fixed = input_baked.encode('latin1').decode('utf-8') 

    mojibaked_input_file.seek(0) 
    mojibaked_input_file.truncate() 
    mojibaked_input_file.write(input_fixed) 
関連する問題