TDataSet и национальные кодировки

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

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

TDataSet и национальные кодировки

Сообщение ssl »

Перевожу проект с Дельфи, есть свой наследник от TDataSet. Пришлось залезть в исходники TDataSet, и с удивлением обнаружил, что нормально вычитать из БД строки не получается :(. По порядку:

- в таблице строки хранятся в ASCII-кодировке;
- поле TDataSet типа ftString;
- TStringField.AsString вызывает GetValue, который распределяет выходной буфер размером DataSize и передает его в TDataSet.GetFieldData;
- После может быть вызван метод Transliterate, но ему снова принимающий буфер распределяется размером DataSize, и в UTF всё равно никак не странслировать.
Единственный выход сейчас - объявлять Size у таких полей в три раза больше и сразу перекодировать в UTF8.
Между тем Transliterate вполне можно переделать на работу с выходной строкой, а не буфером, и тогда все проблемы снимаются.

Или я чего не понимаю?
Я собрал примитивный пример: создал новое приложение, на форму положил TMemDataSet, создал в нем одно поле string длиной 12, активировал и подсоединил DbGrid. Как и следовало ожидать: ввести в поле можно все 12 символов кирилицы, но сохраняется меньше :(
Переходим на WideString?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

ssl писал(а):на форму положил TMemDataSet, создал в нем одно поле string длиной 12

... байт. :D А символы кирилицы по 2 байта каждый.
Не забывайте об этом... ;)
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Фантастика - со знаком минус. Даже этот важнейший аспект еще до ума не доведен.

Хинт : используйте настройку возвращаемой кодировки, предоставляемую клиентом БД
ssl
новенький
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Сообщение ssl »

Vadim писал(а):... байт. :D А символы кирилицы по 2 байта каждый


О чём и спич. Не могу вернуть больше, чем описано в поле. Я могу, конечно, объявлять Size в два раза больше, но на него и гриды всякие
ориентируются, и прочие компоненты - считают, что в поле столько симолов. "Неаккуратненько, доктор".

debi12345 писал(а):Хинт : используйте настройку возвращаемой кодировки, предоставляемую клиентом БД

Ха! Клиента я сам пишу, клиент UTF8 возвращает. Могу в UTF16 переделать, но дела это не меняет: всё равно Size у поля придётся в байтах указывать. Что будет путать контролы и разработчиков.

Ладно, придётся и тут шашкой помахать :(
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Могу в UTF16 переделать, но дела это не меняет: всё равно Size у поля придётся в байтах указывать

Еще можно заказывать с запасом под WIDESTRING, но запихать данных сколько реально есть и дополнить как минимум 2-мя нулями (чтобы можно было вытащить как P[Wide]Char)
ssl
новенький
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Сообщение ssl »

debi12345 писал(а):Еще можно заказывать с запасом...


О том и речь, что заказывает TStringField, который не перекроешь :( Ну или свой TExStringField регистрировать, что не хотелось бы.
Я, конечно, выкручусь, просто была надежда: вдруг я чего упустил.
Ответить