Отображение полей БД IBM Informix в кодировке UTF-8 в DBGrid

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

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

Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

Отображение полей БД IBM Informix в кодировке UTF-8 в DBGrid

Сообщение Vodnik »

Добрый день!
Подключаюсь к БД Informix посредством ODBC-драйвера. В настройках драйвера есть такие строчки:
odbc.png

Проект - один-в-один SQLdb_Tutorial1 https://wiki.freepascal.org/SQLdb_Tutorial1, прилагается Test.7z.
Test.7z

Если при обращении к таблице встречается текстовое поле с кодировкой в UTF-8 (предположительно), то приложение начинает выдавать ошибки одну за другой:
err1-3.png

После всего данные в DBGrid отображаются, но без строк, содержащих кириллицу:
(больше картинок прицепить нельзя :( , продолжу в следующем сообщении)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

а если ClientLocale ru_RU.UTF8?
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

Сообщение Vodnik »

alex, как раз хотел об этом сказать.
Если выставить ru-RU.UTF8, то в приложении возникает ошибка Informix "Unable to load location categories":
err4.png

Если выставить en-US.UTF8, то ошибки исчезают, записи отображаются, но в непреобразованном виде:
tables.png


Добавлено спустя 7 минут 45 секунд:
Re: Отображение полей БД IBM Informix в кодировке UTF-8 в DBGrid
На этом можно было бы успокоиться, написать обработчик GetText, но...
В БД более трёхсот таблиц с тысячами полей и мне доподлинно не известно, какие из них могут содержать кириллицу.
Неужели в Lazarus нет более красивого решения?
Мне попадалась фраза, что по умолчанию Lazarus работает с UTF-8. Что это значит? Данные отображаются так:
table.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

В этой БД не разбираюсь, но попробуйте погуглить на выданую ошибку:
Informix Client ODBC Driver Error: Unable to load locale catagoies
похоже на проблемы в настройке сервера и/или ODBC.

Лазарус-то работает в UTF-8, а вот драйвер вам дает данные в ASCII.
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

Сообщение Vodnik »

Ну как я уже писал, если Client Locale = en-US.UTF8 в настройках драйвера ODBC, то ошибок в приложении не возникает.
И я полагаю, драйвер в этом случае должен выдавать данные в UTF8, разве нет? Это можно как-то проверить?
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Меня ещё смушает серверная кодировка.
Что это за en_US.819? И есть ли в ней кирилические символы?
По хорошему в БД должен быть уникод - тот-же UTF8
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Возможно я ошибаюсь, но по-моему en-US.UTF8 должно конвертировать симоволы английской локали в UTF8. А откуда конвертору знать, что там русский сидит?
А что прописано в серверных настройках на самом сервере?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Vodnik писал(а):Неужели в Lazarus нет более красивого решения?

А при чём тут Lazarus, если прямо, чуть ли не по русски, написано, что это ошибка ODBC? :D Я не знаю, где Вы брали свой драйвер ODBC, обычно в интернетах советуют скачивать самый наипослелний IBM Informix Client SDK. Как правило это никому не помогало, поэтому поддержку конкретно русских кодировок (любых русских, специально подчёркиваю!) вводили в исходник ODBC ручками. Но поскольку это было уже давненько, возможно буржуины это дело уже поправили. Так что заходите на ихний сайт, качайте самое новьё, ставьте пробуйте... ;-)
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

Сообщение Vodnik »

alexs писал(а):Меня ещё смушает серверная кодировка.
Что это за en_US.819? И есть ли в ней кирилические символы?
По хорошему в БД должен быть уникод - тот-же UTF8


alex, полагаю, так исторически сложилось. БД разрабатывалась более 20 лет назад, относительно недавно в ней сделали поддержку кириллицы (возможно, нестандартными способами). Кодировка сервера en_US.819 выставляется драйвером по умолчанию, если ничего не указать. Если установить server locale = en_US.UTF8, то в приложении возникает ошибка ...locale mismatch.

Снег Север писал(а):А что прописано в серверных настройках на самом сервере?


Снег Север, я не знаю где это посмотреть :(

А как это всё работает в идеале - Lazarus отображает кириллицу без дополнительных процедур конвертации?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

alexs писал(а):Что это за en_US.819?

Согласно IBM'овской документации - стандартный английский, аналог кодовой страницы 8859-1.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Vodnik писал(а):Снег Север, я не знаю где это посмотреть

У вас нет физического доступа к серверу? Там должны быть конфигурационнные файлы, где такое прописывается. Так я понял из беглого просмотра вики по IBM Informix.

Vadim писал(а):А как это всё работает в идеале - Lazarus отображает кириллицу без дополнительных процедур конвертации?

В идеале настраивается 1) на сервере 2) в драйвере 3) в коннекшене, чтобы получать правильную кодировку. И Lazarus отображает в UTF8 любой текст на любом языке.

Добавлено спустя 14 часов 21 минуту 4 секунды:
Re: Отображение полей БД IBM Informix в кодировке UTF-8 в DBGrid
Vodnik писал(а):БД разрабатывалась более 20 лет назад, относительно недавно в ней сделали поддержку кириллицы (возможно, нестандартными способами)

Опять же, не знаю конкретно про IBM Informix, но с похожим сталкивался в MySQL с неюникодовской базой, в Делфи. Там кодировка базы была latin1, а в текстовых полях сидел иврит. Единственный рабочий вариант был - в соединении использовать latin1, а в настройках винды ставить иврит для неюникодовских символов. Но правильным решением должна быть конвертация всей базы в юникодовскую, к чему, в конечном итоге, и свелось дело.
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

Сообщение Vodnik »

Спасибо за поддержку, Снег Север!
Снег Север писал(а):У вас нет физического доступа к серверу? Там должны быть конфигурационнные файлы, где такое прописывается. Так я понял из беглого просмотра вики по IBM Informix.

Доступ есть, спасибо, буду копать, но... по условиям использования запрещено что-либо менять в БД.
Снег Север писал(а):В идеале настраивается 1) на сервере 2) в драйвере 3) в коннекшене, чтобы получать правильную кодировку. И Lazarus отображает в UTF8 любой текст на любом языке.

1 - разберусь,
2 - а что в драйвере предположительно должно быть:
Database Locale = en_US.UTF8
Client Locale = en_RU.UTF8
???
3 - речь об ODBCConnection1.CharSet=UTF8 ???
Снег Север писал(а):Опять же, не знаю конкретно про IBM Informix, но с похожим сталкивался в MySQL с неюникодовской базой, в Делфи. Там кодировка базы была latin1, а в текстовых полях сидел иврит. Единственный рабочий вариант был - в соединении использовать latin1, а в настройках винды ставить иврит для неюникодовских символов. Но правильным решением должна быть конвертация всей базы в юникодовскую, к чему, в конечном итоге, и свелось дело.

:( Упс... Добиться от разработчиков ковертации БД в юникодовскую мне вряд ли удастся. В винде для неюникодовских программ установлена кириллица. Пока добиться отображения кириллицы мне не удаётся. Написал обработчик onGetText, пробую различные функции преобразования строк типа UTF8ToWinCP, пока безуспешно.
Последний раз редактировалось Vodnik 24.10.2019 12:11:35, всего редактировалось 1 раз.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Vodnik писал(а):предположительно должно быть

Да вот у меня есть сомнения... Тут вам поспрашивать бы у спецов именно по Informix - эти настройки имеют мало отношения к специфике Лазаруса. Возможно, что вам надо выставить всюду "родную", не юникодовскую кодировку, а отображение русского пойдет за счет настройки винды. Но это чисто предположение. Вы понимаете что происходит сейчас? То ли сервер, то ли драйвер пытаются интерпретировать русские символы, как латинские спецсимволы и такими их запихивают в UTF8. Надо или вообще не преобразовывать, или как-то указать преобразование именно с русского в юникод. Как это сделать конкретно в вашем случае - просто не знаю.
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

Сообщение Vodnik »

Так я и собираюсь поступить.
А вот что сейчас происходит, я не совсем представляю.

Добавлено спустя 5 часов 20 минут 18 секунд:
Re: Отображение полей БД IBM Informix в кодировке UTF-8 в DBGrid
Полагаю, нужно попытаться избавиться от Лазарусовского исключения, когда он читает поле с кириллицей при дефолтных настройках ODBC:
err1-3.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Снег СеверVodnik
Граждане, что-то меня напрягать стало, что вы мне приписываете слова, которые я не говорил. Нельзя ли быть повнимательнее?
Ответить