Страница 2 из 3

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

Добавлено: 29 авг 2013, 14:04
Olej
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:

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

Добавлено: 29 авг 2013, 15:08
Olej
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!).

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

Добавлено: 29 авг 2013, 15:39
Olej
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 системой. Мне нужна не горячая клавишная комбинация, а программа ... пусть от стороннего производителя.

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

Добавлено: 29 авг 2013, 19:39
Виктория
Кроссплатформенная утилита?

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

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

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

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

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

Добавлено: 29 авг 2013, 21:20
Olej
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 КБ) 5983 просмотра
P.S. Для сравнения - текстуально то же приложение, исполняющееся в Python 2 под Linux (GNOME):
hw2.png
hw2.png (5.28 КБ) 5971 просмотр

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

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

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

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

Добавлено: 29 авг 2013, 21:48
Olej
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: ...

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

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