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

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

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

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

Сообщение ssl » 31.07.2013 18:17:21

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

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

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

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

Сообщение Vadim » 31.07.2013 19:19:49

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

... байт. :D А символы кирилицы по 2 байта каждый.
Не забывайте об этом... ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение debi12345 » 31.07.2013 22:03:26

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

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

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

Сообщение ssl » 31.07.2013 22:59:23

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


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

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

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

Ладно, придётся и тут шашкой помахать :(
ssl
новенький
 
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

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

Сообщение debi12345 » 01.08.2013 00:23:55

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

Еще можно заказывать с запасом под WIDESTRING, но запихать данных сколько реально есть и дополнить как минимум 2-мя нулями (чтобы можно было вытащить как P[Wide]Char)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение ssl » 01.08.2013 16:33:39

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


О том и речь, что заказывает TStringField, который не перекроешь :( Ну или свой TExStringField регистрировать, что не хотелось бы.
Я, конечно, выкручусь, просто была надежда: вдруг я чего упустил.
ssl
новенький
 
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru