Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 5, 2013 12:00:44

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

Абракадабра в консоли linux ubuntu

Доброго времени суток всем!

Борюсь с этой проблемой уже пару дней… А проблема, собственно, в следующем:

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

In [2]: print 'ывыв'
ывыв

А вот такой способ почему то не работает:

In [3]: str = 'роман'
In [4]: for chr in str:
   ...:     print chr
   ...:     






На примере использовал ipython, но все тоже самое происходит если запускать скрипт. Система: linux ubuntu 12.04 LTS x86. Что уже попробовал:

Вставлял этот код в начало скрипта:

# -*- coding: utf-8 -*-
import sys
import locale
reload(sys)
sys.setdefaultencoding(locale.getpreferredencoding())

Полностью мой скрипт:

# -*- coding: utf-8 -*-
import sys
import locale
reload(sys)
sys.setdefaultencoding(locale.getpreferredencoding())
print sys.getdefaultencoding()
print locale.getpreferredencoding()
print sys.stdout.encoding
def translit(someText):
    charList = []
    for char in someText:
        charList.append(char)
        print char
translit('питон')

вот что в итоге получается:

c0rsair@c0rsair-VirtualBox:~/Documents$ python test1.py 
UTF-8
UTF-8
UTF-8
�
�
�
�
�

Заранее спасибо за помощь!

Офлайн

#2 Янв. 5, 2013 13:17:32

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Абракадабра в консоли linux ubuntu

вот так попробуйте:

# -*- coding: utf-8 -*-
mystr = u"роман"
for char in mystr:
    print char

Офлайн

#3 Янв. 5, 2013 13:37:02

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

Абракадабра в консоли linux ubuntu

smoke853
вот так попробуйте:

Спасибо! Все заработало как надо… Только одно не могу понять.. почему не работало?.. ведь все кодировки стояли UTF-8…

Еще один вопрос:

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

str = u"роман"
foo(str)

а передавать параметр с консоли:

str=sys.argv[1]
foo(str)

так не работает…

А. все… пока писал этот пост нагуглил…

нужно вот так:

str=unicode(sys.argv[1])
foo(str)

Но все же.. вопрос остается… Почему нужно питону указывать кодировку явно… то есть явно декодировать строку в юникод, если и так везде стоит юникод по дефаулт(в stdout, console и locale)? И еще и в скрипте указано, что это юникод…

Офлайн

#4 Янв. 5, 2013 13:39:09

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

Абракадабра в консоли linux ubuntu

Простите, если глупый вопрос… Недавно начал учить питон.. А в Java с таким не сталкивался…

Офлайн

#5 Янв. 5, 2013 14:57:33

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Абракадабра в консоли linux ubuntu

corsair, рекомендую почитать Марк Лутц: “Изучаем Python, 4-е издание”. Конкретно про работу со строками во второй ветке пайтона. Многие вопросы сразу отпадут, я же могу не правильно объяснить
P.S. Ну вообщем в python 2 есть строки (str, только 8 битные символы), например: mystr = “hello”, а есть Юникодные строки(unicode), например: mystr = u“привет” или mystr = unicode(“привет”, encoding=“utf-8”) Я лично использую в основном python 3.3.0, т.е. 3-я ветка пайтона, вот в 3-й ветке не обязательно ставить префикс u, т.к. уже все строки интерпретируются как строки Юникода.

P.S.S. также не рекомендую использовать зарезервированные слова в названиях переменных, в вашем случае str = “…”, str - это зарезервированное слово.

Отредактировано smoke853 (Янв. 5, 2013 14:59:50)

Офлайн

#6 Янв. 5, 2013 15:07:13

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

Абракадабра в консоли linux ubuntu

smoke853, спасибо за совет! Слышал, что между второй и третьей веткой есть существенные отличия… И многие пока не рискуют использовать 3-ю в продакшене… возможно из-за какой-то несовместимости.. но в деталях мне это не известно.. Поэтому и взялся за изучение 2-ой… А Вы как думаете?

Офлайн

#7 Янв. 5, 2013 15:13:10

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Абракадабра в консоли linux ubuntu

corsair, я сам только начал учить python где то с октября месяца 12-го года. До этого даже вообще не знал что такое ЯП, у нас не в технаре не в универе на информатике почему то этого не проходили. А так я поспрашивал с какой ветки начать изучать пайтон новичку, мне посоветовали с 3-й, т.к. пока я хорошо разберусь в python, 3-я ветка уже будет актуальна. Хотя например, я пользуюсь программами Autodesk Maya, The Foundry Nuke, там python 2-я ветка, так что пришлось и про 2 и про 3-ю ветки пайтона читать. Ну упор делаю все же на 3-ю А так различия между ветками не большие, ну на мой взгляд.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version