2017-02-01 3 views
2

Я построил вопрос, отвечающий за приложение с точки зрения ресторанов во Вьетнаме, используя Python для Windows. Для написания вьетнамских символов мне нужно использовать Unicode.
Во-первых, я клонировал данные с сайта TripAdvisor, который использовал HTML charset = utf-8 и создал мою базу данных Mongo. Город под названием «Джа Нанг» в TripAdvisor имеет код:Одно и то же слово, но разные символы юникода

>>> print repr("đà nẵng")  # from tripadvisor website 
>>> '\xc4\x91a\xcc\x80 n\xc4\x83\xcc\x83ng' 

Однако, когда я запрос в адресной строке браузера Firefox, город «Джа Нанг» имеет код:

>>> print repr("đà nẵng") # Firefox's address bar 
>>> '\xc4\x91\xc3\xa0 n\xe1\xba\xb5ng' 

То есть причина, по которой я не могу найти этот город в моей базе данных. Я стараюсь писать это название города на Notepad ++ и получил тот же результат, используя адресную строку Firefox,

>>> print repr("đà nẵng") # notepad++ using 'Encoding UTF-8' 
>>> '\xc4\x91\xc3\xa0 n\xe1\xba\xb5ng' 

Есть ли способ преобразования между двумя типами коды?
Или есть ли способ сопоставить название города «đà nẵng» с разными кодами в этом случае ?.

+0

Попробуйте использовать str («đà nẵng», 'utf-8') – Nether

+0

@Nether 1) это не проблема 2), которая будет расшифровывать только, если ваш терминал UTF-8 или ваша кодировка кода UTF-8 –

ответ

5

Проблема, с которой вы сталкиваетесь, заключается в том, что unicode позволяет несколько способов составить один и тот же символ. Модуль Python unicodedata обеспечивает функцию normalize, которая позволяет конвертировать юникод представление в фиксированный form (например, NFC)

from unicodedata import normalize 

S1 = b'\xc4\x83\xcc\x83'.decode('UTF-8') 
S2 = b'\xe1\xba\xb5'.decode('UTF-8') 

print(normalize('NFC', S1).encode('UTF-8')) 
print(normalize('NFC', S2).encode('UTF-8')) 

В вашем примере отображается в TripAdvisor NFD форме, в то время как блокнот используется NFC.

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