Python windows 1251 to utf

Как преобразовать строку из CP-1251 в UTF-8?

Я использую мутаген для преобразования данных тегов ID3 из CP-1251 / CP-1252 в UTF-8. В Linux нет проблем. Но в Windows вызов SetValue() в wx .TextCtrl выдает ошибку:

UnicodeDecodeError: кодек ascii не может декодировать байт 0xc3 в позиции 0: порядковый номер не в диапазоне (128)

Исходная строка (предположительно в кодировке CP-1251), которую я извлекаю из мутагена, :

Я пытался преобразовать это в UTF-8:

. и даже изменив кодировку по умолчанию с ASCII на UTF-8:

. Но я получаю ту же ошибку.

5 ответов

Если вы точно знаете, что у вас есть вход cp1251, вы можете сделать

Я потерял половину дня, чтобы найти правильный ответ. Так что если вы получили какую-то строку юникода из внешнего источника в кодировке windows-1251 (с веб-сайта в моей ситуации), вы увидите в консоли Linux что-то вроде этого:

U ‘u043a \ u043c \ u043d \ u0442 \ u043d \ u044f \ u043a \ u0432 \ u0430 \ u0440 \ u0442 \ u0438 \ u0440 \ u0430 . ‘

Это неверное представление ваших данных в Юникоде. Итак, Тим Пицкер прав. Вы должны кодировать () сначала его, затем декодировать (), а затем кодировать снова, чтобы исправить кодировку.

Так что в моем случае эта странная строка была сохранена в переменной «текст», и строка:

«Своя 2-х комнатная квартира с отличным ремонтом . «

Да, это тоже сводит меня с ума. Но это работает!

Постскриптум Сохранение в файл вы должны сделать так же.

Ваша строка d является строкой Unicode, не строкой в кодировке UTF-8! Так что вы не можете decode() это сделать, вы должны encode() передать его в UTF-8 или в любую другую кодировку, которая вам нужна.

(это то, что вы должны делать в самом конце всей обработки, когда вам нужно сохранить его как файл в кодировке UTF-8, например).

Если ваш ввод в другой кодировке, то все наоборот:

Если d является правильной строкой Юникода, то d.encode(‘utf-8’) возвращает закодированную строку UTF-8. Не проверяйте его, печатая, хотя, возможно, он просто не отображается должным образом из-за shenanigans кодовой страницы.

Я бы предпочел добавить комментарий к ответу Александра Степаненко, но моя репутация пока не позволяет этого. У меня была похожая проблема с преобразованием тегов MP3 из CP-1251 в UTF-8, и решение кодирования / декодирования / кодирования работало для меня. За исключением того, что мне пришлось заменить первую кодировку на «latin-1», которая по существу преобразует строку Unicode в последовательность байтов без реального кодирования:

И для сохранения с использованием, например, мутагена его не нужно кодировать:

How to convert a string from CP-1251 to UTF-8?

I’m using mutagen to convert ID3 tags data from CP-1251/CP-1252 to UTF-8. In Linux there is no problem. But on Windows, calling SetValue() on a wx.TextCtrl produces the error:

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc3 in position 0: ordinal not in range(128)

The original string (assumed to be CP-1251 encoded) that I’m pulling from mutagen is:

Читайте также:  Создание своего linux ядра

I’ve tried converting this to UTF-8:

. and even changing the default encoding from ASCII to UTF-8:

. But I get the same error.

6 Answers 6

If you know for sure that you have cp1251 in your input, you can do

Your string d is a Unicode string, not a UTF-8-encoded string! So you can’t decode() it, you must encode() it to UTF-8 or whatever encoding you need.

(which is something you’d do at the very end of all processing when you need to save it as a UTF-8 encoded file, for example).

If your input is in a different encoding, it’s the other way around:

If d is a correct Unicode string, then d.encode(‘utf-8’) yields an encoded UTF-8 bytestring. Don’t test it by printing, though, it might be that it just doesn’t display properly because of the codepage shenanigans.

I’d rather add a comment to Александр Степаненко answer but my reputation doesn’t yet allow it. I had similar problem of converting MP3 tags from CP-1251 to UTF-8 and the solution of encode/decode/encode worked for me. Except for I had to replace first encoding with «latin-1», which essentially converts Unicode string into byte sequence without real encoding:

and for saving back using for example mutagen it doesn’t need to be encoded:

I provided some relevant info on encoding/decoding text in this response: https://stackoverflow.com/a/34662963/2957811

To add to that here, it’s important to think of text in one of two possible states: ‘encoded’ and ‘decoded’

‘decoded’ means it is in an internal representation by your interpreter/libraries that can be used for character manipulation (e.g. searches, case conversion, substring slicing, character counts, . ) or display (looking up a code point in a font and drawing the glyph), but cannot be passed in or out of the running process.

‘encoded’ means it is a byte stream that can be passed around as can any other data, but is not useful for manipulation or display.

If you’ve worked with serialized objects before, consider ‘decoded’ to be the useful object in memory and ‘encoded’ to be the serialized version.

‘\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3’ is your encoded (or serialized) version, presumably encoded with cp1251. This encoding needs to be right because that’s the ‘language’ used to serialize the characters and is needed to recreate the characters in memory.

Функции encode() и decode() в Python

Методы encode и decode Python используются для кодирования и декодирования входной строки с использованием заданной кодировки. Давайте подробно рассмотрим эти две функции.

encode заданной строки

Мы используем метод encode() для входной строки, который есть у каждого строкового объекта.

Это кодирует input_string с использованием encoding , где errors определяют поведение, которому надо следовать, если по какой-либо случайности кодирование строки не выполняется.

encode() приведет к последовательности bytes .

Как и ожидалось, в результате получается объект :

Тип кодирования, которому надо следовать, отображается параметром encoding . Существуют различные типы схем кодирования символов, из которых в Python по умолчанию используется схема UTF-8.

Читайте также:  Windows node bin path

Рассмотрим параметр encoding на примере.

Как вы можете заметить, мы закодировали входную строку в формате UTF-8. Хотя особой разницы нет, вы можете заметить, что строка имеет префикс b . Это означает, что строка преобразуется в поток байтов.

На самом деле это представляется только как исходная строка для удобства чтения с префиксом b , чтобы обозначить, что это не строка, а последовательность байтов.

Обработка ошибок

Существуют различные типы errors , некоторые из которых указаны ниже:

Тип ошибки Поведение
strict Поведение по умолчанию, которое вызывает UnicodeDecodeError при сбое.
ignore Игнорирует некодируемый Unicode из результата.
replace Заменяет все некодируемые символы Юникода вопросительным знаком (?)
backslashreplace Вставляет escape-последовательность обратной косой черты (\ uNNNN) вместо некодируемых символов Юникода.

Давайте посмотрим на приведенные выше концепции на простом примере. Мы рассмотрим входную строку, в которой не все символы кодируются (например, ö ),

Декодирование потока байтов

Подобно кодированию строки, мы можем декодировать поток байтов в строковый объект, используя функцию decode() .

Поскольку encode() преобразует строку в байты, decode() просто делает обратное.

Это показывает, что decode() преобразует байты в строку Python.

Подобно параметрам encode() , параметр decoding определяет тип кодирования, из которого декодируется последовательность байтов. Параметр errors обозначает поведение в случае сбоя декодирования, который имеет те же значения, что и у encode() .

Важность кодировки

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

Первое декодирование неверно, так как оно пытается декодировать входную строку, которая закодирована в формате UTF-8. Второй правильный, поскольку форматы кодирования и декодирования совпадают.

Кодировки в python

прочтение статьи занимает 4мин, с обдумыванием — 10мин 🙂
примечание: данная статья относится к python 2.x, но для python 3.x принцип тот же

Общее

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:

= 6 байт при cp1251
= 12 байт при utf8

Читайте также:  Плеер вместо adobe flash player для windows

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»

Загрузка и сохранение файла

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт

Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.

Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.

Пример авто-преобразования кодировок в сравнении

В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.

При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.

Установка внешней кодировки при запуске

статья будет дополняться.

Как перекодировать строку?

Как перекодировать эту строку в читаемый вид из cp1251 в utf-8?

Как перекодировать строку в hex
В дебрях интернета нашел антипод этого функционала. Метод переводит Из hex в строку string.

Как перекодировать строку в другую кодировку?
А есть что-то готовое наподобие iconv? (перекодировать строку в другую кодировку)

Как перекодировать строку StreamReader.ReadLine() в Юникод?
Всем привет. Значит такая проблема. Есть текстовый файл в кодировке ANSI 1251 , открывая его и.

Перекодировать строку из кодировки KOI в строку в кодировке Windows-1251 и обратно
Составить программы, печатающие результаты вычислений. Ребят помогите это задание сделать!

Тематические курсы и обучение профессиям онлайн
Профессия Python-разработчик (Skillbox)
Профессия Fullstack-разработчик на Python (Skillbox)
Python-разработчик с нуля (Нетология)
Fullstack-разработчик на Python (Нетология)

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

перекодировать строку !
всем привет ! Вот проблема перекодировать строку из utf-8 в cp1251 В нете нащел пример .

Перекодировать строку
Ребят подскажите пожалуйста. Понимаю что тема избитая, но сколько не пробовал, не выходит корректно.

Перекодировать строку в php
Здравствуйте! Проблема такая. В php скрипте на вход подается обычная строка. Там есть различные.

Не удается перекодировать строку
Есть такая строка: $spisok =.

Перекодировать строку после file_get_content
Здравствуйте, пишу парсер погоды с яндекс, использую библиотеку simple_html_dom.php. Получаю.

перекодировать строку из UTF кодировки в ANSII
Подскажите пожалуйста как можно перекодировать строку из UTF кодировки в ANSII?

Оцените статью