Bug 41885

Summary: wxGetEnv не работает с UTF-8
Product: Branch p10 Reporter: manowar <manowar>
Component: wxGTK3.0Assignee: Антон Мидюков <antohami>
Status: NEW --- QA Contact: qa-p10 <qa-p10>
Severity: normal    
Priority: P5 CC: manowar
Version: не указана   
Hardware: x86_64   
OS: Linux   
Attachments:
Description Flags
Исправление с зашитым UTF-8
none
Программа для проверки none

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 подгружается исправленная библиотека.