Значение LANG и некоторые другие функции для определения локали могут работать неправильно. У нас на реботе в какой-то mandrive koi8ru выдавался просто как RU.**. GetCodeset возвращает значение, которое заведомо подходит для использования в iconv.
Что каксается динамического создания значений. Если они вводятся пользователем или читаются с диска, то, как правило, нет необходимости их конвертировать, т.к. они создаются под текущей локалью.
Если берутся константы, resourcestrings, то обычно хватает:
- Код: Выделить всё
listbox.add(Localize(russian_string_constant));
Если надо заполнять листбокс сразу кучей готовых значений, сабитых в код, удобнее использовать объект или пользовательские процедуры (см.ниже).
Если речь идет о данных, поставляемых с программой, принцип тот же. У себя в программе я ввел в заголовок архива бланков параметр codeset, который автоматически устанавливается в значение codeset системы, где архив создается. Потом, когда программа впервые запускается на другой системе, она просматривает доступные архивы бланков и перекодирует имена файлов, комментарий к архиву, примечания к бланкам с использованием
- Код: Выделить всё
function uiconv(ic_usr:pointer; source:ansistring):ansistring ;
function uiconv_open(ic_from, ic_to:ansistring):pointer ;
procedure uiconv_close(ic_usr:pointer) ;
С gtk2 немного сложнее - я пока не разбирался.
Вопрос: если кто пользовался юнитом, не возникало проблем с резервируемым размером выходной строки (это может выражаться в отсечении конца или добавлении мусора в конец)?
По замыслу
- Код: Выделить всё
Result:=StringOfChar(#0, outlength);
и
Result:=TrimRight(Result);
должны это исключать, но х.з.?