Кодировка Python Перевести в Utf 8 • Строки в скрипте
Файловые пути стали храниться в PyObject* (на самом деле это, конечно, str — PyUnicodeObject ), работающая с ними часть C API имеет суффикс Object. Например: Пожалуй, главная из них — показать, насколько порой незначительные внешне изменения способны перевернуть внутреннюю реализацию, и как нелегко их проделать не сломав того, что уже отлично работает пятнадцать лет. Метод encode был использован здесь для кодирования исходной переменной s в кодировку utf-8 и сохранения закодированной строки в переменной enc.
Юникод в C API
В Python 2 немалая часть Python C API принимала char * там, где требовалась строка. Поскольку str и был последовательностью байт — сложностей не возникало.
При переносе кода на Python 3 нужно было с этим что-то делать: str стал юникодным типом, последовательностью символов.
Но в С нет удобного типа для unicode! Вернее, существует стандартный тип wchar_t , который обременен множеством проблем. Главные из них: в разных реализациях этот тип имеет различный размер: 16 бит для UCS-2 и 32 бита для UCS-4. К тому же Windows (о, снова она) не поддерживает UCS-2 в полной мере (UCS-4 не поддерживает совсем).
Хуже всего то, что на некоторых платформах этот wchar_t попросту не определен.
Таким образом, использовать wchar_t в Python C API нельзя.
Сам Питон вводит тип Py_UNICODE для этих целей. Но и тут не все гладко. Этот тип не входит в Limited API (PEP 384).
Кроме того, разработчики не хотели радикально заменить все char * на что-то другое.
Есть еще и вопрос практического удобства: ведь очень здорово писать
Для wchar_t все гораздо сложнее, далеко не все компиляторы поддерживают строковые юникодные константы.
В свете вышеописанных причин Python C API продолжает использовать char * , считая, что эти строки имеют кодировку UTF-8 если явно не указано иное. Т.е. прототипы функций C API выглядят как:
Это — импорт модуля с именем name , которое передается как UTF-8 строка, аналог питоновской функции __import__ .
И эта функция — лишь верхушка используемого механизма. В процессе импорта вызываются довольно много внутренних закрытых функций — и везде используются переменные вроде char *name в качестве имен модулей. В кодировке UTF-8, еще раз напомню.
А ведь имя модуля транслируется в путь к файлу! А кодировака файловой системы может отличаться от UTF-8. Счастливые пользователи Linux давно об этом забыли — в подавляющем большинстве систем по умолчанию как кодировка пользователя (переменная окружения LANG ) так и файловой системы установлены в UTF-8 и проблем нет совсем. Но в общем случае это не всегда так.

Андрей Светлов: Python 3: Импорт и юникод
Кодировки по умолчанию
значение ‘path/to/file’ имеет тип str (юникод). Лежащая в основе функция из clib имеет прототип
Это непросто понять без примера. Давайте возьмем французское слово comédie и попробуем преобразовать его в mbcs, имея руский язык cp1251 в настройках по умолчанию.
Посмотрите, какая прелесть! Для символа é в русской раскладке cp1251 нет подходящего аналога. Но ведь английская буква e так похожа: нужно лишь убрать умляут (англ. umlaut, французы зовут этот знак accent aigu). Так и получили преобразование comédie -> comedie без единой ошибки.
А теперь представьте, что это — имя файла. Результат будет следующим: файл на диске есть, и так как в Windows файловая система юникодная, имя файла будет записано правильно, по французски. Но преобразование unicode -> mbcs даст несколько другое имя, которого на диске нет.
В результате получается изумительная по своей красоте ситуация:
будет говорить, что файла нет — а на самом деле вот же он, красавец!
На экран выведется символ с номером 63 — вопросительный знак ? . Таким способом можно выводить любой символ. После запуска этого обновленного кода Python с ключевым словом python3 мы получили отображение типа закодированной строки как байты вместе с закодированной и декодированной строкой. Я думаю, что chcp — это просто конфигурация для самого терминала, и он не имеет ничего общего с записью в файл что вы и делаете, когда передаете стандартный вывод.
Все строки являются unicode. Функция unicode больше не существует. См. ответ от @Noumenon
Если способы выше не работают, то можно также сказать питону игнорировать порции строки, которые он не может преобразовать в utf-8:
Могу быть немного оверкиллом, но когда работаю с ascii и unicode в одних и тех же файлах, повторяющийся decode может быть болью, вот что я использую:
Добавление следующей строки в начало вашего .py файла:
Позволяет кодировать строки прямо в вашем скрипте, вот так:
Если я вас правильно понял, у вас в коде закодирована utf-8 байт-строка.
Преобразование байт-строки в юникод-строку известно как декодирование (unicode -> byte-string — это кодировка).
Вы делаете это путем использования функции unicode или метода decode. Либо:
В Python 3.6 у них нет встроенного метода unicode(). Строчки уже по умолчанию хранятся как unicode и никакого преобразования не требуется. Пример:
Перевести с помощью ord() и unichar(). У каждого unicode char асоциировано число, что-то вроде индекса. Так что у питона есть несколько методов для перевода между char и его числом. Downside — это ñ пример. Надеюсь, что это может помочь.
- Во-первых, str в Python представлен в Unicode .
- Во-вторых, UTF-8 — это стандарт кодирования для кодирования Unicode строки в bytes . Там много стандартов кодирования (e.g. UTF-16 , ASCII , SHIFT-JIS и т.д.).
Когда клиент отправляет данные на ваш сервер и они с помощью UTF-8 , они отправляют кучу bytes не str .
Вы получили строку str потому что метод «library» или «framework», который вы используете, неявно преобразовал некоторые случайные bytes к str .
Под капотом как раз есть куча bytes . Вам просто нужно попросить библиотеку «library» отдать вам содержимое запроса в bytes и вы сами обработаете расшифровку (если library вам не может дать тогда она пытается сделать черную магию тогда вам не стоит ее использовать).
Я хочу конвертировать в Python 2.7 строку наподобие €, ż и аналогичную в UTF-8 строку. Как это сделать?
Я юзаю Python и к сожалению моему коду нужно преобразовать строку, которая представляет символы юникода в строке как \u1234 ускользает в исходную строку, как и: Вот строка кода, которая у меня получилась из другого кода.
Похожие вопросы:
Как конвертировать юникодную строку в строку utf-8 или utf-16? Мой проект VS2005 — это использование юникодного char set, в то время как sqlite в cpp предоставляют int sqlite3_open( const char.
Знаю уже есть пост: Классический ASP — Как преобразовать UTF-8 строку в UCS-2? Но моя ситуация другая. Я хочу преобразовать UTF-8 в UCS-2BE. Например этот текст в UTF-8 Мухтарам Мижо преобразовать в.
Как мне преобразовать utf-8 строку в utf-16 строку в PHP?
Мне нужно сохранить результаты BeautifulSoup в .txt файл. И мне нужно преобразовать результаты в string с str() и не сработало потому что list это UTF-8 : # -*- coding: utf-8 -*- page_content =.

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