Bug 41885 - wxGetEnv не работает с UTF-8
Summary: wxGetEnv не работает с UTF-8
Status: NEW
Alias: None
Product: Branch p10
Classification: Unclassified
Component: wxGTK3.0 (show other bugs)
Version: не указана
Hardware: x86_64 Linux
: P5 normal
Assignee: Антон Мидюков
QA Contact: qa-p10@altlinux.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-02-08 01:00 MSK by manowar@altlinux.org
Modified: 2022-02-08 01:04 MSK (History)
1 user (show)

See Also:


Attachments
Исправление с зашитым UTF-8 (341 bytes, patch)
2022-02-08 01:00 MSK, manowar@altlinux.org
no flags Details | Diff
Программа для проверки (202 bytes, text/x-c++src)
2022-02-08 01:02 MSK, manowar@altlinux.org
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description manowar@altlinux.org 2022-02-08 01:00:39 MSK
Created attachment 10259 [details]
Исправление с зашитым UTF-8

При работе с KiCAD столкнулся с тем, что библиотеки проекта не находятся, если путь до проекта содержит русские буквы. Библиотеки проекта ищутся относительно переменной окружения KIPRJMOD. И оказалось, что если там есть что-то кроме ASCII, то wxGetEnv() возвращает пустую строку.

Насколько я понимаю, проблема там на стр. 1330 модуля utilsunx.cpp (http://git.altlinux.org/gears/w/wxGTK3.0.git?p=wxGTK3.0.git;a=blob;f=src/unix/utilsunx.cpp;h=b9664094228d2deb1a7a00709dfac073734c8bfc;hb=3274364fc9016f31e61c8fd489fcb7a8ac9e33d9#l1330):

1321 bool wxGetEnv(const wxString& var, wxString *value)
1322 {
1323     // wxGetenv is defined as getenv()
1324     char *p = wxGetenv(var);
1325     if ( !p )
1326         return false;
1327 
1328     if ( value )
1329     {
1330         *value = p;
1331     }
1332 
1333     return true;
1334 }

Здесь char* присваивается wxString*. Магия C++, конечно, создаёт объект, но о кодировке она ничего не знает. И в результате из непустой char* получаем пустую wxString.

Исправление, на первый взгляд, кажется тривиальным (прикладываю) — но только, если забыть о том, что кроме UTF-8 существуют и другие кодировки.

P.S. Завожу ошибку в p10, поскольку проверял на нём. Но похоже, что эта проблема должна быть и в Сизифе, и на wxGTK3.1. Потому что везде один и тот же код. Хотя, возможно, отличаются конструкторы.
Comment 1 manowar@altlinux.org 2022-02-08 01:02:28 MSK
Created attachment 10260 [details]
Программа для проверки
Comment 2 manowar@altlinux.org 2022-02-08 01:04:07 MSK
Прикладываю прогу, которой проверял:

[builder@localhost ~]$ echo $LANG
ru_RU.UTF-8

[builder@localhost ~]$ TESTVAR='Проверка' ./wxGetEnv_test 
Test string: "".

[builder@localhost ~]$ LD_PRELOAD=./libwx_baseu-3.0.so TESTVAR='Проверка' ./wxGetEnv_test 
Test string: "Проверка".

В последнем случае через LD_PRELOAD подгружается исправленная библиотека.