Проблемы с кодировкой DefaultFormatSettings

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
ssl
новенький
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Проблемы с кодировкой DefaultFormatSettings

Сообщение ssl »

Lazarus 1.1 r42211M FPC 2.6.2 i386-win32-win32/win64
WinXP 32 русская.
При старте в DefaultFormatSettings строки читаются ANNSI-шные, 1251, а методы библиотек ожидают там UTF8, в результате вместо имён месяцев получаем строки вопросительных знаков.
Если DefaultFormatSettings перекодировать брутфорсом:

Код: Выделить всё

 
 for i:= low(LongMonthNames) to High(LongMonthNames) do
    LongMonthNames[i]:= a2s(LongMonthNames[i]);

- всё исправляется (a2s - это моя AnsiToUTF8String).

Для ThousandSeparator, кстати, у меня установлен пробел, а получаю я символ #160, что странно: пробел- он и в Африке пробел (#32)!
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

ssl писал(а):Для ThousandSeparator, кстати, у меня установлен пробел, а получаю я символ #160, что странно: пробел- он и в Африке пробел (#32)!


Это тоже пробел, но только неразрывный.
ssl
новенький
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Сообщение ssl »

Лекс Айрин писал(а):Это тоже пробел, но только неразрывный.


Да я "за"!!! :)
Только отображается он все равно как знак вопроса. В том же TCurrencyEdit, например.
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

а если использовать
UTF8Encode(LongMonthNames[i])
а не a2s результат такой же ?

Добавлено спустя 3 минуты 50 секунд:
он и в Африке пробел (#32)!
угу, как и Enter (сарказм :twisted: ).
ssl
новенький
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Сообщение ssl »

amateur писал(а):UTF8Encode(LongMonthNames[i])

Такой же. В смысле, это тоже работает.
А вот ThousandSeparator, естественно, остаётся #160 и в UTF8, и отображается (в контролах) как знак вопроса.
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

смысл не одинаков...
UTF8Encode - это дефолт лазаря, а то что у Вас - Х. Т.е. не известная Ваша реализация...

и то что отображает ThousandSeparator то же не известно в Вашей реализации...

Добавлено спустя 3 минуты 40 секунд:
кстати: первоначально у Вас было 32, а теперь 160, а что потом :lol:
ssl
новенький
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Сообщение ssl »

amateur писал(а):смысл не одинаков...

Нешто я так невнятно пишу?
Уважаемый, смысл совершенно в другом: Лазарь (или ФПЦ) под виндой инициализирует поля DefaultFormatSettings в ANSI - кодировке. А его же функции форматирования (и контролы) ожидают там - UTF8. Что я и подтвердил, перекодировав строковые поля DefaultFormatSettings.
По хорошему-то эта перекодировка должна выполняться сразу, в процедуре GetLocaleFormatSettings. А ещё лучше - использовать в GetLocaleStr не GetLocaleInfo, а сразу GetLocaleInfoW, с дальнейшим преобразованием utf16 в utf8. Что б вообще без ANSI-кодировок.
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

1. Лазарь чисто теоретически ютф. На практике моно голову сломать...
2. Вы написали что используете свою функцию (я предложил дефолтную). В лине данный вариант не нужен.
3. А вот с пробелом и другими конролами (конкретно TCurrencyEdit в Вашем варианте) х.з. что у Вас там происходит. Конкретно у меня данный вариант вопроса не давал никаких причин для проблем.

п.с.
Про данный конкретный случай уже писалось на форуме (Америку, к сожалению, Вы не открыли). Сами разрабы говорят о частичной поддержке ютф. Плюс, советую пользоваться фпс 2.7.1 (много нового, добавились глюки и т.д.).
И вот это:
По хорошему-то
для кого по хорошему? Латиница - нормально отображается. Вот и нет причин для беспокойства. А то что у Вас проблема с кириллицей, сам лазарь предлагает варианты решения. Нуно знать правила (для нас - баг) и корректно пользовать.
Ответить