FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Общие вопросы программирования, алгоритмы и т.п.

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

FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение Виталий » 21.03.2016 12:16:28

Всем привет. Работаю с Firebird 1.5 (2.5).
Простейший код:
Код: Выделить всё
  IBConnection1.CharSet:='WIN1251';
  IBConnection1.Connected:=true;
  SQLTransaction1.Active:=true;
  SQLQuery1.SQL.Text:='select USERNAME from admins';
  SQLQuery1.Open;
  Caption:=AnsiToUtf8(SQLQuery1.Fields[0].AsString);
  SQLQuery1.Close;

На Лазарусе 1.2.6 c FPC 2.6.4 получаю текст по-русски. (именя юзеров кириллицей) Кириллица отображается нормально.
На Лазарусе 1.6RC2 с FPC 3.0.0 получаю не очень понятно что (см. скрин)
Проблемы только у кириллицы. Кодировка БД 1251.

Вопрос: Кто-нибудь знает, что с компонентами FB в новой версии Лазаря произошло, что текст кириллицы возвращается непонятно как?
Что это за болячка новая, и как ее полечить?
Вложения
Безымянный.png
Безымянный.png (1.9 КБ) Просмотров: 11878
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение ssadragon » 21.03.2016 12:35:58

Я бы вам посоветовал перейти на
Код: Выделить всё
IBConnection1.CharSet:='UTF8';

и вы избавитесь от проблем с кодировками и перекодировками (AnsiToUtf8) в своей программе
Но в таком случае придется пересоздать базу
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение SSerge » 21.03.2016 13:01:00

ssadragon писал(а):Что это за болячка новая, и как ее полечить?


А убрать AnsiToUtf8 не пробовалось?
Вы прочли соответствующие мурзилки, в которых описано, чем поддержка строк в 3.х отличается от таковой в 2.6 и что на практике означает default code page ut8 в RTL, включенная по умолчанию в новых лазарусах?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение Виталий » 21.03.2016 14:40:24

ssadragon писал(а):и вы избавитесь от проблем с кодировками и перекодировками (AnsiToUtf8) в своей программе
Но в таком случае придется пересоздать базу

Нет, это недопустимо. Я не АБД, так что базу трогать не имею прав.
SSerge писал(а):А убрать AnsiToUtf8 не пробовалось?

Пробовалось. Не то пальто. И TEncode тоже пробовал. Все равно кракозяблики.
SSerge писал(а):Вы прочли соответствующие мурзилки, в которых описано, чем поддержка строк в 3.х отличается от таковой в 2.6 и что на практике означает default code page ut8 в RTL, включенная по умолчанию в новых лазарусах?

Нет. Этого не читал. Можно ссыль?
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение SSerge » 21.03.2016 16:47:26

SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение Виталий » 21.03.2016 17:43:17

Ага, понял. Спасибо - это нужное направление.
Теперь я понял как решить свою задачу.
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение sign » 22.03.2016 07:36:54

Начал писать справку в html файлах.
Содержимое загружаю посредством TStringList и подаю на TIpHtmlPanel.SetHtmlFromStr(NewHtml : string);
Пока использовал Notepad++, всё было в порядке.
А тут нужно было чуток подправить и я поправил файл редактором TigerPad. У него удобно цвета подбирать.
И всё. Кракозябры.
Стал разбираться.
Оказалось, что Notepad++ делает utf8 с BOM, а TigerPad его удаляет, да ещё и в cp1251 пишет.
Поскольку хотелось редактировать файлы и тем и тем редактором, выход нашёл вот в таком коде:
Код: Выделить всё
function Loadutf8BOM(const Path: String): String;
var L: TStringList;
    C: String;
begin
  if FileExistsUTF8(Path) then begin;
    L := TStringList.Create;
    L.LoadFromFile(Path);
    Result := L.Text;
    C := GuessEncoding(Result);
    if C = 'cp1251' then Result := UTF8ToUTF8BOM(CP1251ToUTF8(Result));
    L.Free;
  end else Result := '';
end;

PS
Я не использовал прямую загрузку html файла в компонент, поскольку далее идёт ещё работа с текстом, перед тем, как показать.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: FPC 3.0.0 Lazarus 1.6RC2, Firebird - странная кодировка

Сообщение sign » 28.03.2016 13:28:25

Налетел на проблему.

Смысл - работаю с uOpenOffice.
Открываю файл - электронную таблицу - для записи некоторых данных.
Поскольку есть русские буквы в пути, то для открытия документа использую FilePath := ConvertToURL(UTF8ToSys(FileName)) = 'file:///C:/CTO/Закупки/2016_Март.ods'
Пока программа пишет в этот документ, всё в порядке.
Но как только я руками что-то там изменю и сохраню, то программа перестаёт видеть открытый файл, потому что имя файла становиться вот таким:
'file:///C:/CTO/%D0%97%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8/2016_%D0%9C%D0%B0%D1%80%D1%82.ods'
Поскольку в uOpenOffice идёт проверка по имени файла, что определённый файл уже открыт, то проверка даёт False и возникает ошибка при попытке снова открыть открытый файл.

Никак не могу подобрать функцию преобразования.
Руками делать не хочется.
Кто-то знает, как преобразовать строку в приёмлемый результат?

GuessEncoding(V.URL) - и первом случае, и во втором - utf8
В первом случае - 'file:///C:/CTO/Закупки/2016_Март.ods' - работа программы.
Во втором случае - 'file:///C:/CTO/%D0%97%D0%B0%D0%BA%D1%83%D0%BF%D0%BA%D0%B8/2016_%D0%9C%D0%B0%D1%80%D1%82.ods' - после изменения и сохранение руками открытого программой документа.

Добавлено спустя 1 час 52 минуты 9 секунд:
Блин, время поджимает, сделал наскоро, тупо перебором.
Благо, что редко вызов происходит. Не в цикле.
Код: Выделить всё
var URLCode: array[1..132] of string =(
'Ё', '%d0%81', 'А', '%d0%90', 'Б', '%d0%91', 'В', '%d0%92', 'Г', '%d0%93', 'Д', '%d0%94', 'Е', '%d0%95', 'Ж', '%d0%96', 'З', '%d0%97', 'И', '%d0%98',
'Й', '%d0%99', 'К', '%d0%9a', 'Л', '%d0%9b', 'М', '%d0%9c', 'Н', '%d0%9d', 'О', '%d0%9e', 'П', '%d0%9f', 'Р', '%d0%a0', 'С', '%d0%a1', 'Т', '%d0%a2',
'У', '%d0%a3', 'Ф', '%d0%a4', 'Х', '%d0%a5', 'Ц', '%d0%a6', 'Ч', '%d0%a7', 'Ш', '%d0%a8', 'Щ', '%d0%a9', 'Ъ', '%d0%aa', 'Ы', '%d0%ab', 'Ь', '%d0%ac',
'Э', '%d0%ad', 'Ю', '%d0%ae', 'Я', '%d0%af', 'а', '%d0%b0', 'б', '%d0%b1', 'в', '%d0%b2', 'г', '%d0%b3', 'д', '%d0%b4', 'е', '%d0%b5', 'ж', '%d0%b6',
'з', '%d0%b7', 'и', '%d0%b8', 'й', '%d0%b9', 'к', '%d0%ba', 'л', '%d0%bb', 'м', '%d0%bc', 'н', '%d0%bd', 'о', '%d0%be', 'п', '%d0%bf', 'р', '%d1%80',
'с', '%d1%81', 'т', '%d1%82', 'у', '%d1%83', 'ф', '%d1%84', 'х', '%d1%85', 'ц', '%d1%86', 'ч', '%d1%87', 'ш', '%d1%88', 'щ', '%d1%89', 'ъ', '%d1%8a',
'ы', '%d1%8b', 'ь', '%d1%8c', 'э', '%d1%8d', 'ю', '%d1%8e', 'я', '%d1%8f', 'ё', '%d1%91');

function TestUTF(const S: String): String;
var i, k, l: Integer;
begin
  Result := LowerCase(S);
  i := 1;
  while i < High(URLCode) do begin
    Result := ReplaceStr(Result, URLCode[i+1], URLCode[i]);
    i += 1;
  end;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru