Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Проблемы с кодировками


Автор: HellanD 11.6.2007, 11:23
Есть у меня кусок кода, который читает данные(они на русском языке) из файла:
Код

self.name     = unicode(file.readline()[:-1])



А он мне выдает вот такое... Можете обьяснить причину? В начале кода у меня стоит # -*- coding: cp1251 -*-

self.name     = unicode(file.readline()[:-1])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 0: ordinal not in range(128)

Автор: srd 11.6.2007, 11:51
Попробуй:
Код

# Здесь предполагается, что у тебя файл в кодировке cp1251
self.name     = file.readline()[:-1].decode("cp1251")


Цитата(HellanD @  11.6.2007,  18:23 Найти цитируемый пост)
А он мне выдает вот такое... Можете обьяснить причину?

Если при декодировании "узкой" строки в юникод не задана кодировка, т.е. используется кодек по-умолчанию ascii, который, разумеется, не понимает русских символов. Этот кодек выбирается один раз при стартапе питона и потом менять его нельзя. Потому пользуйся методами decode/encode. Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py в том каталоге, где у тебя установлен питон smile

Цитата(HellanD @  11.6.2007,  18:23 Найти цитируемый пост)
# -*- coding: cp1251 -*-

Это относится только к кодировке файла с исходным кодом. Об остальном ты должен позаботиться сам smile

Автор: HellanD 11.6.2007, 12:35
Попробовал заюзать 
Код

self.name     = file.readline()[:-1].decode("cp1251") 

Есть проблемка... Он в конец строки добавляет казяблик(я так понимаю символ окончания строки), а это не хорошо...Я и так от них избавлялся с помощью страшного file.readline()[:-1]....(Кстате а это как то можно улутшить??)

Добавлено через 4 минуты и 15 секунд
Стоп на счет казябликов сори, сам напутал....По ошибке убрал [:-1]

Автор: pythonwin 11.6.2007, 12:55
HellanD, можешь ещё посмотреть http://www.rupy.ru/member/5/#paper-6

Автор: srd 11.6.2007, 13:06
Цитата(HellanD @  11.6.2007,  19:35 Найти цитируемый пост)
Я и так от них избавлялся с помощью страшного file.readline()[:-1]

Хм. Если в конце файла нету символов перевода строки, то предпоследний вызов readline() вернёт строку без "\n" на конце. И в этом случае [:-1] уничтожит последний значащий символ.

Можно, например, воспользоваться методом rstrip()
Код

>>> "test".rstrip("\n")
'test'
>>> "test\n".rstrip("\n")
'test'
>>> "\n".rstrip("\n")
''


Добавлено через 5 минут и 51 секунду
pythonwin
Ух, ты постоянно где-то откапываешь ссылки на интересные материалы. smile

Автор: pythonwin 11.6.2007, 14:50
Цитата(srd @  11.6.2007,  16:06 Найти цитируемый пост)
Ух, ты постоянно где-то откапываешь ссылки на интересные материалы. smile 

насчет интересных ссылок:
1) они постепенно накапливаются
2) можно многое почерпнуть читая http://python.com.ua/ru/links/blogi/ и статьи на http://python.com.ua/ru/articles/Python/

Автор: HellanD 12.6.2007, 08:46
Цитата

Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py


Вот помню что точно когдато над ним медетировал....Теперь тесты на моей тачке запускаются а на другой нет....Можете еще подробно написать как над ним можно помедетировать? smile 

Автор: Ulysses4j 12.6.2007, 11:13
Цитата(HellanD @ 12.6.2007,  09:46)
Цитата
Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py

Вот помню что точно когдато над ним медетировал....Теперь тесты на моей тачке запускаются а на другой нет....

Цитата
>>> unicode(regular_string)
UnicodeDecodeError: ’ascii’ codec can’t decode byte ...
  • Неправильное решение: исправить 'ascii' в site.py на используемую кодировку
  • Правильное решение: использовать явную перекодировку
    >>> unicode(regular_string, 'utf-8')
    либо
    >>> regular_string.decode('utf-8')

Цитата по предложенному pythonwin материалу "Использование Unicode в Python" (стр. 7).

Автор: HellanD 12.6.2007, 11:47
Да я то понял...Предложение такое откатить назад либу site.py...И решить вопрос иначе (А если кодировка не 'utf-8'?? по моему "cp1251")

Автор: pythonwin 12.6.2007, 19:47
вот статья о питоне+unicode == http://boodebr.org/main/python/all-about-python-and-unicode

Добавлено через 4 минуты и 10 секунд
http://python.com.ua/forum/viewtopic.php?pid=5004#p5004

Добавлено через 6 минут и 56 секунд
http://chardet.feedparser.org/

Добавлено через 9 минут и 29 секунд
PS администрации - закрепите, пожалуйста, тему smile

Автор: HellanD 29.6.2007, 09:44
Еще вопрос связанный с кодировками... Вообщем захотел я получит доступ к кнопке "пуск" на рабочем столе (Винда русская ХР), узнал с помощью проги winspectr ее дескриптор, а по нему с помощью функции getWindowText узнал название окна (оно на русском и питон это выводит козябликами)....
Хочу теперь  найти дискриптор с помощю функции findwindow а она ничего не может найти (Ну оно и понятно я название окна передаю не понятно какое....) Подскажите плиз. Буду благодарен

Автор: pythonwin 29.6.2007, 16:14
HellanD, это тебе в GUI или вариант "поиграйся" decode и encode

Автор: HellanD 29.6.2007, 17:03
Ну не знаю причем тут ГУИ вообще...Англиские контролы ловяться на раз два три! А вот с decode и encode игрался - но не долго всегда получал эрор! Типа что не аски декодируешь!

Автор: pythonwin 29.6.2007, 17:09
HellanD, создай отдельную тему и выложи туда код smile

Автор: stoune 9.5.2008, 15:39
Цитата(HellanD @ 11.6.2007,  11:23)
Есть у меня кусок кода, который читает данные(они на русском языке) из файла:
Код

self.name     = unicode(file.readline()[:-1])



А он мне выдает вот такое... Можете обьяснить причину? В начале кода у меня стоит # -*- coding: cp1251 -*-

self.name     = unicode(file.readline()[:-1])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 0: ordinal not in range(128)

Курить здесь http://www.faqs.org/docs/diveintopython/kgp_unicode.html

Вкратце, создать sitecustomize.py файл в site-packages и вернуть кодировку по умолчанию, например utf8

Автор: pythonwin 12.5.2008, 11:02
Цитата(stoune @  9.5.2008,  18:39 Найти цитируемый пост)
Вкратце, создать sitecustomize.py файл в site-packages и вернуть кодировку по умолчанию, например utf8 

это не правильно...
как правильно читать по ссылкам:
http://www.rupy.ru/member/5/#paper-6
http://www.rupy.ru/static/files/07/02/12/rupyru2007-yurevich-unicode.pdf

Добавлено через 54 секунды
для определения кодировки текста в файле посмотри http://chardet.feedparser.org/

Автор: iale 31.3.2009, 14:24
Видимо давно не было проблем с кодировками. Недавно начал изучать python и есть непонимание работы с кодировками, все выше перечисленные доки я прочитал. Имеем такой код:
Версия - Python 2.5.2
Код

# -*- coding: utf-8 -*-

str1 ='привет';
str2 = u'привет';
str3 = unicode('привет', 'utf-8');

print(len(str1));
print(len(str2));
print(len(str3));

print(type(str1));
print(type(str2));
print(type(str3));


Результат:
Код

12
6
6
<type 'str'>
<type 'unicode'>
<type 'unicode'>


Но если выполнять в интерактивном режиме, то:
Код

str1 ='привет';
print(len(str1));
print(type(str1));
 
Результат:
Код

6
<type 'str'>

Вопрос почему разная длина, если тип один и тот же?

Автор: _Viper_ 1.4.2009, 11:01
В интерактивном режиме другая кодировка, не utf-8, поэтому и длинна другая.

Автор: Vinata 26.11.2009, 23:38
Здравствуйте, помогите пожалуйста, у меня преподоет молодой аспирант, который не рассказывает и не объясняет.. Нужно написать прогу на питоне из csv в базу данных, с распознованием знаков препинание и разделителя столбцов в csv.. помогите пожалуйсиа smile  smile  smile  smile  smile 

Автор: Ch0bits 31.12.2009, 09:10
У меня такая проблема. Использую консоль виндовс cmd.exe, если выводить в нее текст в юникоде через print то все в порядке.
Код

print u'Привет'

А вот при возбуждении исключений выходит такой косяк.
Код

>>> raise TypeError(u'Привет')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: <unprintable TypeError object>

Как это понимать? Исключения не поддерживают юникод? O_o

Автор: Virtuos86 14.1.2010, 05:38
 
Цитата(Ch0bits @ 31.12.2009,  09:10)
Как это понимать? Исключения не поддерживают юникод? O_o

Насколько я понимаю, ответ на этот вопрос раскрыли http://softwaremaniacs.org/forum/python/18278/.

Автор: Karadul 10.2.2010, 17:36
Цитата(srd @  11.6.2007,  11:51 Найти цитируемый пост)
Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py в том каталоге, где у тебя установлен питон

А нельзя вместо этого написать вначале программы setdefaulencoding четотам и писать как раньше?

Автор: pythonwin 10.2.2010, 17:54
Цитата(Karadul @  10.2.2010,  20:36 Найти цитируемый пост)
А нельзя вместо этого написать вначале программы setdefaulencoding четотам и писать как раньше? 

это не правильно и это можно прочитать http://www.rupy.ru/member/5/#paper-6
http://www.rupy.ru/static/files/07/02/12/rupyru2007-yurevich-unicode.pdf
http://www.rupy.ru/static/files/07/02/12/rupyru2007-yurevich-unicode-thesis.pdf

Автор: Karadul 16.2.2010, 19:03
А где именно это там написано? Там написано только то, что не надо менять ничего в site.py, иначе прога будет работать только на компе разработчика. Может мне кажется, но можно как-то поставить default encoding в самой программе?

Автор: pythonwin 16.2.2010, 19:10
Karadul, посмотри, пожалуйста, ссылки в моём посте чуть выше - там есть ответы.

Автор: Virtuos86 11.4.2010, 20:28
Цитата(iale @ 31.3.2009,  14:24)
 # -*- coding: utf-8 -*-

 Может нужно писать:
#! -*- coding: utf-8 -*-
Потому без бэнга у Вас просто комментарий написан по сути.

Автор: mrDoctorWho 29.10.2011, 11:54
Цитата(Virtuos86 @  11.4.2010,  20:28 Найти цитируемый пост)
Может нужно писать:
#! -*- coding: utf-8 -*-
Потому без бэнга у Вас просто комментарий написан по сути.


Насколько я знаю, питону абсолютно без разницы как вы пишете кодировку.

Лично я пишу:
Код

# /* coding: utf-8 */


Или так:
Код

# coding: utf-8


Результат один и тот же.

А проблемы с Unicode я решаю так: 
Код

import sys
reload(sys).setdefaultencoding("utf-8")

Автор: pythonwin 29.10.2011, 12:16
Цитата(mrDoctorWho @  29.10.2011,  14:54 Найти цитируемый пост)
А проблемы с Unicode я решаю так: 

это неправильный метод. ниже выступление Юревича на rupy.ru 2007 об юникоде
http://www.rupy.ru/static/files/07/02/12/rupyru2007-yurevich-unicode.pdf
http://www.rupy.ru/static/files/07/02/12/rupyru2007-yurevich-unicode-thesis.pdf

Автор: drLans 21.2.2012, 16:57
Товарищи, помогите прояснить несколько вопросов по кодировкам. Дело происходит в Windows 7, Python 2.7.

1. Какой кодировкой print декодирует байты для вывода в человеко-понятном виде в этом случае:
Код

# -*- coding: utf-8 -*-
a = 'строка'
print a, repr(a)

Код

строка '\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0'

Что используется, один из уникодов (utf-8, utf-16, ...), cp1251, 866, что-либо ещё? 
Или это зависит от текущей локали?
Код

locale.getpreferredencoding()

Или используется это?
Код

sys.getdefaultencoding()  

Или это?
Код

sys.stdout.encoding

2. Есть файл с русскими символами, и при открытии его в Notepad++ его кодировка определяется как ANSI.
Подскажите, что это за кодировка такая? Где можно увидеть её таблицу?
И как с ней работать из python?

3. Можно ли как-то узнать, в какой кодировке закодирована некая строка?

Автор: Karadul 21.2.2012, 19:16
Ух ты, мою тему 2х летней давности апнули. Времена проходят, а проблемы остаются теми же smile))

drLansa у тебя не юникод, так что он выводится как есть байт в байт, то есть в кодировке исходника (в случае repr). В случае print - имхо декодируется в кодировку сосноли.

Ах да, есть знатный костылик на случай, если надо таки вывести любые байты на stdout (например, что из сети получил - то и выдал).

Код

sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)