2-байтовая строка Python, не закодированная в utf-8 - PullRequest
0 голосов
/ 02 июня 2019

Я поддерживаю API, который может получать ввод текста с нескольких языков.Мы бы хотели, чтобы кодировка строки была в utf-8.

Большинство решений, которые пробовали предыдущие разработчики, включали в себя использование функции кодирования и декодирования.Это просто приводит к путанице в не поддерживаемом коде.

Для простоты я просто определяю x здесь, но давайте представим, что это можно отправить моему API.Эта строка закодирована в latin-1

x = '\xe9toile' # x is a byte string in python 2
x.encode('utf-8')

, что приводит к

*** UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

Единственный известный мне способ кодирования ее в utf-8 - это сначала декодировать ее как latin-1 затем сделайте кодировку.

x.decode('latin-1')
>>u'\xe9toile'
(x.decode('latin-1')).encode('utf-8')
>>'\xc3\xa9toile'

Что если бы я не знал, что строка байтов была закодирована в latin-1, как бы я смог закодировать ее в utf-8?

Что бы я сделал, если x это китайская кодировка, которую я не знаю?

x = '\u54c8\u54c8'

x - это всегда строка байтов.Любая помощь будет оценена.

1 Ответ

1 голос
/ 02 июня 2019

Если x является байтовой строкой, вам не имеет смысла ее кодировать.Текстовые кодировки - это способ представления текста в байтах.Сначала вы должны превратить ваши байты в текст, расшифровав их, а затем кодировать этот текст в целевую кодировку.

Что если бы я не знал, что строка байтов была закодирована в latin-1 как бы ябыть в состоянии закодировать его в utf-8?

Вы можете попытаться угадать кодировку, но не всегда можете быть правы:

>>> 'Vlh'.encode('cp037')
'\xe5\x93\x88'
>>> '哈'.encode('utf-8')
'\xe5\x93\x88'

Этот пример немного надуманно нет никакого способа узнать, представляют ли байты '\xe5\x93\x88' или Vlh, если вы не знаете оригинальную кодировку.

Наиболее разумным решением было бы просто сделать так, чтобы ваши клиенты кодировали свой текст как UTF-8, а затем вы декодируете полученные байты как UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...