Page 1 of 2

Нет поддержки Unicode в именах папок и файлов

PostPosted: Wed Sep 07, 2011 4:37 am
by Vvz
В программе нет поддержки Unicode имен папок и файлов

В результате ,
1) программа не работает, если имя пользователя (папки профиля) на языке отличном от языка указанного для поддержки не-Unicode программ в панели управления
2) программа не распознаёт файлы (словарей, ресурсов, файлы озвучат слов) если также имеют язык отличный от указанного в панели управления

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Wed Sep 07, 2011 5:00 am
by ikm
Это потому, что часть кода использует стандартный fopen(), который работает только с 8-битными именами файлов. Решение тут только одно - переделать :) Но некому и некогда. А в Microsoft, кстати, не додумались до utf-8 для не-Unicode программ?

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Wed Sep 07, 2011 9:45 am
by Vvz
Пишут, что можно попробовать сделать так:
We has a similar problem too. Luckily there's a solution, though it's kinda tricky.
If the file/directory already exists - you may use the GetShortPathName function. The resulting "short" path name is guaranteed not to contain non-latin characters.
1. Call GetShortPathNameW (unicode version) to get the "short" path string.
2. Convert the short path into the ANSI string (use WideCharToMultiByte).
3. Give the resulting ANSI string to the stupid 3rd-party lib.
Now, if the file/directory doesn't exist yet - you may not obtain its short pathname. In such a case you should create it first.



Вам, не кажется, что фраза очень странно звучит? ;) UTF = Unicode формат
ikm wrote:\А в Microsoft, кстати, не додумались до utf-8 для не-Unicode программ?

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Wed Sep 07, 2011 4:03 pm
by Abs62
Пора на хранение имён файлов в UTF-8 переходить. В Linux/MacOS fopen вроде как нативно с этой кодировкой работает, под Win можно сделать обёртку с переходом на _wfopen.

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Wed Sep 07, 2011 4:06 pm
by Tvangeste
Ну и до кучи:

* https://github.com/goldendict/goldendict/issues/30 -- GoldenDict can't handle certain dictionary filenames
* https://github.com/goldendict/goldendict/issues/43 -- Doesn't play audiofiles in Unicode filename

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Wed Sep 07, 2011 10:27 pm
by Abs62
Пора на хранение имён файлов в UTF-8 переходить.

Первый результат можно посмотреть на GitHub в этой ветке.

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Thu Sep 08, 2011 2:35 am
by ikm
Abs62: Хороший подход! Но есть один важный момент. В unix-системах совершенно не факт, что кодировка имен файлов - всегда utf8. Кто-то до сих пор использует koi8-r, например. Поэтому:

  • Давайте считать, что 8-битная кодировка для имен файлов в Windows - всегда utf-8.
  • Однако во всех остальных системах мы продолжаем использовать их родную 8-битную кодировку.
Таким образом, заменять вызовы QString::fromLocal8Bit()/toLocal8Bit() надо не на QString::fromUtf8()/toUtf8(), а на FsEncoding::encode()/decode(). Можно туда добавить версии для QString. Уже внутри реализации этих encode()/decode() надо делать условную компиляцию (для Windows - utf8, для всех остальных - то, что там было и раньше).

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Thu Sep 08, 2011 5:17 am
by Abs62
ikm wrote:
  • Давайте считать, что 8-битная кодировка для имен файлов в Windows - всегда utf-8.
  • Однако во всех остальных системах мы продолжаем использовать их родную 8-битную кодировку.

Я только не понял, откуда эту родную кодировку брать? Поиск файлов же идёт через QDir, а QDir и QFileInfo отдают QString, то бишь там уже юникод.

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Thu Sep 08, 2011 7:25 am
by ikm
В чем конкретно проблема? Для преобразования между QString и локальной 8-битной кодировкой можно использовать QString::fromLocal8Bit()/toLocal8Bit().

Re: Нет поддержки Unicode в именах папок и файлов

PostPosted: Thu Sep 08, 2011 4:53 pm
by Abs62
А QString::toLocal8Bit() и в UTF-8 преобразует, если она системная? Тогда проблем нет.
Сделал. Результат там же.