2017-10-16 26 views
0

pythonで 'euc-kr'でエンコードされた韓国語のテキストファイルを読み込もうとしました。 encodingsモジュールをしばらく調べた後、私はこのモジュールが韓国文字を一見非常に奇妙な方法でエンコードしていることを知りました。私は言及私はPythonはeuc-krエンコーディング(コーデック、エンコーディングモジュール)で予期しない方法で(韓国語)文字を符号化します

韓国語の文字が(これはほとんど使われない文字ですが、私は、発音辞書のためにこれを必要とする)(EUC-KRの仕様に応じてB5 6Eに符号化されることになっている例を見てみましょうthis site)。しかし、encodingsモジュールは私に多少異なる結果をもたらします。あなたが見ることができるように、私はB5 6Eeuc_kr.codec.encodeは私が予想より長くバイトを与える解読しようとすると、

# python3 
>> from encodings import euc_kr 
>> euc_kr.codec.decode(b'\xB5\x6E') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'euc_kr' codec cant decode byte 0xb5 in position 0: illegal multibyte sequence 
>> euc_kr.codec.encode('탙') 
(b'\xa4\xd4\xa4\xbc\xa4\xbf\xa4\xbc', 1) 

は、私はエラーを取得します。私はそこに何が起こっているのか分からない。 B5 6E(および他の多くの韓国語の文字)をデコードすると、エラーを発生させないようにするにはどうすればよいですか? EUC-KRの仕様に関するもう1つの文書は、PythonのEUC-KR実装の仕組みを理解するために読むことができますか?

+1

はい、それは奇妙です。私はeucのエンコーディングに精通していませんが、euc_krが1バイトまたは2バイトで各コードポイントをエンコードすると仮定すると、なぜeuc_kr.codec.encode( '탙') 'が非常に多くのバイトになるのか理解できません。ところで、 'euc_kr.codec.encode(s)'を使う必要はありません。単に 's.encode( 'euc_kr')'を実行するだけです。 –

答えて

1

euc_krのような結果が分解されているようです。

Windowsのデフォルト韓国語のコードページ(コードページ949)EUC-KRの専有が、上位互換の拡張機能です...

いくつかの実験:あなたは応じWikipediacp949を、試してみてください:

>>> s = '탇' 
>>> ud.name(s) 
'HANGUL SYLLABLE TAD' 
>>> s.encode('euc_kr') 
b'\xa4\xd4\xa4\xbc\xa4\xbf\xa4\xa7' 
>>> s.encode('euc_kr').decode('cp949') 
'ㅤㅌㅏㄷ' 
>>> for c in s.encode('euc_kr').decode('cp949'): 
...  print(ud.name(c)) 
...  
HANGUL FILLER 
HANGUL LETTER THIEUTH 
HANGUL LETTER A 
HANGUL LETTER TIKEUT 
>>> s.encode('cp949').hex() 
'b56e' 
+1

ありがとうございました。今私にはすべてが分かります。あなたの情報のために、それぞれの韓国人のキャラクターは、朝鮮、中宗(そして、オプションでジョンソン)で構成されていますが、文法はこれらの組み合わせをすべて可能にしていません。例えば、 '탓'や '탇'のうち、韓国語の文法では有効な韓国語の文字として '탓'しか許されません。 しかし、発音記号のように、不規則な韓国文字が許される場合もあります。実際、発音記号システムでは '탓'は有効ではありませんが、 '탇'は有効です。 –

関連する問題