Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i2pd: windows: unicode vs singlebyte encodings issues #1162

Closed
mewmew-i2p opened this issue Apr 23, 2018 · 3 comments
Closed

i2pd: windows: unicode vs singlebyte encodings issues #1162

mewmew-i2p opened this issue Apr 23, 2018 · 3 comments

Comments

@mewmew-i2p
Copy link
Contributor

../../libi2pd/FS.cpp: In function 'void i2p::fs::DetectDataDir(const string&, bool)':
../../libi2pd/FS.cpp:51:52: error: cannot convert 'char*' to 'LPWSTR {aka wchar_t*}' for argument '2' to 'DWORD GetModuleFileNameW(HMODULE, LPWSTR, DWORD)'
     GetModuleFileName (NULL, localAppData, MAX_PATH);
                                                    ^
../../libi2pd/FS.cpp:59:67: error: cannot convert 'char*' to 'LPWSTR {aka wchar_t*}' for argument '5' to 'HRESULT SHGetFolderPathW(HWND, int, HANDLE, DWORD, LPWSTR)'
         SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, localAppData);
<Hypnosis> orignal, я разобрался почему в мейкфайл.мингв юникод всё ок
<Hypnosis> потому что виндовые функции взятия путей возвращают в 
однобайтной кодировке анси
<Hypnosis> в русской локали это вин1251 кодировка
<Hypnosis_> и в хтмл странице вебконсоли стоит кодировка вин1251
<orignal> наверное
<Hypnosis_> в нерусской винде это перестанет работать
<Hypnosis_> не наверное, а точно
<Hypnosis_> просовывать вин1251 енкодинг в куте глупо
<Hypnosis_> потому что это костыль
<Hypnosis_> правильный путь это добыть юникодный путь
<Hypnosis_> и перекодировать его в c++ std::string
<Hypnosis_>  для этого нужно как-то видимо  std::wstring сконвертить в std::string
<Hypnosis_> покопайся в доках по std:: тебе привычно
<Hypnosis_> std::wstring добыть из wchar_t[] наверное тривиально
<Hypnosis_> виндовые функции умеют отдавать wchar_t[]
<Hypnosis_> кроме того в одном пути могут быть сегменты разных локалей
<Hypnosis_> юникоду на это  пох
<Hypnosis_> а вин1251 или другая однобайтная локаль жидко обосрется знаками вопросов
@mewmew-i2p
Copy link
Contributor Author

вот нагуглил примерчик http://www.cplusplus.com/reference/locale/wstring_convert/

попробую вот такой код -

  std::wstring wstr(L"Дарова");
  std::wstring_convert<std::codecvt_utf8<wchar_t>,wchar_t> cv;
  std::string str8 = cv.to_bytes(wstr);

@mewmew-i2p
Copy link
Contributor Author

mewmew-i2p commented May 20, 2018

<Hypnosis> orignal, а я с виндой ебусь
<Hypnosis> с кодировочками
<Hypnosis> затрахался по полной программе уже
<Hypnosis> ненавижу винду
<Hypnosis> уже 36 часов трахаюсь с этим багом с кодировками
<Hypnosis> однако есть и позитифчег
<Hypnosis> установил что корректно добыта wchar_t[] версия пути до appdata/roaming
<Hypnosis> однако буст create_directory(std::string) похоже под виндой ожидает 
не utf-8, а ANSI кодировку
<Hypnosis> это не точно
<Hypnosis> под линухом и андройдом вроде ютф8 он хавает
<Hypnosis> а под виндой - виндовозный ANSI
<Hypnosis> это связано с локализацией винды
<Hypnosis> не разобрался ещё до конца
<Hypnosis> orignal, надо как-то Qt подружить с этими ANSI кодировками
<Hypnosis> это одна причина по которой я трахаюсь
<Hypnosis> вторая - хттп консоль работает только с русской ANSI кодировкой, это cp1251
<Hypnosis> у япошек и китаез будет один сплошной глюк
<Hypnosis> ну вот я пытаюсь осилить
<Hypnosis> так-то в яве в кодировках всё элементарно например
<Hypnosis> и просто очень
<Hypnosis> я в яве с лёгкостью разгребал потроха конвертеров и находил слабые места
<Hypnosis> конвертеров кодировок
<Hypnosis> сырцы ждк
<Hypnosis> анси ущербен, потому как это только одна кодовая страница
<Hypnosis> и не допускает нескольких кодовых страниц в одной строке
<Hypnosis> ютф8 как формат обмена годен
<Hypnosis> но винда приемлет или анси, или wchar_t[] видимо
<Hypnosis> ну, это всё очень приблизительно
<Hypnosis> потому что я не знаю какой анси у китаёз например
<Hypnosis> зато я знаю что для китаёз явовский юникод недостаточен
<Hypnosis> в яве полудохлые 4-байтные юникод символы
<Hypnosis> и совсем дохлые более чем 4-байтные

@mewmew-i2p
Copy link
Contributor Author

mewmew-i2p commented May 20, 2018

<Hypnosis_> orignal, один вариант решения проблемы - это всюду юзать utf-8 encoded строки, 
а там где требуется винапи (прямо или опосредованно через буст или опосредованно ещё 
через что-то вроде std:: ) - юзать врапперы - layer функций со входными и выходными utf-8 
строками, в которых разная обработка для винды и для POSIX систем. 
пример функции этого слоя - createdir(std::string)
<orignal> а не пох под винды то?
<Hypnosis_> думается что это оптимальный вариант, однако изменений 
будет масса для его внедрения
<orignal> не умножей сущности без надобности
<Hypnosis_> ну, можно вообще отказаться от поддержки винды
<orignal> отсавь как есть
<orignal> вот и откажись
<Hypnosis_> ну и заебись
<orignal> вот счас работает и хорошо
<orignal> зайись линкусом
<Hypnosis_> ок
<Hypnosis_> тогда закрываем все эти баги как wontfix и неебёт
<Hypnosis_> там целая пачка таких визуальных багов
<Hypnosis_> чисто виндовых
<Hypnosis_> и не только визуальных

bottomline: WONTFIX

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants