Преобразовать Unicode в байтовую кодировку младшего разряда, не зависящую от языка? - PullRequest
0 голосов
/ 08 ноября 2011

Каков наилучший способ (без потерь) конвертировать Unicode в байтовую кодировку младшего разряда (8 бит), не зависящую от языка?Мне нужен формат, который является стандартным, то есть имеет широкую поддержку библиотек для преобразования в обоих направлениях.

Если бы я использовал Python, я бы использовал repr:

In [1]: x = u"Российская Федерация"

In [2]: repr(x)
Out[2]: "u'\\xd0\\xa0\\xd0\\xbe\\xd1\\x81\\xd1\\x81\\xd0\\xb8\\xd0\\xb9\\xd1\\x81\\xd0\\xba\\xd0\\xb0\\xd1\\x8f \\xd0\\xa4\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd1\\x80\\xd0\\xb0\\xd1\\x86\\xd0\\xb8\\xd1\\x8f'"

Однако я смотрюдля формата, который имеет хорошую поддержку библиотеки для преобразования второй строки обратно в первую на разных языках.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Out [2]: "u '\ xd0 \ xa0 \ xd0 \ xbe \ xd1 \ x81 \ xd1 \ x81 \ xd0 \ xb8 \ xd0 \ xb9 \ xd1 \ x81 \ xd0 \ xba \ xd0 \ xb0 \ xd1 \" x8f \ xd0 \ xa4 \ xd0 \ xb5 \ xd0 \ xb4 \ xd0 \ xb5 \ xd1 \ x80 \ xd0 \ xb0 \ xd1 \ x86 \ xd0 \ xb8 \ xd1 \ x8f '"

Если это то, что вы видите, ваш терминал настроен неправильно, он обрабатывает вход UTF-8 как ISO-8859-1 (или cp1252 в случае консоли Windows, которую невозможно правильно настроить) .

Правильное представление Python для Российская Федерация будет литералом Unicode:

u'\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0430\u044f \u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f'

Что довольно близко к строковому литералу JavaScript / JSON

"\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0430\u044f \u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f"

Если вы хотите 7-битно-безопасное (ASCII) представление строки Unicode, JSON является разумным выбором формата. Получите его, используя json.dumps(), а не взламывая Python repr, поскольку между этими двумя форматами есть некоторые тонкие несоответствия.

Другие хорошо понятные представления ASCII, которые вы можете попробовать, могут включать URL-кодировку (%D0%A0%D0%BE...) и экранирование символов XML (<value>&#x0420;&#x043e;&#x0441;...</value>).

Если вам нужно только произвольное двоичное представление, которое не обязательно должно быть 7-битным безопасным, как упоминал Макс, просто .encode('utf-8').

2 голосов
/ 08 ноября 2011

UTF-8, UTF-16 и UTF-32 являются стандартными.Возможно, UTF-8 наиболее распространен в Интернете;UTF-16 используется внутри Windows и Java.Любой язык с поддержкой Unicode будет иметь функции кодирования и декодирования для всех из них.В Python вы можете использовать метод .encode строк Юникода и метод .decode строк для преобразования между ними.

Если вам нужно что-то чистое 7-битное (не установлено 8-й бит), есть также UTF-7.

...