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, тогда он должен работать.

Другие вопросы по тегам