SetThreadLocale для всего приложения Delphi
Моя программа Delphi (XE 10) использует устаревшую базу данных Firebird, не содержащую юникод (однобайтовую) (набор символов NONE), и поэтому ее данные (которые считываются или сохраняются в базе данных) зависят от языкового стандарта Windows для программ, не использующих юникод. В зависимости от этого параметра Windows в программе может отображаться тот же символ базы данных, что и \u0101 (это правильно) или \u0432 (это не правильно). IBX служит технологией доступа к БД.
Моя программа работает только для определенных локальных программ, не поддерживающих Юникод, и это приемлемо для клиента. Вопрос - как я могу заставить программу чувствовать конкретную предопределенную локаль независимо от настроек Windows?
Я думаю, что я должен использовать SetThreadLocale
за это. Но куда поставить этот звонок? Достаточно ли вызывать эту функцию в разделе инициализации формы Main, или я должен вызывать ее в исходном файле проекта (где инициализируется приложение), или, возможно, мне следует вызывать ее в разделах инициализации каждого модуля?
Из-за комментариев мне стало известно, что GetThreadLocale возвращает другое значение, чем GetUserDefaultLCID? Теперь я вижу, что я должен написать немного больше кода:
SetThreadLocale(my_preferred_locale_id);
SysLocale.DefaultLCID := my_preferred_locale_id;
GetFormatSettings;
Но главный вопрос все еще остается - где разместить этот код - должен ли я поместить его в несколько мест. У меня есть приложение WebSnap, и я думаю, что оно может иметь автоматическое и сложное управление протекторами под капотом. Куда должен идти код?
Ничего не помогает
- добавление lc_ctype=WIN1257 в TIBDatabase.Params
- настройка SetThreadLocale... здесь, там и везде
- настройка параметров проекта - информация о версии - язык - идентификатор локали
https://github.com/xupefei/Locale-Emulator Locale Emulator - единственный инструмент, который решает проблему, но почему Delphi не позволяет делать это без внешнего инструмента?
1 ответ
Как я также разместил в списке рассылки поддержки Firebird (любопытно, что у этого постера было другое имя, но та же проблема):
Для меня это звучит так, как если бы не ваша база данных, использующая NONE, вы также соединяетесь с набором символов NONE. Чтобы решить эту проблему, достаточно явно указать lc_ctype = win1257.
Я не знаю Delphi достаточно хорошо, но при условии, что Delphi внутренне использует Unicode, тогда он должен работать.