[Решено] Проблема с кодировкой UIB + Firebird

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

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

Ответить
artkil
незнакомец
Сообщения: 9
Зарегистрирован: 18.11.2011 14:07:29

[Решено] Проблема с кодировкой UIB + Firebird

Сообщение artkil »

Здравствуйте.

Есть БД, в ней все данные в UTF8. Есть строковые литералы в программе, например:

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

var
 s: string;
begin
 s := 'пример' + qTemp.Fields['FField1'];
end.


В параметрах TUIBDatabase явно кодировку не задаю. И если например сохранить строку s в БД, например:

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

var
 s: string;
begin
 s := 'пример' + qTemp.Fields['FField1'];
 qTemp.Close;
 qTemp.SQL.Text := 'UPDATE Table1 SET FField1 = ' + QuotedStr(s);
 qTemp.ExecSQL;
end.

То часть "пример" сохраниться кракозябрами, а та часть, которая была взята из БД сохраняется нормально.
Система: Ubuntu amd64. Все локали выставлены ru_ru.UTF8. Пробовал менять на ru_ru.CP1251, не помогло. В windows работает все нормально.
Помогите разобраться в чем дело.

Добавлено спустя 52 минуты 6 секунд:
Если можно пересобрать lazarus под другую локаль, то как это сделать?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

А как конкретно выглядят эти кракозябры (+ читаемый текст, пожалста).
artkil
незнакомец
Сообщения: 9
Зарегистрирован: 18.11.2011 14:07:29

Сообщение artkil »

Порт 1. РќРѕСЂР�Р°

Дожно быть "Порт 1. Норма".

Добавлено спустя 2 минуты 45 секунд:
Задал кодировку у TUIBDatabase.CharacterSet=csWIN1251. Текст стал такой:

Порт 1. РќРѕСЂРјР°
Порт 1. Норма

Добавлено спустя 50 секунд:
По умолчанию кодировка у компонента выставляется csUTF8.

Добавлено спустя 1 минуту 55 секунд:
Я думаю что все дело в строковых константах, которые лазарус как-то не так кодирует, как в windows. Наверное способ кодировки зависит от локали.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Возможно все дело в кодировке исходника - правой кнопкой в редакторе - "Параметры файла" - "Кодировка".
Ага, увидел Ваш ответ. Возможно дело в двойном перекодировании. Попробуйте определять строковые переменные как WideString или использовать UTF8Decode(s)+qTemp.Fields['Field1']
artkil
незнакомец
Сообщения: 9
Зарегистрирован: 18.11.2011 14:07:29

Сообщение artkil »

Проверил через Firefox строку РџРѕСЂС‚ это UTF8 сохраненная как Win1251.

Добавлено спустя 49 секунд:
UTF8Decode делает только хуже. Строка РџРѕСЂС‚ разрастается еще в 2 раза.

Добавлено спустя 4 минуты 27 секунд:
Возможно все дело в кодировке исходника - правой кнопкой в редакторе - "Параметры файла" - "Кодировка".


Спасибо большое, помогло.
Ответить