> > Ну так вот. Переходим к сути моего, так сказать, спича - тип CHAR в
> > плане приема-передачи UTF8 данных - отстой полный.
>
> Позвольте мне вам не позволить. В чем проблема с UTF-8 в CHAR?
> Максимальный размер строки (которая, к тому же ограничена нулем) в
> байтах тебе известен. Подсчет количества символов делается в один
> проход.

Смотри.

Мы подключаемся к базе win1251 с использованием UNICODE_FSS.
Соответственно все наши буферы будут увеличины в трое.

При загрузке данных - все нормально. Сервер видит, что буфер
достаточного размера и туда все запихивает. Что там на клиенте - это
уже наши проблемы.

Обратная передача. Пишем в тройной CHAR-буфер однобайтные символы.
Ровно N сиволов. Чем хвост (2*N байт) будем забивать? Для текстовых
CHAR-ов забиваем пробелами. Для OCTETS-CHAR-ов забиваем нулями.

С обычными колонками не эксперементировал, а вот с CHAR-массивами при
записи такая фигня: сервер пытается отконвертировать все 3*N байт
(UNIСODE_FSS) в N-байт (win1251). Получаем анус с переполнением.

А почему? Потому что как ему сказать, что в этом огромном (3*N) буфере
у нас только N байт c данными?

Никак - и это у CHAR-ов на конструктивном уровне.

> Ну с уникодом никто легкой жизни не обещал.

Да нет там ни каких проблем. С Юникодом. Вот с NONE - это оказывается
реальная засада.

> З.Ы. А в плане того, что оно криво передается в массиве - раз это
> обнаружили только сейчас, то наверняка НИКТО это не использовал. Был
> такой фараон - Ибо Нех. Наверняка птицеводы думают - оставить багу как
> есть или вообще массивы похерить нах? ;-)

Там эту багу поправить и заменить strlen для CSTRING элементов на
нечто более надежное - и можно еще на 8 лет забыть :))

Коваленко Дмитрий.

Ответить