2016-05-31 1 views
0

У меня есть переменная, содержащая значение, подобное x='مصطفى', и я хочу преобразовать его в форму u'مصطفى' пользователю снова в некоторых функциях .. когда я пытаюсь сделать u''+x это alawys дает мне ошибку :Unicode arabic string для пользователя

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128) 

Любая помощь?

+0

Что является источником для 'x' bytestring? (вы читаете его из файла? получать из сети?). Вы должны преобразовать его в Unicode, как только вы его получите в своей программе (с использованием соответствующей кодировки символов, которая зависит от того, откуда это происходит). – jfs

ответ

1

Там две вещи.

Вначале значение x='مصطفى' не определено и изменяется, если вы сохраняете исходный файл в другой кодировке. С другой стороны, x=u'مصطفى'.encode('utf-8') однозначно означает «байты, которые вы получаете при кодировании этого текста с помощью UTF-8».

Во-вторых, либо использовать байты 'abc' или b'abc' или юникода u'abc', но не смешивать их. Смешивание их в python 2.x дает результаты, зависящие от того, где вы выполняете этот код. В python 3.x он вызывает ошибку (по уважительным причинам).

Так дали байт строку x, либо:

# bytes 
'' + x 

или:

# unicode, so decode the byte string 
u'' + x.decode('utf-8') 
1

спасибо Я решил это :)

решение будет сделать так

u''.encode('utf-8')+x 
+1

Нет, это плохо. Прочитайте руководство по Unicode: https://docs.python.org/2/howto/unicode.html – roeland

+0

Также обратите внимание, что 'u ''. Encode ('utf-8')' == '''' – roeland

2

Вы должны знать, что кодирующая эти байты находятся, и их .decode(encoding) их, чтобы получить строку Unicode. Если вы получили их от некоторого API, utf8 - хорошая догадка. Если вы читаете байты из файла, напечатанного в Windows Notepad, скорее всего, это арабская (?) Кодовая страница.

PythonWin 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32. 
>>> x='مصطفى' # "Just bytes" in whatever encoding my console uses 
>>> x   # Looks like UTF-8. 
'\xd9\x85\xd8\xb5\xd8\xb7\xd9\x81\xd9\x89' 
>>> x.decode('utf8') # Success 
u'\u0645\u0635\u0637\u0641\u0649' 
>>> print(x.decode('utf8')) 
مصطفى 

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

  • Нет связанных вопросов^_^