Ничего не понимаю с кодировками!!!
Модератор: Модераторы
Ничего не понимаю с кодировками!!!
Вообще я уже с подобными проблемами сюда обращался...
Проблема такая что мне нужно записывать в dbf файл строки зарание спроектированной длины, включающие русские символы (а может и символы любой другой страны), но они не влазят!!! Мне уже говорили удвоить поле и всё влезит, но тем не мение переодически строка срезается, или заместо последнего символа получается крякозябрик. Сколькими байтами кодируется символ UTF-8 и постоянная ли это величина?
И самая фатальная проблемма... как измерить длину строки в UTF-8 если она может содержать любые символы?
Проблема такая что мне нужно записывать в dbf файл строки зарание спроектированной длины, включающие русские символы (а может и символы любой другой страны), но они не влазят!!! Мне уже говорили удвоить поле и всё влезит, но тем не мение переодически строка срезается, или заместо последнего символа получается крякозябрик. Сколькими байтами кодируется символ UTF-8 и постоянная ли это величина?
И самая фатальная проблемма... как измерить длину строки в UTF-8 если она может содержать любые символы?
qivi писал(а):как измерить длину строки в UTF-8 если она может содержать любые символы?
В модуле LCLProc есть функция UTF8Length(), которая и ответит на Ваш вопрос.
Attid писал(а):qivi писал(а):постоянная ли это величина?
нет
А как она варьируется и насколько (до скольки байт)? Как в таком случае проектировать поля таблицы?
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
тебе же сказали смотри UTF8Length
http://ru.wikipedia.org/wiki/UTF-8
http://ru.wikipedia.org/wiki/UTF-8
Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.
тебе же сказали смотри UTF8Length
Да понял я что при помощи него мерить строки, я про то спрашиваю какого размера закладывать поле таблицы.
qivi писал(а):Да понял я что при помощи него мерить строки, я про то спрашиваю какого размера закладывать поле таблицы.
Когда все измеришь, найдёшь максимально длинную строку - узнаешь.
Когда все измеришь, найдёшь максимально длинную строку - узнаешь.
Если бы... строки то ясное дело вносятся в таблицу во время работы программы... может коротенькая, а может и по полной.
Почитал по ссылке http://ru.wikipedia.org/wiki/UTF-8, это получается. что бы целиком и полностью исключить накладки, необходимо заложить размер в 4 раза больше максимального количества символов!!!!!! Технически вобщемто всё просто но морально признаться был как то не совсем готов...
Когда ты проектируешь таблицу, ты длину поля закладываешь такую, чтобы влезла максимально длинная строка.
Из этого следует логический вывод - прежде чем проектировать таблицу, необходимо узнать, какова длина самой длиной строки.
Это азбука!
Из этого следует логический вывод - прежде чем проектировать таблицу, необходимо узнать, какова длина самой длиной строки.
Это азбука!
На сттроки я накладываю лимиты (просто принципиально достаточное количество символов + ещё чуть-чуть прозапас), допустим таблица А:
первое поле 128
второе поле 512
третье поле 128
А теперь получается что в итоге нужно закладывать:
512
2048
512
первое поле 128
второе поле 512
третье поле 128
А теперь получается что в итоге нужно закладывать:
512
2048
512
qivi писал(а):это получается. что бы целиком и полностью исключить накладки, необходимо заложить размер в 4 раза больше максимального количества символов!!!!!! Технически вобщемто всё просто но морально признаться был как то не совсем готов...
Я вообще думаю, что DBF-формат - морально устарел
А что мешает при сохранении преобразовывать UTF8 в OEM866? Лично я так и делаю. Приходится сдавать отчеты для исполкома и ПФ под их древний формат.
DBF может и устарел, но пока это единственная локальная база данных под Лазарус, всё необходимое для управления которой помещается в исполняемый файл.
А как будут отображать OEM866 DBGrid и DBMemo? Крякозябриками?
А как будут отображать OEM866 DBGrid и DBMemo? Крякозябриками?
VirtUX писал(а):А что мешает при сохранении преобразовывать UTF8 в OEM866?
Там выше уже было сообщение:
qivi писал(а):строки зарание спроектированной длины, включающие русские символы (а может и символы любой другой страны)
следовательно 866 однозначно не пойдёт - вдруг возникнет нужда одновременно заносить русские и французские буквы? Умуляты в 866 не поддерживает. И при преобразовании они все потеряются.
qivi писал(а):первое поле 128
второе поле 512
третье поле 128
А теперь получается что в итоге нужно закладывать:
512
2048
512
Берём самую длинную строку, берём максимальную длину символа: 4 байта. Если ты длину строки указал в символах, то вычисляем, сколько это будет в байтах:
512 х 4 = 2048
Следовательно, длину текстового поля нужно закладывать 2048 байт.
qivi писал(а):А как будут отображать OEM866 DBGrid и DBMemo? Крякозябриками?
Для этого преобразуем при загрузке файла OEM866 в UTF8. Естественно это нужно делать собственными средствами без TTable и пр.
Vadim писал(а):вдруг возникнет нужда одновременно заносить русские и французские буквы?
В таком случае конечно нет, но если только Any и English, тогда вполне возможно (не китайский
Могу помочь в написании преобразователя. У меня уже есть готовые UTF8ToOEM866, ...ToCP1251 и обратно, CP1251ToOEM866 и обратно. С удовольствием добавлю любое другое преобразование (не иероглифы и им подобные).
Ладно таблицы спроектированы, даже уже морально смирился с гипертрофированными размерами полей таблиц... новый косяк.
Когда забиваю полную строку и выполняется строка:
получается результат показанный на скрине... заместо последней буквы фигня какаято...
Если строка хоть на одну букву короче лимита, такого не происходит... может это связанно с тем что в компоненте Edit выставлен этот самый лимит и он дописывает какой то лишний бит... или наоборот срезает. Кстате если выполнить
строка отобразится корректно.
Как поправить то косяк?
Когда забиваю полную строку и выполняется строка:
Код: Выделить всё
FieldByName('nazvanie').AsString:=srs.Edit1.Text;получается результат показанный на скрине... заместо последней буквы фигня какаято...
Если строка хоть на одну букву короче лимита, такого не происходит... может это связанно с тем что в компоненте Edit выставлен этот самый лимит и он дописывает какой то лишний бит... или наоборот срезает. Кстате если выполнить
Код: Выделить всё
showmessage (srs.Edit1.Text);строка отобразится корректно.
Как поправить то косяк?
