Мне нужно пройти через один символ Python за один раз, но простой цикл "for" вместо меня дает кодовые единицы UTF-16:
str = "abc\u20ac\U00010302\U0010fffd"
for ch in str:
code = ord(ch)
print("U+{:04X}".format(code))
Что печатает:
U+0061
U+0062
U+0063
U+20AC
U+D800
U+DF02
U+DBFF
U+DFFD
когда я хотел:
U+0061
U+0062
U+0063
U+20AC
U+10302
U+10FFFD
Есть ли способ заставить Python дать мне последовательность кодов Unicode, независимо от того, как строка фактически закодирована под капотом? Я тестирую Windows здесь, но мне нужен код, который будет работать где угодно. Это нужно только для работы с Python 3, я не забочусь о Python 2.x.
Лучшее, что я смог придумать до сих пор, это:
import codecs
str = "abc\u20ac\U00010302\U0010fffd"
bytestr, _ = codecs.getencoder("utf_32_be")(str)
for i in range(0, len(bytestr), 4):
code = 0
for b in bytestr[i:i + 4]:
code = (code << 8) + b
print("U+{:04X}".format(code))
Но я надеюсь, что там будет более простой способ.
(Педантичная nitpicking над точной терминологией Юникода будет беспощадно избита по голове ключом к четырем. Я думаю, что я дал понять, что я здесь, пожалуйста, не тратьте время на пробелы с помощью "но UTF -16 является технически Unicode слишком" аргументом".