Является ли это лучшим способом обеспечить кодировку "строки" юникода python в utf-8? - PullRequest
6 голосов
/ 15 марта 2011

В произвольной «строке» из библиотеки, которую я не могу контролировать, я хочу убедиться, что «строка» относится к типу Unicode и закодирована в utf-8. Я хотел бы знать, если это лучший способ сделать это:

import types

input = <some value from a lib I dont have control over>

if isinstance(input, types.StringType):
    input = input.decode("utf-8")
elif isinstance(input, types.UnicodeType):
    input = input.encode("utf-8").decode("utf-8")

В моем собственном коде я обертываю это в try / исключением и обрабатываю ошибки, но я пропустил эту часть.

Ответы [ 4 ]

5 голосов
/ 15 марта 2011

Объект Unicode не закодирован (это внутренне, но это должно быть прозрачно для вас как пользователя Python).Строка input.encode("utf-8").decode("utf-8") не имеет особого смысла: вы получаете точно такую ​​же последовательность символов Юникода в конце, что и в начале.

if isinstance(input, str):
    input = input.decode('utf-8')

- это все, что вам нужно для обеспечения того, чтобы объекты str (байтстроки) преобразуются в строки Юникода.

2 голосов
/ 15 марта 2011

Я думаю, что вы неправильно понимаете Unicode и кодировки. Символы Юникода - это просто цифры. Кодировки - это представление чисел. Думайте о символах Юникода как о пятнадцати понятиях, а о кодировках 15, 1111, F, XV. Вы должны знать кодировку (десятичную, двоичную, шестнадцатеричную, римскую цифры), прежде чем сможете декодировать кодировку и «знать» значение Unicode.

Если у вас нет контроля над входной строкой, ее трудно преобразовать во что-либо. Например, если входные данные были прочитаны из файла, вам необходимо знать кодировку текстового файла в decode, то есть в значении Unicode, а затем encode в UTF-8 для вашей библиотеки C ++.

2 голосов
/ 15 марта 2011

Просто;

try:
    input = unicode(input.encode('utf-8'))
except ValueError:
    pass

Всегда лучше искать прощения, чем просить разрешения.

0 голосов
/ 15 марта 2011

Вы уверены, что хотите, чтобы последовательность в кодировке UTF-8 сохранялась в типе Unicode? Обычно Python хранит символы в типах.UnicodeType, используя UCS-2 или -4, что иногда называют «широкими» символами, которые должны содержать символы из всех достаточно распространенных сценариев.

Интересно, что это за библиотека, которая иногда выводит types.StringType, а иногда types.UnicodeType. Если бы я сделал неверное предположение, библиотека всегда создает type.StringType, но не сообщает, в какой кодировке она находится. Если это так, вы на самом деле ищете код, который может угадать, в какой кодировке закодирован type.StringType. а.

В большинстве случаев это легко, так как вы можете предположить, что это либо, например, латинский-1 или UTF-8. Если текст может быть в любой нечетной кодировке (например, входящая почта без правильного заголовка), вам нужна библиотека, которая угадывает кодировку. Смотри http://chardet.feedparser.org/.

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