Ничего не понимаю с кодировками!!!

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

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

Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Лимит строки в DB сделай такой UTF8Length(str)+1
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Дело не в нехватки поля базы!!!! Поле базы 512, тогда как в неё пишется строка из 128 русских символов которая уж 100% короче заложенных 512. Проблема в чём то другом.

Для ввода строки использую обычный Edit, в нём выставляю параметр MaxLength:=128, это может как то сказаться?
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Дело в том, что русские символы могут занимать 2 или 4 байта. Если, скажем, выделено поле на 40 байт, то это не значит, что влезет максимум 10 символов, а может от 10 до 20. Теперь представим ситуацию, что набрано 15 символов и ими занято 38 байт. 16-й символ 4-х байтный. Следовательно в showmessage корректно отобразятся 16 символов, а поле в таблице примет от 16-ого символа только первые 2-байта вместо 4-х. Вот Вам и кракозябра вместо нормального символа.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

VirtUX
Русские (Кириллица) символы занимают именно 2 байта! Диапазон в Unicode с 0x04001 по 0x04E9. Соответственно в UTF-8 будут иметь вид %110xxxxx %10xxxxxx
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Ребята... стойте... я вижу между нами повисло непонимани.

В 2 последних постах изложена информация которую я освоил и в которой разобрался... ещё раз попробую объяснить проблему:

Программа во время своей работы вносит в таблицу строковые данные, длина которых ограничена ПРОГРАММНО а не полями таблиц, поля же таблиц заданы согласно расчёта 4 байта на символ (максимум программно лимита * 4), таким образом ситуация "буквы не влезли" исключена категорически, пространство касательно русских символов избыточно!!!!

Таким образом я прошу помочь с ситуцией изложенной на моём посте со скрином И ЭТО ТОЧНО НЕ НЕХВАТКА МЕСТА В ПОЛЕ БАЗЫ!!!!
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Посмотри реальный размер строки Length(str) и сравни его с размером поля данных - узнаешь нехватка места или нет :wink:
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Ну я ведь специально расписал что вводимые строки ограничиваются ПРОГРАММОЙ, программа не допускает запись более 128 символов в поле показанное на скреншоте, тогда как заложено 512 байт!!!!

Код: Выделить всё

showmessage(inttostr(Length(srs.E1.Text)));


результат ровно 256!!!! Крякозябрик наместе!
Последний раз редактировалось qivi 03.11.2009 18:37:09, всего редактировалось 1 раз.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

qivi писал(а):программа не допускает запись более 128

как проверяешь длину ?

Добавлено спустя 1 минуту 12 секунд:
посмотри какой байт в этом кракозяке и в какой момент он там появляется
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Для ввода этих самых строковых данных я использую обычный Edit, а ему задаю параетр:

Код: Выделить всё

srs.E1.MaxLength:=128;

Таким образом вводимые строки ограничиваются 128 символами.

посмотри какой байт в этом кракозяке и в какой момент он там появляется

Появляется он там после:

Код: Выделить всё

FieldByName('nazvanie').AsString:=srs.E1.Text;

:D

А вот как посмотреть что это за байт я не придумал... но когда я два раза щёлкаю на строку в дбгриде и он её выделяет (на редактирование), этот символ в конце исчезает (неотображается), а когда я снимаю выделение со строки ничего не меняя он опять там.
ViTality
постоялец
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение ViTality »

qivi писал(а):Как поправить то косяк?
1111.png

конкретно в данном случае задавать максимальное четное количество
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

конкретно в данном случае задавать максимальное четное количество


В смысле чётное количество символов? Дак и так заданный лимит 128 символов...

Добавлено спустя 13 часов 43 минуты 26 секунд:
ЭВРИКА!!!! Понял что это за крякозябрик!!!!
результат ровно 256!!!! Крякозябрик наместе!


А поле TDBF типа String вмещает только 255 байт!!!!

Отсюдова новая и куда более серьёзна проблема... как быть с полем 1200 символов (4800 байт)? Какой тип полей TDBF поддерживает большие строки?
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Memo?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

qivi писал(а):А поле TDBF типа String вмещает только 255 байт!!!!

254. ;)
Для мемо-полей теоретически ограничения нет. На практике же надо проверять.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Меммо относится к данным не фиксированной длины, под него формируется отдельный файл, что честно говоря не желательно , а типа длинных определённой длины для строковых переменных большого размера в TDBF нету?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

qivi писал(а):а типа длинных определённой длины для строковых переменных большого размера в TDBF нету?

TDBF тут совершенно не при чём. Проблема в самом формате файла. TDBF лишь ориентируется на существующий формат, от себя она ничего не добавляет.
Ответить