GDAL и русские буквы в именах файлов Windows

Обсуждение материалов сайта: вопросы, замечания, предложения
Ответить
Boris
Гуру
Сообщения: 3964
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 365
Откуда: Париж

GDAL и русские буквы в именах файлов Windows

Сообщение Boris » 19 дек 2013, 02:15

по результатам обсуждений: и в виду достижения приемлемого решения :wink: по использованию русских (и иных не ASCII) букв в именах и путях файлов Windows, результат был сформулирован в статью:
GDAL и русские буквы в именах файлов Windows

=========================================
Статья опубликована.

ericsson
Гуру
Сообщения: 3195
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 682
Ваше звание: Вредитель полей

Re: GDAL и русские буквы в именах файлов Windows

Сообщение ericsson » 19 дек 2013, 03:02

Отличное решение, между прочим... и подойдет еще для энного количества средств, которые не умеют нормально из консоли читать.
А баг соответствующий в трекере я как-то не нашел. Есть?

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 8910
Зарегистрирован: 06 окт 2003, 20:20
Статьи: 231
Проекты: 12/6
Репутация: 644
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Максим Дубинин » 19 дек 2013, 12:12

Борис, а можно убрать все "костыли" и лирику из статьи, приходится продираться сквозь всё это, чтобы суть уловить.
пристегивайтесь, турбулентность прямо по курсу

Sergey Astakhov
Активный участник
Сообщения: 187
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 36
Откуда: Питер

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Sergey Astakhov » 19 дек 2013, 13:31

Суть можно свести к 3 строчкам:
1) Используйте GDAL_FILENAME_IS_UTF8=NO при прямом запуске exe-шников (при этом будет работать только подмножество символов Cp1251).
2) Используйте GDAL_FILENAME_IS_UTF8=YES при запуске из python-а (при этом должны работать все символы Unicode).
3) Не используйте gdal.GeneralCmdLineProcessor()

Можно наверное вынести это в начало статьи, чтобы кому не интересно, дальше можно было не читать.

Не понятно как именно портит строки gdal.GeneralCmdLineProcessor() - вроде судя по исходникам символы портится не должны, может это от версии python-а зависит?

Boris
Гуру
Сообщения: 3964
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 365
Откуда: Париж

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Boris » 19 дек 2013, 18:57

Максим Дубинин писал(а):Борис, а можно убрать все "костыли" и лирику из статьи, приходится продираться сквозь всё это, чтобы суть уловить.
постараюсь в ближайшее время. оставить только результат? или что-то расширить, потому как появился вопрос про то как именно искажается строка консоли.

Boris
Гуру
Сообщения: 3964
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 365
Откуда: Париж

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Boris » 19 дек 2013, 19:02

Sergey Astakhov писал(а):Суть можно свести к 3 строчкам:
2) Используйте GDAL_FILENAME_IS_UTF8=YES при запуске из python-а (при этом должны работать все символы Unicode).
3) Не используйте gdal.GeneralCmdLineProcessor()

Можно наверное вынести это в начало статьи, чтобы кому не интересно, дальше можно было не читать.

Не понятно как именно портит строки gdal.GeneralCmdLineProcessor() - вроде судя по исходникам символы портится не должны, может это от версии python-а зависит?
2 и 3 работают только в комплексе. Одно без другого не работает. Нельзя просто уйти в UTF-8 и использовать GeneralCmdLineProcessor.
Я был бы признателен за ссылку на код GeneralCmdLineProcessor. Я так сходу не нашел. То есть нашел но там почему то были две функции, которые ссылались друг на друга (?) и действительно в том как описано код портить не могли.
Но в тех, что я видел в ф-ии имелся 2-ой параметр, не ясно для чего.

Александр Мурый
Гуру
Сообщения: 5043
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 712
Ваше звание: званий не имею
Откуда: Москва

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Александр Мурый » 20 дек 2013, 01:28

1) Борис, всё-таки Linux, а не "Lunix"; :) лично я бы вообще написал "Unix-подобные ОС";
2) отсылать к форуму по "диагнозам" лично мне кажется неправильным;
3) dal_merge.bat --> gdal_merge.bat
dal_mergeF.bat --> gdal_mergeF.bat
Редактор материалов, модератор форума

Boris
Гуру
Сообщения: 3964
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 365
Откуда: Париж

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Boris » 20 дек 2013, 01:44

Александр Мурый писал(а):1) Борис, всё-таки Linux, а не "Lunix"; :) лично я бы вообще написал "Unix-подобные ОС";
2) отсылать к форуму по "диагнозам" лично мне кажется неправильным;
3) dal_merge.bat --> gdal_merge.bat
dal_mergeF.bat --> gdal_mergeF.bat
Хорошо я поправлю, но для тех, кто видел настоящий Unix, Windows на фоне нынешних клонов Linux, то же может называться "Unix-подобные ОС".
Не понял только по отсылку к форуму, не ссылаться вообще, но я же не сам до всего этого дошел. Куда тогда ссылаться на авторов предложений и предположений?

Александр Мурый
Гуру
Сообщения: 5043
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 712
Ваше звание: званий не имею
Откуда: Москва

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Александр Мурый » 20 дек 2013, 11:11

Boris писал(а): Не понял только по отсылку к форуму, не ссылаться вообще, но я же не сам до всего этого дошел. Куда тогда ссылаться на авторов предложений и предположений?
В случае "коллективного разума" ссылка на форум, видимо, нужна.
Редактор материалов, модератор форума

Sergey Astakhov
Активный участник
Сообщения: 187
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 36
Откуда: Питер

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Sergey Astakhov » 20 дек 2013, 21:34

Boris писал(а):Я был бы признателен за ссылку на код GeneralCmdLineProcessor. Я так сходу не нашел. То есть нашел но там почему то были две функции, которые ссылались друг на друга (?) и действительно в том как описано код портить не могли.
Сам код, который делает то ради чего его вызывают, вот тут:
http://svn.osgeo.org/gdal/trunk/gdal/gc ... l_misc.cpp
Функция GDALGeneralCmdLineProcessor

Код прослойки, которая занимается конвертацией данных python<>c++ применительно к gdal находится тут: http://svn.osgeo.org/gdal/trunk/gdal/sw ... l_wrap.cpp
Это функции _wrap_GeneralCmdLineProcessor и GeneralCmdLineProcessor которые в итоге вызывают GDALGeneralCmdLineProcessor

Код python-овских функций можно найти здесь: http://hg.python.org/cpython/

Ну и надо учесть, что это самые последние версии кода (из trunk), если ошибка была в старой версии и потом исправлена - надо смотреть по соответствующим веткам тут: http://svn.osgeo.org/gdal/tags/

Проверить порчу строк можно просто - записать из python-а в файл строки на входе функции и на выходе - так можно понять как именно она их портит и где искать подозрительный код.
Boris писал(а):Но в тех, что я видел в ф-ии имелся 2-ой параметр, не ясно для чего.
В комментариях написано что он не используется.

Boris
Гуру
Сообщения: 3964
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 365
Откуда: Париж

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Boris » 17 мар 2016, 21:26

Я хотел добавить к статье текст исправленного стандартного bat-файла "make-bat-for-py.bat", который автоматически порождает нужные bat-файлы для всех *.py скриптов в стандартном каталоге "%OSGEO4W_ROOT%\bin", но не смог - получил сообщение, что я не "участник". А хотелось бы все таки дополнить.
make-bat-for-py.bat

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

@echo on  
echo.
echo.    Generating .bat files for all .py files in %OSGEO4W_ROOT%\bin
echo.
pushd "%OSGEO4W_ROOT%\bin"
for %%g in (*.py) do (
		echo @setlocal 1> %%~ng.bat
		echo @echo off 1>> %%~ng.bat
		echo @chcp 65001 1>> %%~ng.bat
		echo Set GDAL_FILENAME_IS_UTF8=YES 1>> %%~ng.bat
		echo set ARGV=%%* 1>> %%~ng.bat
		echo if "%%1"==""  goto iExit 1>> %%~ng.bat
		echo set iTmp=%%tmp%%\%%RANDOM%%_%%~n0_%%RANDOM%%.tmp 1>> %%~ng.bat
		echo @rem echo %%iTmp%% 1>> %%~ng.bat
		echo @echo %%ARGV%%^>"%%iTmp%%" 1>> %%~ng.bat
		echo	@python "%%OSGEO4W_ROOT%%\bin\%%g" --optfile "%%iTmp%%" 1>> %%~ng.bat
		echo @endlocal 1>> %%~ng.bat
		echo exist /b
		echo :iExit 1>> %%~ng.bat
		echo @python "%%OSGEO4W_ROOT%%\bin\%%g" %%*  >> %%~ng.bat
		echo	@python "%%OSGEO4W_ROOT%%\bin\%%g" --optfile "%%iTmp%%"
		echo @endlocal 1>> %%~ng.bat
		echo exist /b
   )
popd

Александр Мурый
Гуру
Сообщения: 5043
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 712
Ваше звание: званий не имею
Откуда: Москва

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Александр Мурый » 17 мар 2016, 21:40

Куда именно надо добавить bat?
Редактор материалов, модератор форума

Boris
Гуру
Сообщения: 3964
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 365
Откуда: Париж

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Boris » 18 мар 2016, 00:50

Я бы добавил в раздел Решение в конце:
Для стандартных программа - скриптов на python, в комплекте OSGeo4W, используются оболочки в виде BAT-файлов с аналогичным именем. Стандартно они создаются (перезаписываются) командным файлом "make-bat-for-py.bat", который запускается в конце инсталляции. Стандартный "make-bat-for-py.bat" состоит только из одной строки, вызывающей программу python.exe для скрипта с аналогичным именем.
Поскольку при таком вызове невозможно использование файлов с кириллическими символами, в файл оболочку необходимо добавить строки, обеспечивающие дополнительные настройки, призванные обеспечить корректную передачу имен файлов. Для это предлагается замена стандартного"make-bat-for-py.bat" на файл, приводимый ниже, с последующим запуском этого файла, что вызовет массовую замену BAT-файлов, оболочек для скриптов python, в каталоге "%OSGEO4W_ROOT%\bin":

Александр Мурый
Гуру
Сообщения: 5043
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 712
Ваше звание: званий не имею
Откуда: Москва

Re: GDAL и русские буквы в именах файлов Windows

Сообщение Александр Мурый » 18 мар 2016, 01:24

Добавил в статью текст и код bat-файла. Борис, странно, что вы не смогли поправить в вики. Вы входили туда под вашим пользователем?
Редактор материалов, модератор форума

Ответить

Вернуться в «Материалы сайта»