Мне нужно пройти по строке 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))
Но я надеюсь, что есть более простой способ.
(Педантичные придирки к точной терминологии Unicode будут безжалостно избиты по голове ключом к четырем. Я думаю, я ясно дал понять, что я 'm после этого, пожалуйста, не тратьте место с аргументами "но UTF-16 - это тоже технически Unicode".