2016-11-04 16 views
0

питона скрипт сбой при попытке кодировать предполагаемую utf-8 строку в iso-8859-1:Как узнать кодировку символов?

>>> 'à'.encode('iso-8859-1') 
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0300' in position 1: ordinal not in range(256) 

Как знать, которым Кодировку этот персонаж? Когда кодировать его в UTF-8:

>>> 'à'.encode('utf-8') 
b'a\xcc\x80' 

a затем \xcc\x80. Я могу собрать \xcc\x80 в http://www.utf8-chartable.de/unicode-utf8-table.pl?start=768&names=-&utf8=string-literal таблице utf8.

Но это utf-8? Если это utf-8, почему 'à'.encode('utf-8') не может кодировать эту строку в iso-8859-1?

ответ

0

Немного непонятно, откуда берется символ 'à'. Фактически, это combining character sequence, и вам нужно normalize. Следующий питон скрипт использует unicodedata module самостоятельно объяснить и решить ваши вопросы:

import sys, platform 
print (sys.stdout.encoding, platform.python_version()) 
print() 

import unicodedata 
agraveChar='à'  # copied from your post 
agraveDeco='à'  # typed as Alt+0224 (Windows, us keyboard) 

# print Unicode names 
print ('agraveChar', agraveChar, agraveChar.encode('utf-8')) 
for ins in range(0, len(agraveChar)): 
    print (agraveChar[ins], unicodedata.name(agraveChar[ins], '???')) 

print ('agraveDeco', agraveDeco, agraveDeco.encode('utf-8')) 
for ins in range(0, len(agraveDeco)): 
    print (agraveDeco[ins], unicodedata.name(agraveDeco[ins], '???')) 


print ('decomposition(agraveChar)', unicodedata.decomposition(agraveChar)) 
print ('\nagraveDeco normalized:\n') 
print ("NFC to utf-8", unicodedata.normalize("NFC" , agraveDeco).encode('utf-8')) 
print ("NFC to latin", unicodedata.normalize("NFC" , agraveDeco).encode('iso-8859-1')) 
print ("NFKC to utf-8", unicodedata.normalize("NFKC", agraveDeco).encode('utf-8')) 
print ("NFKC to latin", unicodedata.normalize("NFKC", agraveDeco).encode('iso-8859-1')) 

Выход:

==> D:\test\Python\40422359.py 
UTF-8 3.5.1 

agraveChar à b'\xc3\xa0' 

à LATIN SMALL LETTER A WITH GRAVE 

agraveDeco à b'a\xcc\x80' 

a LATIN SMALL LETTER A 
̀ COMBINING GRAVE ACCENT 

decomposition(agraveChar) 0061 0300 

agraveDeco normalized: 

NFC to utf-8 b'\xc3\xa0' 
NFC to latin b'\xe0' 
NFKC to utf-8 b'\xc3\xa0' 
NFKC to latin b'\xe0' 

==> 
Смежные вопросы