Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 5, 2009 12:23:19

kvazar
От:
Зарегистрирован: 2009-01-05
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой

Здравствуйте всем.
Я изучаю питон совсем недавно, поэтому вопрос довольно наивный.
Вот есть файл в кодировке utf-8.
В первой строке стоит # -*- coding: utf-8 -*-
Я наивно предполагал, что теперь смогу спокойно работать с любыми симолами, но не тут-то было.
Чтобы производить операции над строками с кириллицей приходится строку переводить в юникод.
Это ужасно неудобно..
Но это ещё пол беды. Почему-то если поставить перед строкой “u”, то при попытке вывести эту строку с помощью конструкции print питон выводит такую ошибку
“'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)” Тоесть питон пытается вывести строку, как ASCII.. и если перевести строку обратно в utf-8, то всё нормально. Такая ошибка возникает в python 2.5.1, а в версии 2.6 такого я не заметил..
Кто-нибудь может объяснить, как питон работает с кодировками? Тоесть файл он видит, как ASCII всегда, неважно в какой кодировке этот файл?
Хотелось бы понять весь цикл работы с кодировками в питоне, а не просто отделаться, поставив строчки кода, не понимая для чего они нужны и на что влияют.
Заранее спасибо всем за ответы.



Офлайн

#2 Янв. 5, 2009 12:38:39

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Проблема с кодировкой

> Чтобы производить операции над строками с кириллицей приходится строку переводить в юникод.
Уточни, что конкретно ты делаешь.

> Почему-то если поставить перед строкой “u”, то при попытке вывести эту строку с помощью конструкции print питон выводит такую ошибку
Это нормальная ситуация. Мне не известны терминалы, которые бы работали с unicode, поэтому при передаче print unicode-строки выполняется автоматическое её конвертирование в ansi, по умолчанию это ascii. В >= 2.6, если я не ошибаюсь, по умолчанию utf-8, потому и не возникает проблем на utf-8 терминалах, думаю, что под виндой ничего из этого хорошего не выйдет.

> То есть файл он видит, как ASCII всегда, неважно в какой кодировке этот файл?
Исходный код он воспринимает в соответствии с директивой coding, в начале файла. О каком файле ты говоришь? Сама по себе строка, это набор байт, если ты читаешь её из произвольного файла. Строка не несет в себе информации (я об ansi, разумеется) о кодировке. coding в начале (до 2.6, дальше не знаю) модуля позволяет автоматизировать перевод строки в unicode в этом модуле (префикс “u”), иначе бы пришлось писать, что то вроде ‘превед’.decode('utf-8'), кажется, других функций эта директива не выполняет.

..bw



Офлайн

#3 Янв. 5, 2009 13:14:11

kvazar
От:
Зарегистрирован: 2009-01-05
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой

Здравствуйте, bw.
Спасибо за быстрый ответ!
> Чтобы производить операции над строками с кириллицей приходится строку переводить в юникод.
>> Уточни, что конкретно ты делаешь.
Я делал только срез строки, чтобы проверить, как будет работать. Если не приводить строку в юникод, то при срезе один символ “считается” за два.Тоесть, чтобы получить первых два символа, то надо так ставить , если выставить нечётное кол-во, то последний символ будет “кракозяброй”.

> Почему-то если поставить перед строкой “u”, то при попытке вывести эту строку с помощью конструкции print питон выводит такую ошибку
>> думаю, что под виндой ничего из этого хорошего не выйдет.
Под виндой я запускаю файл питона через командную строку и utf-8 нормально выводится.
Но я питон хочу использовать для веб. Поэтому сейчас работаю в cgi.
Вот там как раз на веб-сервере и стоит 2.5 версия.

> То есть файл он видит, как ASCII всегда, неважно в какой кодировке этот файл?
>> coding в начале (до 2.6, дальше не знаю) модуля позволяет автоматизировать перевод строки в unicode в этом модуле (префикс “u”), иначе бы пришлось писать, что то вроде ‘превед’.decode('utf-8'), кажется, других функций эта директива не выполняет.
Вот собственно у меня почему вопрос и возник. Я думал, что если файл изначально находится в utf-8, то и приводить строки в юникод для работы с разными языками не понадобится.
Чего-то я здесь не допонимаю..



Офлайн

#4 Янв. 5, 2009 14:58:37

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с кодировкой

kvazar
Лично я трудно воспринимаю суть проблемы. С кодом и точным указанием результатом его работы “как есть” и “как хочется/ожидал” было бы проще, наверное.

Офлайн

#5 Янв. 5, 2009 15:33:45

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с кодировкой

Вообщем когда-то ВОТ ЭТО на этом форуме раз и навсегда прояснило для меня все, насчет кодировок, юникода и пр.



Офлайн

#6 Янв. 5, 2009 16:03:10

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой

igor.kaist
Вообщем когда-то ВОТ ЭТО на этом форуме раз и навсегда прояснило для меня все, насчет кодировок, юникода и пр.
Это хорошо, но вот скажите: какая надобность всегда писать исходник в utf-8? А это очень часто утверждается.



Офлайн

#7 Янв. 5, 2009 16:20:12

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с кодировкой

The gray Cardinal
Это хорошо, но вот скажите: какая надобность всегда писать исходник в utf-8? А это очень часто утверждается.
А в какой еще, если в коде встречаются не latin1 символы?



Офлайн

#8 Янв. 5, 2009 16:24:06

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Проблема с кодировкой

> какая надобность всегда писать исходник в utf-8?
Почти стандарт, т.е. так принято. В сравнении с 7- и 8-битовыми кодировками поддерживает значительно больше языков. Т.е. выигрывают не только англоязычные и, в паре, русские, украинцы и т.д., а чуть ли не все.

> Тоесть, чтобы получить первых два символа, то надо так ставить , если выставить нечётное кол-во, то последний символ будет “кракозяброй”.
Ты ведь в курсе, что UTF-8 это кодировка не с фиксированной “длиной символа”, т.е. на кодирование одного символа уходит от 1 до 6 байт. Подсчет длины UTF-8 строки, это та еще задачка. Интерпретатор не предоставляет для этого инструментов, т.е. len тебе не помощник, хотя, может быть, есть что-то в стандартной библиотеке. Добрый совет, всегда работой только со строками в UNICODE, и только в крайних случаях, если отдаешь отчет своим действиям, можешь использовать STRоки. В 3.0 STRоки отменили, теперь существуют только строки в UNICODE представлении и, отдельно, набор байт.

> Под виндой я запускаю файл питона через командную строку и utf-8 нормально выводится.
Русские? Ты что-то путаешь ;-).

..bw



Офлайн

#9 Янв. 5, 2009 16:34:47

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с кодировкой

bw
> Под виндой я запускаю файл питона через командную строку и utf-8 нормально выводится.
Русские? Ты что-то путаешь ;-).
Возможно он запускал через idle, либо файл сохранял в cp866 :)
bw
Т.е. выигрывают не только англоязычные и, в паре, русские, украинцы и т.д., а чуть ли не все.
Да кроме этого есть возможность вставлять спец символы. Начиная от простых, типа знак копирайта ©, заканчивая такими: ¶►■♫ (лично я использовал)



Отредактировано (Янв. 5, 2009 16:38:22)

Офлайн

#10 Янв. 5, 2009 16:50:56

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой

igor.kaist
А в какой еще, если в коде встречаются не latin1 символы?
А зачем они могут понадобиться в коде?
igor.kaist
Да кроме этого есть возможность вставлять спец символы. Начиная от простых, типа знак копирайта ©, заканчивая такими: ¶►■♫ (лично я использовал)
Разве это хороший стиль программирования?
bw
Почти стандарт, т.е. так принято. В сравнении с 7- и 8-битовыми кодировками поддерживает значительно больше языков. Т.е. выигрывают не только англоязычные и, в паре, русские, украинцы и т.д., а чуть ли не все.
Чем конкретно выигрывают?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version