GDAL и русские буквы в именах файлов Windows
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: GDAL и русские буквы в именах файлов Windows
Почему бы не поэкспериментировать с альтернативными шеллами и эмуляторами терминала в Windows? MinGW, CygWin, MSYS, ConEmu? Может, там лучше с поддержкой UTF-8?
Редактор материалов, модератор форума
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
Спасибо. Разговор ушел в оригинальное русло.
Я не настаивал на UTF-8. Оно само так вышло из советов.
Что бы снять все ответы я перефразирую свой вопрос, и он превратится в риторический:
Для КОГО в утилиты командной строки GDAL/OGR, скомпилированные под ОС Windows, по умолчанию включена поддержка имен файлов в UTF-8, причем в виде, который Windows не понимает?
Это все до боли походит родную коммунистическую партию - раз партия сказала, что UTF-8 есть хорошо, то всякие другие кодировки должны замереть и съежится. Не зависимо от того лучше они или хуже.
Я не настаивал на UTF-8. Оно само так вышло из советов.
Что бы снять все ответы я перефразирую свой вопрос, и он превратится в риторический:
Для КОГО в утилиты командной строки GDAL/OGR, скомпилированные под ОС Windows, по умолчанию включена поддержка имен файлов в UTF-8, причем в виде, который Windows не понимает?
Это все до боли походит родную коммунистическую партию - раз партия сказала, что UTF-8 есть хорошо, то всякие другие кодировки должны замереть и съежится. Не зависимо от того лучше они или хуже.
-
- Гуру
- Сообщения: 3321
- Зарегистрирован: 27 июл 2009, 19:26
- Репутация: 748
- Ваше звание: Вредитель полей
Re: GDAL и русские буквы в именах файлов Windows
UTF есть не "хорошо", а "нужно" для общего случая с многоязычными именами файлов, выходящими за пределы одной кодовой страницы.
Я не разработчик, потому мне сложно ответить за них, но предположу, что сделано это просто по подобию с остальными системами, где зоопарк кодировок чуть менее богат и ужасен. Другой вопрос - почему для пользователей в Windows не даны явные рекомендации в духе: "если все ваши файлы и пути - точно в пределах одной кодовой страницы, отключите юникод в GDAL, если нет - включите в консоли". Понятно, что писать костыль, который бы интересовался текущей cp только в винде и, соответственно, что-то там делал с настройками мультибайт/не-мультибайт им не хотелось, а оправдывали они это, возможно, тем, что работающие с консолью обязаны представлять себе эти тонкости. У меня вот были аналогичные проблемы с ImageMagick - потому я представляю. А для кого-то - совершенно не очевидно.
UPD: интересно, как оно работает в консоли на Маке, потому как тамошняя система образования символов с диакритикой позволяет разночтения и это тоже весело.
Я не разработчик, потому мне сложно ответить за них, но предположу, что сделано это просто по подобию с остальными системами, где зоопарк кодировок чуть менее богат и ужасен. Другой вопрос - почему для пользователей в Windows не даны явные рекомендации в духе: "если все ваши файлы и пути - точно в пределах одной кодовой страницы, отключите юникод в GDAL, если нет - включите в консоли". Понятно, что писать костыль, который бы интересовался текущей cp только в винде и, соответственно, что-то там делал с настройками мультибайт/не-мультибайт им не хотелось, а оправдывали они это, возможно, тем, что работающие с консолью обязаны представлять себе эти тонкости. У меня вот были аналогичные проблемы с ImageMagick - потому я представляю. А для кого-то - совершенно не очевидно.
UPD: интересно, как оно работает в консоли на Маке, потому как тамошняя система образования символов с диакритикой позволяет разночтения и это тоже весело.
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
Что то мы пошли по кругу - есть знание как включить UNICODE в консоли при считывании командной строки? Так расскажите.
При чем тут костыль? У меня рядом стоит GnuWin ни разу он меня не спрашивал какая кодовая у меня страница. А уж там утилиты все из UNIX'а, но названия файлов читает из командной строки без проблем.
При чем тут костыль? У меня рядом стоит GnuWin ни разу он меня не спрашивал какая кодовая у меня страница. А уж там утилиты все из UNIX'а, но названия файлов читает из командной строки без проблем.
-
- Гуру
- Сообщения: 3321
- Зарегистрирован: 27 июл 2009, 19:26
- Репутация: 748
- Ваше звание: Вредитель полей
Re: GDAL и русские буквы в именах файлов Windows
Я вам уже выше рекомендовал сделать chcp 65001 и установить юникодовый моноширинный шрифт для окна консоли. Вы это пропустили как-то.
Костыль, потому что когда нечто для консоли пишется, для винды нужно писать дополнительную проверку, которой нет для линуксов. Разработчики GNUWin32, очевидно, почесались это написать. Разработчики GDAL тупо сделали свитч.
Костыль, потому что когда нечто для консоли пишется, для винды нужно писать дополнительную проверку, которой нет для линуксов. Разработчики GNUWin32, очевидно, почесались это написать. Разработчики GDAL тупо сделали свитч.
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
Ok! Я идиот. И я признал, что не все знаю.
В моей Win, мне никакой новый шрифт для того, что бы увидеть на экране UTF-8, не нужен. Я тексты в UTF-8 стандартным type вижу на экране - те же буквы, что и в Notepad++.
В вашем пример консоль - UNICODE, теперь русское название файла попадет в gdalinfo? Если да, то дайте совет как настроить консоль для ввода UNICODE названий файлов в программы, запускаемые из командной строки.
Я переводить вывод в UFT-8 умею, ввод - нет: ничего не меняем в окне, кроме YES на NO:
По вашим советам выше я искал путь передачи UNICODE из командной строки, что бы работало как программистами было задумано. Не нашел.
Знаете - подскажите и мне. Если вопрос слишком глупый для этого раздела, давайте унесем его "Я новичок".
В моей Win, мне никакой новый шрифт для того, что бы увидеть на экране UTF-8, не нужен. Я тексты в UTF-8 стандартным type вижу на экране - те же буквы, что и в Notepad++.
В вашем пример консоль - UNICODE, теперь русское название файла попадет в gdalinfo? Если да, то дайте совет как настроить консоль для ввода UNICODE названий файлов в программы, запускаемые из командной строки.
Я переводить вывод в UFT-8 умею, ввод - нет: ничего не меняем в окне, кроме YES на NO:
Код: Выделить всё
F:\10>set GDAL_FILENAME_IS_UTF8=NO
Знаете - подскажите и мне. Если вопрос слишком глупый для этого раздела, давайте унесем его "Я новичок".
-
- Активный участник
- Сообщения: 218
- Зарегистрирован: 21 дек 2012, 01:57
- Репутация: 52
- Откуда: Питер
Re: GDAL и русские буквы в именах файлов Windows
http://msdn.microsoft.com/en-us/library ... s.85).aspxBoris писал(а):По вашим советам выше я искал путь передачи UNICODE из командной строки, что бы работало как программистами было задумано. Не нашел.
Дело в том, что под виндой есть два комплекта API (с суффиксом W для Unicode и с A для Ansi) для всех функций, работающих со строками и при помощи define при компиляции определяется к какому из них будут идти обращения. Но даже если компиляция по умолчанию идёт к Ansi-функциям, можно напрямую дёрнуть нужный Unicode вариант и сконвертировать результат в так любимый товарищами UTF-8.
Но судя по вашему последнему скриншоту это не сильно поможет - раз доступ к файлу проходит без ошибок, значит программа получает корректное значение (в Ansi), а вот вывод информации на экран уже почему-то идёт кривой.
По хорошему надо всю программу скомпилировать как unicode, но для этого может потребоваться слишком много изменений не очень совместимых с линуксами.
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
Ок. Я видимо добился того, что бы консоль работала в UTF-8, все как я сам же писал выше. Только проверять надо было не с помощью gdalinfo:
файл полученный командой ECHO прилагаю:
Не буду утомлять картинками, но поверьте, что 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'.
-
- Активный участник
- Сообщения: 218
- Зарегистрирован: 21 дек 2012, 01:57
- Репутация: 52
- Откуда: Питер
Re: GDAL и русские буквы в именах файлов Windows
Ну так всё верно, так и должно быть с текущей реализацией. Винда умеет отдавать параметры в 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.
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.
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
Спасибо за ответ. Я на досуге попробую доказать, что при данных мною выше установках, имена файлов передаются в UTF-8. Осталось только подобрать для этог проверочную программу, т.к. собственные утилиты командной строки Win7 это понимают, но они могут использовать, что то не доступное через стандартный API.
-
- Активный участник
- Сообщения: 218
- Зарегистрирован: 21 дек 2012, 01:57
- Репутация: 52
- Откуда: Питер
Re: GDAL и русские буквы в именах файлов Windows
Проще всего написать программу самому. Текст (кодировка 1251, компиляция последним msvc для 32-бит), запуск под Win8.1 64 bit.Boris писал(а):Спасибо за ответ. Я на досуге попробую доказать, что при данных мною выше установках, имена файлов передаются в UTF-8. Осталось только подобрать для этог проверочную программу, т.к. собственные утилиты командной строки Win7 это понимают, но они могут использовать, что то не доступное через стандартный API.
Код: Выделить всё
#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 (15.58 КБ) 12379 просмотров
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
на сколько я понимаю команда CHCP изменяет кодовую страницу вывода на экран. Кодовую страницу ввода (предположительно) изменяет команда MODE. Хотя не исключено, что оболочка при командной строке имеет дополнительные возможности или шибко интеллектуальна.
-
- Гуру
- Сообщения: 3321
- Зарегистрирован: 27 июл 2009, 19:26
- Репутация: 748
- Ваше звание: Вредитель полей
Re: GDAL и русские буквы в именах файлов Windows
А вы наберите сначала chcp 65001, а потом mode con, увидите, что там написано.
-
- Активный участник
- Сообщения: 218
- Зарегистрирован: 21 дек 2012, 01:57
- Репутация: 52
- Откуда: Питер
Re: GDAL и русские буквы в именах файлов Windows
У консоли можно отдельно выставить кодировку ввода и кодировку вывода (SetConsoleCP и SetConsoleOutputCP), chcp просто меняет их одновременно. По умолчанию там стоит OEM-кодировка (для русских виндов - 866), это наследие совместимости с DOS-приложениями.Boris писал(а):на сколько я понимаю команда CHCP изменяет кодовую страницу вывода на экран. Кодовую страницу ввода (предположительно) изменяет команда MODE. Хотя не исключено, что оболочка при командной строке имеет дополнительные возможности или шибко интеллектуальна.
Дело в том, что эта кодировка консоли для ansi-функций, на unicode-функции она не влияет. Когда вы вводите командную строку в подсказку командной строки - работает unicode-вариант в cmd (поэтому греческий там нормально вводится), далее он без изменений передаётся в unicode-функции GetCommandLineW (поэтому он по пути и не портится). В GetCommandLineA передаётся результат конвертации в Ansi-кодировку, но при этом берётся не кодировка консоли, а системная настройка (возвращается функцией GetACP, 1251 для русских виндов). Ей же пользуются и прочие системные функции, для конвертации в Unicode и обратно, поэтому настройки консоли на это преобразование и не влияют. Особняком стоят только ansi-функции ввода/вывода на консоль, которые пользуются настройками консоли.
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: GDAL и русские буквы в именах файлов Windows
т.е. я правильно понял, что chcp 65001, заданный в командной строке при вызове программы с параметрами передает в программу строку в UTF-8 ? А остальное поведение зависит от того, что программа ждет и как именно она читает эти параметры командной строки?
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 26 гостей