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

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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

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

Почему бы не поэкспериментировать с альтернативными шеллами и эмуляторами терминала в Windows? MinGW, CygWin, MSYS, ConEmu? Может, там лучше с поддержкой UTF-8?
Редактор материалов, модератор форума

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

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

Сообщение Boris » 13 ноя 2013, 02:00

Спасибо. Разговор ушел в оригинальное русло.
Я не настаивал на UTF-8. Оно само так вышло из советов.
Что бы снять все ответы я перефразирую свой вопрос, и он превратится в риторический:
Для КОГО в утилиты командной строки GDAL/OGR, скомпилированные под ОС Windows, по умолчанию включена поддержка имен файлов в UTF-8, причем в виде, который Windows не понимает?
Это все до боли походит родную коммунистическую партию - раз партия сказала, что UTF-8 есть хорошо, то всякие другие кодировки должны замереть и съежится. Не зависимо от того лучше они или хуже.

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

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

Сообщение ericsson » 13 ноя 2013, 02:27

UTF есть не "хорошо", а "нужно" для общего случая с многоязычными именами файлов, выходящими за пределы одной кодовой страницы.
Я не разработчик, потому мне сложно ответить за них, но предположу, что сделано это просто по подобию с остальными системами, где зоопарк кодировок чуть менее богат и ужасен. Другой вопрос - почему для пользователей в Windows не даны явные рекомендации в духе: "если все ваши файлы и пути - точно в пределах одной кодовой страницы, отключите юникод в GDAL, если нет - включите в консоли". Понятно, что писать костыль, который бы интересовался текущей cp только в винде и, соответственно, что-то там делал с настройками мультибайт/не-мультибайт им не хотелось, а оправдывали они это, возможно, тем, что работающие с консолью обязаны представлять себе эти тонкости. У меня вот были аналогичные проблемы с ImageMagick - потому я представляю. А для кого-то - совершенно не очевидно.

UPD: интересно, как оно работает в консоли на Маке, потому как тамошняя система образования символов с диакритикой позволяет разночтения и это тоже весело.

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

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

Сообщение Boris » 13 ноя 2013, 02:47

Что то мы пошли по кругу - есть знание как включить UNICODE в консоли при считывании командной строки? Так расскажите.
При чем тут костыль? У меня рядом стоит GnuWin ни разу он меня не спрашивал какая кодовая у меня страница. А уж там утилиты все из UNIX'а, но названия файлов читает из командной строки без проблем.

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

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

Сообщение ericsson » 13 ноя 2013, 03:44

Я вам уже выше рекомендовал сделать chcp 65001 и установить юникодовый моноширинный шрифт для окна консоли. Вы это пропустили как-то.
Костыль, потому что когда нечто для консоли пишется, для винды нужно писать дополнительную проверку, которой нет для линуксов. Разработчики GNUWin32, очевидно, почесались это написать. Разработчики GDAL тупо сделали свитч.
win_unicode.png
win_unicode.png (1.88 КБ) 12699 просмотров

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

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

Сообщение Boris » 14 ноя 2013, 19:33

Ok! Я идиот. И я признал, что не все знаю.
В моей Win, мне никакой новый шрифт для того, что бы увидеть на экране UTF-8, не нужен. Я тексты в UTF-8 стандартным type вижу на экране - те же буквы, что и в Notepad++.

В вашем пример консоль - UNICODE, теперь русское название файла попадет в gdalinfo? Если да, то дайте совет как настроить консоль для ввода UNICODE названий файлов в программы, запускаемые из командной строки.
Я переводить вывод в UFT-8 умею, ввод - нет:
Clipboard01.png
Clipboard01.png (8.83 КБ) 12660 просмотров
ничего не меняем в окне, кроме YES на NO:

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

F:\10>set GDAL_FILENAME_IS_UTF8=NO
Clipboard02.png
Clipboard02.png (9.83 КБ) 12654 просмотра
По вашим советам выше я искал путь передачи UNICODE из командной строки, что бы работало как программистами было задумано. Не нашел.
Знаете - подскажите и мне. Если вопрос слишком глупый для этого раздела, давайте унесем его "Я новичок".

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

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

Сообщение Sergey Astakhov » 14 ноя 2013, 22:03

Boris писал(а):По вашим советам выше я искал путь передачи UNICODE из командной строки, что бы работало как программистами было задумано. Не нашел.
http://msdn.microsoft.com/en-us/library ... s.85).aspx

Дело в том, что под виндой есть два комплекта API (с суффиксом W для Unicode и с A для Ansi) для всех функций, работающих со строками и при помощи define при компиляции определяется к какому из них будут идти обращения. Но даже если компиляция по умолчанию идёт к Ansi-функциям, можно напрямую дёрнуть нужный Unicode вариант и сконвертировать результат в так любимый товарищами UTF-8.

Но судя по вашему последнему скриншоту это не сильно поможет - раз доступ к файлу проходит без ошибок, значит программа получает корректное значение (в Ansi), а вот вывод информации на экран уже почему-то идёт кривой.
По хорошему надо всю программу скомпилировать как unicode, но для этого может потребоваться слишком много изменений не очень совместимых с линуксами.

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

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

Сообщение Boris » 17 ноя 2013, 22:24

Ок. Я видимо :?: добился того, что бы консоль работала в UTF-8, все как я сам же писал выше. Только проверять надо было не с помощью gdalinfo:
Clipboard03.png
Clipboard03.png (11 КБ) 12581 просмотр
файл полученный командой ECHO прилагаю:
Σας γράφω στα Ελληνικά.txt
(45 байт) 597 скачиваний
Не буду утомлять картинками, но поверьте, что gdalinfo не видит этот текстовый файл ни с установленной в YES переменной, ни с установленной в NO, ни с неустановленной вовсе.
F:\Temp>gdalinfo "Σας γράφω στα Ελληνικά.txt"
ERROR 4: `??? ????? ??? ????????.txt' does not exist in the file system,
and is not recognised as a supported dataset name.

gdalinfo failed - unable to open '??? ????? ??? ????????.txt'.

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

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

Сообщение Sergey Astakhov » 21 ноя 2013, 12:01

Ну так всё верно, так и должно быть с текущей реализацией. Винда умеет отдавать параметры в 2-х кодировках:

GetCommandLineA - отдаёт в кодировке Ansi (конкретная кодировка задаётся в настройках виндов, для русских виндов это будет Windows-1251)
GetCommandLineW - отдаёт в кодировке Unicode (UCS-2/UTF-16)

Функции работы с файлами тоже существуют в 2-х комплектах (с суффиксом A берут на вход Ansi, а с суффиксом W - Unicode). Кодировка консоли тут влияет только на ввод/вывод символов в консоли, на работу самой программы она не сказывается.

Утилиты gdal судя по всему пользуются первым вариантом, и если GDAL_FILENAME_IS_UTF8=YES ещё пытаются выполнять преобразование из UTF-8. Поэтому если набор символов укладывается в кодировку Ansi (русские буквы на русской винде), то с отключенным GDAL_FILENAME_IS_UTF8 всё и работает (кроме вывода на консоль, почему-то, видать там где-то забыли отключить конвертацию).

Если хочется полноценную поддержку Unicode под виндами, то надо компилировать с unicode-вариантами виндовых функций и либо сделать поддержку UTF-16 вместо UTF-8 в коде (не знаю насколько это реально), либо сделать обёртки над этими функциями и выполнять там конвертацию UTF16<>UTF8. Либо оставаться в рамках Ansi (починив вывод), но тогда набор символов будет ограничен текущей кодировкой Ansi.

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

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

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

Спасибо за ответ. Я на досуге попробую доказать, что при данных мною выше установках, имена файлов передаются в UTF-8. Осталось только подобрать для этог проверочную программу, т.к. собственные утилиты командной строки Win7 это понимают, но они могут использовать, что то не доступное через стандартный API.

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

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

Сообщение Sergey Astakhov » 03 дек 2013, 23:08

Boris писал(а):Спасибо за ответ. Я на досуге попробую доказать, что при данных мною выше установках, имена файлов передаются в UTF-8. Осталось только подобрать для этог проверочную программу, т.к. собственные утилиты командной строки Win7 это понимают, но они могут использовать, что то не доступное через стандартный API.
Проще всего написать программу самому. Текст (кодировка 1251, компиляция последним msvc для 32-бит), запуск под Win8.1 64 bit.

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

#include <stdio.h>
#include <locale.h>
#include <windows.h>

int main(int argc, char** argv)
{
 HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);

 unsigned int consolecp = GetConsoleCP();

 printf("Console CP: %u\n",consolecp);

 char * ansicmd = GetCommandLineA();

 WriteConsoleA(hstdout, "Ansi: ", 6, NULL, NULL);

 WriteConsoleA(hstdout, "Привет! ", 8, NULL, NULL);
 WriteConsoleA(hstdout, ansicmd, strlen(ansicmd), NULL, NULL);

 WriteConsoleA(hstdout, "\nUnicode: ", 10, NULL, NULL);


 wchar_t * unicodecmd = GetCommandLineW();

 WriteConsoleW(hstdout, L"Привет! ", 8, NULL, NULL);
 WriteConsoleW(hstdout, unicodecmd, wcslen(unicodecmd), NULL, NULL);
 WriteConsoleW(hstdout, L"\n", 1, NULL, NULL);

 return 0;
}
Вложения
ConsoleEncoding.png
Результат
ConsoleEncoding.png (15.58 КБ) 12379 просмотров

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

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

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

на сколько я понимаю команда CHCP изменяет кодовую страницу вывода на экран. Кодовую страницу ввода (предположительно) изменяет команда MODE. Хотя не исключено, что оболочка при командной строке имеет дополнительные возможности или шибко интеллектуальна.

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

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

Сообщение ericsson » 05 дек 2013, 22:56

А вы наберите сначала chcp 65001, а потом mode con, увидите, что там написано.

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

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

Сообщение Sergey Astakhov » 05 дек 2013, 23:47

Boris писал(а):на сколько я понимаю команда CHCP изменяет кодовую страницу вывода на экран. Кодовую страницу ввода (предположительно) изменяет команда MODE. Хотя не исключено, что оболочка при командной строке имеет дополнительные возможности или шибко интеллектуальна.
У консоли можно отдельно выставить кодировку ввода и кодировку вывода (SetConsoleCP и SetConsoleOutputCP), chcp просто меняет их одновременно. По умолчанию там стоит OEM-кодировка (для русских виндов - 866), это наследие совместимости с DOS-приложениями.

Дело в том, что эта кодировка консоли для ansi-функций, на unicode-функции она не влияет. Когда вы вводите командную строку в подсказку командной строки - работает unicode-вариант в cmd (поэтому греческий там нормально вводится), далее он без изменений передаётся в unicode-функции GetCommandLineW (поэтому он по пути и не портится). В GetCommandLineA передаётся результат конвертации в Ansi-кодировку, но при этом берётся не кодировка консоли, а системная настройка (возвращается функцией GetACP, 1251 для русских виндов). Ей же пользуются и прочие системные функции, для конвертации в Unicode и обратно, поэтому настройки консоли на это преобразование и не влияют. Особняком стоят только ansi-функции ввода/вывода на консоль, которые пользуются настройками консоли.

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

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

Сообщение Boris » 06 дек 2013, 01:11

т.е. я правильно понял, что chcp 65001, заданный в командной строке при вызове программы с параметрами передает в программу строку в UTF-8 ? А остальное поведение зависит от того, что программа ждет и как именно она читает эти параметры командной строки?

Ответить

Вернуться в «GDAL/OGR»

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

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