Я пытаюсь прочитать текст utf-16 из модуля GSM (Sim800 L). Это дает мне:
0633064406270645 06280647 0647064506af06cc
Скорее, чем :
\u0633\u0644\u0627\u0645 \u0628\u0647 \u0647\u0645\u06af\u06cc
Я пробовал много способов добавить «\u» к первой строке или даже преобразовать ее в байты, но каждый раз Python распознает их как настоящие символы ascii.
Например:
> Str=r’\u’ + Str
Result: \\u633064406270645 06280647 0647064506af06cc
И из-за двойной обратной косой черты питон не распознает его как utf-16.
Я ищу любой метод преобразования вывода модуля GSM в Unicode.
re.sub(r"[0-9a-f]{4}", lambda x: chr(int(x[0], 16)), string) => سلام به همگی. Это ожидаемый результат?
Точно… 👍 большое спасибо
Как должны быть закодированы эти символы Юникода? Откуда вы знаете, что «06280647» — это символы в кодировке UTF-16, а не реальная строка чисел?
Скорее всего, вам нужно правильно прочитать файл, чем создавать строковые литералы Python на основе того, что вы сейчас читаете.






Было бы лучше, если бы вы попытались преобразовать шестнадцатеричную строку в соответствующие байты с последующей декодировкой UTF-16.
hexdec_str = "0633064406270645 06280647 0647064506af06cc"
byte_data = bytes.fromhex(hexdec_str.replace(' ', ''))
unicode_str = byte_data .decode('utf-16')
Надеюсь, вы сможете получить читаемую строку Unicode указанным выше методом.
Однако при этом теряются пробелы, что является своего рода проблемой. Если бы это было правильное поведение, вам все равно не понадобился бы .replace(' ', ''); bytes.fromhex уже игнорирует встроенные пробелы.
Для получения правильных результатов следует использовать utf-16be.
Вы тестировали свой код? Он производит '㌆䐆✆䔆⠆䜆䜆䔆꼆찆', который отличается от 'سلام به همگی', который равен '\u0633\u0644\u0627\u0645 \u0628\u0647 \u0647\u0645\u06af\u06cc'.
Использование комбинации модулей
re (замените любую шестнадцатеричную четверку подходящим символом) иjson (правильно обращаться с суррогатными парами).Примечание. В жестко закодированную строку добавлена допустимая суррогатная пара (D83DDE0E), а также несимвольная (FFFE), просто в целях отладки:
import re
import json
def repl_unicode( matchobj):
mo_int = int( matchobj.group(0), 16)
return chr( mo_int)
text_16 = '0633064406270645 06280647 0647064506af06cc D83DDE0E FFFE'
pattern = '[0-9A-Za-z]{4}'
text_u8 = json.loads( json.dumps( re.sub( pattern, repl_unicode, text_16)))
print( text_16)
print( text_u8)
print( json.dumps( text_u8, ensure_ascii=True).strip('"'))
Вывод: .\SO\78628940.py
0633064406270645 06280647 0647064506af06cc D83DDE0E FFFE سلام به همگی 😎 \u0633\u0644\u0627\u0645 \u0628\u0647 \u0647\u0645\u06af\u06cc \ud83d\ude0e \ufffe
Если данные, которые вам отправляются, представляют собой фактический текст этих чисел, как вы показали, то добавление
\uне будет иметь никакого эффекта. Вам нужно будет взять каждое четырехзначное число и преобразовать его в двоичное представление индивидуально. Затем вы можете построить строку Unicode из преобразованных чисел.