локализация в Python

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 14:04

Olej писал(а): Написал новое тестовое приложение :lol: .
Ещё более упрощу :lol: приложение (loc2w-no.py):

Код: Выделить всё

#!/usr/bin/python

print "вывод русскоязычной строки, набранной в UTF-8"
(Кстати, если редактировать .py в IDLE, то этот IDLE отказывается сохранять такой файл, выбрасывая окно с предупреждением добавить coding, мол, строка набрана из недозволенных символов ... и только принудительно можно сохранить)

Выполнение (в IDLE):

Код: Выделить всё

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
вывод русскоязычной строки, набранной в UTF-8
>>> 
Но выполнение в консоли (чёрной ;-) , например Tootal Commander) даст другой результат:

Код: Выделить всё

C:\Python-test\loc>loc2w-no.py
  File "C:\Python-test\loc\loc2w-no.py", line 3
SyntaxError: Non-ASCII character '\xe2' in file C:\Python-test\loc\loc2w-no.py o
n line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html
 for details
Вот так вот: "Non-ASCII" ... - этот извечный идиотизм Windows! :shock:
Вложения
loc2w-no.py
(74 байт) 362 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 15:08

Olej писал(а): Теперь перепишу тестовое приложение (loc2w-1251.py):

Код: Выделить всё

#!/usr/bin/python
# -*- coding: cp1251 -*-

print "вывод русскоязычной строки, набранной в UTF-8"
И как изменилось :lol: его выполнение:

Код: Выделить всё

>>> ================================ RESTART ================================
>>> 
вывод русскоязычной строки, набранной в UTF-8
>>> 
Вот тут я вас обманул :oops:
Или это Windows (долбанный! :-( ) меня обманул ... где-то при сохранении файла .py он (IDLE написанный под него?) умудрился подменить кодировку строки в коде программы .py на свою незабвенную 1251 (в соответствии с тем, что записано в комментарии coding). И при переносе файлов обратно в Linux - там выявился маразм! Выправил в Linux всё на UTF-8, отнёс в Windows, и вот вам результат:

- вот как выглядит файл loc2w-1251.py в редакторе IDLE

Код: Выделить всё

#!/usr/bin/python
# -*- coding: cp1251 -*-

print "вывод русскоязычной строки, набранной в UTF-8" 
- а вот другой, но с точно таким же содержимым print() файл loc2w-utf8.py

Код: Выделить всё

#!/usr/bin/python
# -*- coding: utf-8 -*-

print "вывод русскоязычной строки, набранной в UTF-8"
Но он только отображается так, потому, что IDLE знает и использует coding

Но исполняются они одинаково маразматически (это в IDLE):

Код: Выделить всё

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
вывод русскоязычной строки, набранной в UTF-8
>>> 

А это в отдельной текстовой консоли (Total Commander):

Код: Выделить всё

C:\Python-test\locale>loc2w-1251.py
╨▓╤Л╨▓╨╛╨┤ ╤А╤Г╤Б╤Б╨║╨╛╤П╨╖╤Л╤З╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕, ╨╜╨░╨▒╤А╨░╨╜╨╜╨╛╨╣ ╨▓ UTF-8
Вот так вот плохо с консольной локализацией в Python 2 (т.е. в Python 2, в котором всё рассчитано на UTF-8, всё не так уже и плохо - плохо, когда он попадает в среду Windows!).
Вложения
locale.zip
(2.66 КБ) 336 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 15:39

Olej писал(а): Вот так вот плохо с консольной локализацией в Python 2 (т.е. в Python 2, в котором всё рассчитано на UTF-8, всё не так уже и плохо - плохо, когда он попадает в среду Windows!).
Лучше дела обстоят в Python 2 с GUI приложением (hw1.py):

Код: Выделить всё

from Tkinter import *
# -*- coding: utf-8 -*-
 
tk = Tk()
tk.title( "привет, Вася!" )
tk.geometry( '300x40' )

def button_clicked():
    print( "привет, Вася!!" )
 
button=Button( tk, text="жми сюда", command=button_clicked )
button.pack( fill=BOTH )
 
tk.mainloop()
Все текстовые сообщения правильные!
Но все сообщения в консоль (по нажатию кнопки "жми сюда") - абракадабра:

Код: Выделить всё

C:\Python-test\Tkinter\Py2>C:\Python27\python --version
Python 2.7.5

C:\Python-test\Tkinter\Py2>C:\Python27\python hw1.py
╨┐╤А╨╕╨▓╨╡╤В, ╨Т╨░╤Б╤П!!
╨┐╤А╨╕╨▓╨╡╤В, ╨Т╨░╤Б╤П!!
╨┐╤А╨╕╨▓╨╡╤В, ╨Т╨░╤Б╤П!!
Проверяйте.

P.S. Долбанный Windows! Подскажите, какой программой можно делать снимки окон (скриншоты) в этом Windows, чтобы показать окно GUI программы??? <Alt>+<PrintScreen> - не предлагать, я это знаю, но под VirtualBox <Alt>+<PrintScreen> перехватывается хостовой Linux системой. Мне нужна не горячая клавишная комбинация, а программа ... пусть от стороннего производителя.
Вложения
hw1.py
(295 байт) 322 скачивания

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Виктория » 29 авг 2013, 19:39

Кроссплатформенная утилита?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 20:09

Виктория писал(а):Кроссплатформенная утилита?
Если вы про снимок экрана/окна, то никакой кроссплатформенности.
Для Linux платформ таких приложений миллион, зачем ещё кроссплатформенность?
Чисто виндоузное .exe - программа, которая делает экрана/окна. Но программа, а не горячая комбинация клавиш <Alt>+<PrintScreen>.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 20:23

Olej писал(а):Но программа, а не горячая комбинация клавиш <Alt>+<PrintScreen>.
Похоже нашёл что-то похожее на то, что хотелось: MWSnap
И ещё вот такое: FastStone Capture 7.6 Shareware (Last Update: 2013-07-26)
Теперь можно будет хоть показать окно Python GUI приложения, выполняющегося в VirtualBox.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 21:20

Olej писал(а): Лучше дела обстоят в Python 2 с GUI приложением (hw1.py):

Код: Выделить всё

from Tkinter import *
# -*- coding: utf-8 -*-
 
tk = Tk()
tk.title( "привет, Вася!" )
tk.geometry( '300x40' )

def button_clicked():
    print( "привет, Вася!!" )
 
button=Button( tk, text="жми сюда", command=button_clicked )
button.pack( fill=BOTH )
 
tk.mainloop()
Все текстовые сообщения правильные!
Olej писал(а):Теперь можно будет хоть показать окно Python GUI приложения, выполняющегося в VirtualBox.
hw1w.png
hw1w.png (3.04 КБ) 5931 просмотр
P.S. Для сравнения - текстуально то же приложение, исполняющееся в Python 2 под Linux (GNOME):
hw2.png
hw2.png (5.28 КБ) 5919 просмотров

alex65su
Писатель
Сообщения: 40
Зарегистрирован: 13 дек 2012, 10:27
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение alex65su » 29 авг 2013, 21:39

Olej и Виктория, директива "# -*- coding: utf-8 -*-" указывает интерпретатору в какой кодировке воспринимать данный исходник (в данном случае - utf-8).

Более подробно о кодировках в консоли: "Как я боролся с кодировками в консоли".

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение Olej » 29 авг 2013, 21:48

alex65su писал(а):Olej и Виктория, директива "# -*- coding: utf-8 -*-" указывает интерпретатору в какой кодировке воспринимать данный исходник (в данном случае - utf-8).
Это то понятно.
Вопрос в том, как строки этого исходника (который "съев" Python, по описаниям, должен хранить во внутреннем представлении Unicode UTF-8) - отображать одинаково в терминале как в Linux, так и в Windows.
Т.е. чтобы UTF-8 файл (естественный для Linux) перенести в Windows, и он там одинаково выполнялся.
Так как это происходит в Python 3 (см. первые 2 или 3 сообщения темы).
alex65su писал(а):Более подробно о кодировках в консоли: "Как я боролся с кодировками в консоли".
Статья хорошая, в тему. Спасибо.
За параметры преобразования символов и вывода их в консоль отвечают сразу несколько параметров:
- Кодировка по-умолчанию модуля sys — sys.getdefaultencoding()
- Предпочитаемая кодировка для текущей локали — locale.getpreferredencoding()
- Кодировка стандартных потоков sys.stdout, sys.stderr
- Кое-какую смуту вносит и кодировка самого файла, но договоримся, что у нас всё унифицировано и все файлы в utf-8 и содержат корректный заголовок
- «Бонусом» идёт любовь стандартных потоков выдавать исключения, если, даже при корректно установленной кодировке, не найдётся нужного символа при печати unicode строки
Это как-раз то, о чего и я хочу добиться: текст программы исключительно в UTF-8, без всяких Windows-ных задрочек :evil: ...

alex65su
Писатель
Сообщения: 40
Зарегистрирован: 13 дек 2012, 10:27
Контактная информация:

Re: локализация в Python

Непрочитанное сообщение alex65su » 29 авг 2013, 22:04

Olej писал(а): Это как-раз то, о чего и я хочу добиться: текст программы исключительно в UTF-8, без всяких Windows-ных задрочек :evil: ...
Судя по выданным результатам запуска примеров, у Вас с Викторией, кажись, Python разных версий (у Виктории: Python 2.7.5; у Olej: Python 3.3.2).
Насколько слышал, Python 2 и Python 3 в этом вопросе имеют какие-то различия (с Python 3 дела не имел).
Статья, кстати, рассматривает Python 2.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей