Как добавить «\u» в строку и преобразовать ее в utf-16 в Python?

Я пытаюсь прочитать текст 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.

Если данные, которые вам отправляются, представляют собой фактический текст этих чисел, как вы показали, то добавление \u не будет иметь никакого эффекта. Вам нужно будет взять каждое четырехзначное число и преобразовать его в двоичное представление индивидуально. Затем вы можете построить строку Unicode из преобразованных чисел.

OldBoy 16.06.2024 14:00
re.sub(r"[0-9a-f]{4}", lambda x: chr(int(x[0], 16)), string) => سلام به همگی. Это ожидаемый результат?
Dogbert 16.06.2024 15:02

Точно… 👍 большое спасибо

Kaveh Kavianpour 16.06.2024 15:04

Как должны быть закодированы эти символы Юникода? Откуда вы знаете, что «06280647» — это символы в кодировке UTF-16, а не реальная строка чисел?

gre_gor 16.06.2024 16:03

Скорее всего, вам нужно правильно прочитать файл, чем создавать строковые литералы Python на основе того, что вы сейчас читаете.

chepner 16.06.2024 16:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Было бы лучше, если бы вы попытались преобразовать шестнадцатеричную строку в соответствующие байты с последующей декодировкой 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 уже игнорирует встроенные пробелы.

ShadowRanger 16.06.2024 15:19

Для получения правильных результатов следует использовать utf-16be.

interjay 16.06.2024 15:29

Вы тестировали свой код? Он производит '㌆䐆✆䔆⠆䜆䜆䔆꼆찆', который отличается от 'سلام به همگی', который равен '\u0633\u0644\u0627\u0645 \u0628\u0647 \u0647\u0645\u06af\u06cc'.

gre_gor 16.06.2024 15:58
Ответ принят как подходящий

Использование комбинации модулей

  • 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

Другие вопросы по теме