Преобразование одного символа Unicode в символ ASCII - PullRequest
0 голосов
/ 09 июня 2018

Я получил Unicode, например, "00C4", сохраненный в массиве.Я хочу заменить заполнитель, например, "\ A25" в тексте на значение ascii юникода из массива, который имеет только значение юникода.Я попробовал все, начиная от кодирования, декодирования, необработанных строк, строк в Юникоде и различных настроек с escape-символом «\».Проблема здесь заключается в том, что я не могу написать в коде «\ u1234», я должен использовать значения массива и объединить их с чем-то вроде «\ u».Это мой текущий код:

например, prototypeArray [i] [1] = 00C4

Например, prototypeArray [i] [0] = A25

unicodeChar = u'\\u' + prototypeArray[i][1]
placeholder = '\\' + prototypeArray[i][0]
placeholder = u'' + placeholder
text = text.replace(placeholder,s)

В настоящее время этозаменяя, например, \ A25 на \ u00C4 в тексте.Символ Юникод не интерпретируется как таковой.

1 Ответ

0 голосов
/ 09 июня 2018

Специальная интерпретация UTF-8: Я предполагаю, что у вас есть точка Unicode, представленная в шестнадцатеричном формате в UTF-8, хранящаяся в виде строки в переменной (c).И вы хотите определить соответствующий символ.Затем следующий фрагмент кода показывает, как это сделать:

>>> import binascii
>>> cp2chr = lambda c: binascii.unhexlify(c.zfill(len(c) + (len(c) & 1))).decode('utf-8')
>>> cp2chr('C484')
'Ą'

Объяснение: zfill добавляет ноль, если число символов нечетное.binascii.unhexlify в основном принимает два символа каждый, интерпретирует их как шестнадцатеричные числа и делает их одним байтом.Все эти байты объединяются в массив байтов.Наконец, str.decode('utf-8') интерпретирует эти байты как данные в кодировке UTF-8 и возвращает их как строку.

>>> cp2chr('00C4')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 1: unexpected end of data

Однако приведенный вами пример не является действительными данными UTF-8.См. Таблица структуры байтов UTF-8 в Википедии , чтобы определить действительные последовательности байтов.C4 имеет битовую структуру 11000100, поэтому является байтом продолжения и впоследствии требует другого символа.

Кодирование независимой интерпретации: Таким образом, вы можете искать интерпретацию точек Unicode независимо откодирование.Затем вы ищете кодировку raw_unicode_escape:

>>> cp2chr = lambda c: (b'\\u' + c.encode('ascii')).decode('raw_unicode_escape') 
>>> cp2chr('00C4')
'Ä'

Объяснение: raw_unicode_escape преобразует escape-последовательности Юникода, заданные в байтовой строке, и возвращает ее в виде строки: b'\\u00C4'.decode('raw_unicode_escape')дает Ä.Это то, что Python делает внутренне, если вы пишете \uSOMETHING в своем исходном коде.

...