2017-10-16 61 views
0

我嘗試讀取python中'euc-kr'編碼的一些韓文文件,但是出現了一些錯誤。在對encodings模塊進行了一段時間的檢查之後,我瞭解到這個模塊對韓文字符的編碼看起來很奇怪。讓我舉一個例子Python用euc-kr編碼(編解碼器,編碼模塊)以意想不到的方式編碼(韓文)字符

韓文字符(這是一個很少使用的字符,但我需要這個發音)應該根據EUC-KR規範進行編碼,以B5 6E(我指this site)。但是編碼模塊給了我不同的結果。

# 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 6Eeuc_kr.codec.encode給我,比我預期的要長字節。我不知道那裏發生了什麼。當我解碼B5 6E(以及許多其他韓語字符)時,如何避免產生錯誤?有沒有關於EUC-KR規範的另一個文檔,我可以閱讀它以瞭解EUC-KR的python實現如何工作?

+1

是的,那很奇怪。我不熟悉euc編碼,但我不明白爲什麼'euc_kr.codec.encode('탙')'產生這麼多的字節,當euc_kr應該用1或2個字節編碼每個代碼點。順便說一句,你不需要使用'euc_kr.codec.encode(s)',你可以做's.encode('euc_kr')'。 –

回答

1

它看起來像euc_kr結果是某種分解。你可以嘗試cp949,它根據Wikipedia

Windows的默認朝鮮代碼頁(代碼頁949)是EUC-KR的專利,但向上兼容擴展...

一些試驗:

>>> 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

非常感謝。現在一切都很清楚。爲了您的信息,每個韓文字符由chosung,joongsung(和jongsung可選)組成,但是語法不允許這三種可能的組合。例如在'탓'和'탇'中,韓語語法只允許'탓'作爲有效的韓語字符。 但有些情況下可以使用不規則的韓文字符,如發音符號。實際上,在發音符號系統中,'탓'無效,但'탇'是。 –

相關問題