Найти - Пользователи
Полная версия: Абракадабра в консоли linux ubuntu
Начало » Python для новичков » Абракадабра в консоли linux ubuntu
1
corsair
Доброго времени суток всем!

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

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

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
�
�
�
�
�

Заранее спасибо за помощь!
smoke853
вот так попробуйте:
# -*- coding: utf-8 -*-
mystr = u"роман"
for char in mystr:
    print char
corsair
smoke853
вот так попробуйте:

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

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

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

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

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

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

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

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

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

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

Но все же.. вопрос остается… Почему нужно питону указывать кодировку явно… то есть явно декодировать строку в юникод, если и так везде стоит юникод по дефаулт(в stdout, console и locale)? И еще и в скрипте указано, что это юникод…
corsair
Простите, если глупый вопрос… Недавно начал учить питон.. А в Java с таким не сталкивался…
smoke853
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 - это зарезервированное слово.
corsair
smoke853, спасибо за совет! Слышал, что между второй и третьей веткой есть существенные отличия… И многие пока не рискуют использовать 3-ю в продакшене… возможно из-за какой-то несовместимости.. но в деталях мне это не известно.. Поэтому и взялся за изучение 2-ой… А Вы как думаете?
smoke853
corsair, я сам только начал учить python где то с октября месяца 12-го года. До этого даже вообще не знал что такое ЯП, у нас не в технаре не в универе на информатике почему то этого не проходили. А так я поспрашивал с какой ветки начать изучать пайтон новичку, мне посоветовали с 3-й, т.к. пока я хорошо разберусь в python, 3-я ветка уже будет актуальна. Хотя например, я пользуюсь программами Autodesk Maya, The Foundry Nuke, там python 2-я ветка, так что пришлось и про 2 и про 3-ю ветки пайтона читать. Ну упор делаю все же на 3-ю А так различия между ветками не большие, ну на мой взгляд.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB