kvazar
Янв. 5, 2009 12:23:19
Здравствуйте всем.
Я изучаю питон совсем недавно, поэтому вопрос довольно наивный.
Вот есть файл в кодировке 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 всегда, неважно в какой кодировке этот файл?
Хотелось бы понять весь цикл работы с кодировками в питоне, а не просто отделаться, поставив строчки кода, не понимая для чего они нужны и на что влияют.
Заранее спасибо всем за ответы.
> Чтобы производить операции над строками с кириллицей приходится строку переводить в юникод.
Уточни, что конкретно ты делаешь.
> Почему-то если поставить перед строкой “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
kvazar
Янв. 5, 2009 13:14:11
Здравствуйте, bw.
Спасибо за быстрый ответ!
> Чтобы производить операции над строками с кириллицей приходится строку переводить в юникод.
>> Уточни, что конкретно ты делаешь.
Я делал только срез строки, чтобы проверить, как будет работать. Если не приводить строку в юникод, то при срезе один символ “считается” за два.Тоесть, чтобы получить первых два символа, то надо так ставить , если выставить нечётное кол-во, то последний символ будет “кракозяброй”.
> Почему-то если поставить перед строкой “u”, то при попытке вывести эту строку с помощью конструкции print питон выводит такую ошибку
>> думаю, что под виндой ничего из этого хорошего не выйдет.
Под виндой я запускаю файл питона через командную строку и utf-8 нормально выводится.
Но я питон хочу использовать для веб. Поэтому сейчас работаю в cgi.
Вот там как раз на веб-сервере и стоит 2.5 версия.
> То есть файл он видит, как ASCII всегда, неважно в какой кодировке этот файл?
>> coding в начале (до 2.6, дальше не знаю) модуля позволяет автоматизировать перевод строки в unicode в этом модуле (префикс “u”), иначе бы пришлось писать, что то вроде ‘превед’.decode('utf-8'), кажется, других функций эта директива не выполняет.
Вот собственно у меня почему вопрос и возник. Я думал, что если файл изначально находится в utf-8, то и приводить строки в юникод для работы с разными языками не понадобится.
Чего-то я здесь не допонимаю..
Ferroman
Янв. 5, 2009 14:58:37
kvazar
Лично я трудно воспринимаю суть проблемы. С кодом и точным указанием результатом его работы “как есть” и “как хочется/ожидал” было бы проще, наверное.
igor.kaist
Янв. 5, 2009 15:33:45
Вообщем когда-то
ВОТ ЭТО на этом форуме раз и навсегда прояснило для меня все, насчет кодировок, юникода и пр.
The gray Cardinal
Янв. 5, 2009 16:03:10
igor.kaist
Вообщем когда-то ВОТ ЭТО на этом форуме раз и навсегда прояснило для меня все, насчет кодировок, юникода и пр.
Это хорошо, но вот скажите: какая надобность
всегда писать исходник в utf-8? А это очень часто утверждается.
igor.kaist
Янв. 5, 2009 16:20:12
The gray Cardinal
Это хорошо, но вот скажите: какая надобность всегда писать исходник в utf-8? А это очень часто утверждается.
А в какой еще, если в коде встречаются не latin1 символы?
> какая надобность всегда писать исходник в utf-8?
Почти стандарт, т.е. так принято. В сравнении с 7- и 8-битовыми кодировками поддерживает значительно больше языков. Т.е. выигрывают не только англоязычные и, в паре, русские, украинцы и т.д., а чуть ли не все.
> Тоесть, чтобы получить первых два символа, то надо так ставить , если выставить нечётное кол-во, то последний символ будет “кракозяброй”.
Ты ведь в курсе, что UTF-8 это кодировка не с фиксированной “длиной символа”, т.е. на кодирование одного символа уходит от 1 до 6 байт. Подсчет длины UTF-8 строки, это та еще задачка. Интерпретатор не предоставляет для этого инструментов, т.е. len тебе не помощник, хотя, может быть, есть что-то в стандартной библиотеке. Добрый совет, всегда работой только со строками в UNICODE, и только в крайних случаях, если отдаешь отчет своим действиям, можешь использовать STRоки. В 3.0 STRоки отменили, теперь существуют только строки в UNICODE представлении и, отдельно, набор байт.
> Под виндой я запускаю файл питона через командную строку и utf-8 нормально выводится.
Русские? Ты что-то путаешь ;-).
..bw
igor.kaist
Янв. 5, 2009 16:34:47
bw
> Под виндой я запускаю файл питона через командную строку и utf-8 нормально выводится.
Русские? Ты что-то путаешь ;-).
Возможно он запускал через idle, либо файл сохранял в cp866 :)
bw
Т.е. выигрывают не только англоязычные и, в паре, русские, украинцы и т.д., а чуть ли не все.
Да кроме этого есть возможность вставлять спец символы. Начиная от простых, типа знак копирайта ©, заканчивая такими: ¶►■♫ (лично я использовал)
The gray Cardinal
Янв. 5, 2009 16:50:56
igor.kaist
А в какой еще, если в коде встречаются не latin1 символы?
А зачем они могут понадобиться в коде?
igor.kaist
Да кроме этого есть возможность вставлять спец символы. Начиная от простых, типа знак копирайта ©, заканчивая такими: ¶►■♫ (лично я использовал)
Разве это хороший стиль программирования?
bw
Почти стандарт, т.е. так принято. В сравнении с 7- и 8-битовыми кодировками поддерживает значительно больше языков. Т.е. выигрывают не только англоязычные и, в паре, русские, украинцы и т.д., а чуть ли не все.
Чем конкретно выигрывают?