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

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

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

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

Сообщение qivi » 02.11.2009 03:20:41

Вообще я уже с подобными проблемами сюда обращался...

Проблема такая что мне нужно записывать в dbf файл строки зарание спроектированной длины, включающие русские символы (а может и символы любой другой страны), но они не влазят!!! Мне уже говорили удвоить поле и всё влезит, но тем не мение переодически строка срезается, или заместо последнего символа получается крякозябрик. Сколькими байтами кодируется символ UTF-8 и постоянная ли это величина?

И самая фатальная проблемма... как измерить длину строки в UTF-8 если она может содержать любые символы?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Vadim » 02.11.2009 06:47:19

qivi писал(а):как измерить длину строки в UTF-8 если она может содержать любые символы?

В модуле LCLProc есть функция UTF8Length(), которая и ответит на Ваш вопрос. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение Attid » 02.11.2009 10:46:34

qivi писал(а):постоянная ли это величина?

нет
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

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

Сообщение qivi » 02.11.2009 11:51:47

Attid писал(а):
qivi писал(а):постоянная ли это величина?

нет


А как она варьируется и насколько (до скольки байт)? Как в таком случае проектировать поля таблицы?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Attid » 02.11.2009 12:09:14

тебе же сказали смотри UTF8Length


http://ru.wikipedia.org/wiki/UTF-8
Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

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

Сообщение qivi » 02.11.2009 12:17:12

тебе же сказали смотри UTF8Length

Да понял я что при помощи него мерить строки, я про то спрашиваю какого размера закладывать поле таблицы.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Vadim » 02.11.2009 12:31:34

qivi писал(а):Да понял я что при помощи него мерить строки, я про то спрашиваю какого размера закладывать поле таблицы.

Когда все измеришь, найдёшь максимально длинную строку - узнаешь. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение qivi » 02.11.2009 12:43:08

Когда все измеришь, найдёшь максимально длинную строку - узнаешь.


Если бы... строки то ясное дело вносятся в таблицу во время работы программы... может коротенькая, а может и по полной.


Почитал по ссылке http://ru.wikipedia.org/wiki/UTF-8, это получается. что бы целиком и полностью исключить накладки, необходимо заложить размер в 4 раза больше максимального количества символов!!!!!! Технически вобщемто всё просто но морально признаться был как то не совсем готов...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Vadim » 02.11.2009 13:31:53

Когда ты проектируешь таблицу, ты длину поля закладываешь такую, чтобы влезла максимально длинная строка.
Из этого следует логический вывод - прежде чем проектировать таблицу, необходимо узнать, какова длина самой длиной строки.
Это азбука!
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение qivi » 02.11.2009 13:56:50

На сттроки я накладываю лимиты (просто принципиально достаточное количество символов + ещё чуть-чуть прозапас), допустим таблица А:

первое поле 128
второе поле 512
третье поле 128

А теперь получается что в итоге нужно закладывать:

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

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

Сообщение VirtUX » 02.11.2009 14:10:11

qivi писал(а):это получается. что бы целиком и полностью исключить накладки, необходимо заложить размер в 4 раза больше максимального количества символов!!!!!! Технически вобщемто всё просто но морально признаться был как то не совсем готов...

Я вообще думаю, что DBF-формат - морально устарел :)
А что мешает при сохранении преобразовывать UTF8 в OEM866? Лично я так и делаю. Приходится сдавать отчеты для исполкома и ПФ под их древний формат.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

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

Сообщение qivi » 02.11.2009 14:18:02

DBF может и устарел, но пока это единственная локальная база данных под Лазарус, всё необходимое для управления которой помещается в исполняемый файл.

А как будут отображать OEM866 DBGrid и DBMemo? Крякозябриками?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Vadim » 02.11.2009 14:34:03

VirtUX писал(а):А что мешает при сохранении преобразовывать UTF8 в OEM866?

Там выше уже было сообщение:
qivi писал(а):строки зарание спроектированной длины, включающие русские символы (а может и символы любой другой страны)

следовательно 866 однозначно не пойдёт - вдруг возникнет нужда одновременно заносить русские и французские буквы? Умуляты в 866 не поддерживает. И при преобразовании они все потеряются.

qivi писал(а):первое поле 128
второе поле 512
третье поле 128

А теперь получается что в итоге нужно закладывать:

512
2048
512

Берём самую длинную строку, берём максимальную длину символа: 4 байта. Если ты длину строки указал в символах, то вычисляем, сколько это будет в байтах:
512 х 4 = 2048
Следовательно, длину текстового поля нужно закладывать 2048 байт.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение VirtUX » 02.11.2009 14:59:11

qivi писал(а):А как будут отображать OEM866 DBGrid и DBMemo? Крякозябриками?

Для этого преобразуем при загрузке файла OEM866 в UTF8. Естественно это нужно делать собственными средствами без TTable и пр.
Vadim писал(а):вдруг возникнет нужда одновременно заносить русские и французские буквы?

В таком случае конечно нет, но если только Any и English, тогда вполне возможно (не китайский :) ). Можно еще и CP1251 использовать. Точнее сказать - можно использовать любую однобайтную кодировку, подходящую под нужды для преобразования в UTF8 и обратно.
Могу помочь в написании преобразователя. У меня уже есть готовые UTF8ToOEM866, ...ToCP1251 и обратно, CP1251ToOEM866 и обратно. С удовольствием добавлю любое другое преобразование (не иероглифы и им подобные).
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

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

Сообщение qivi » 03.11.2009 15:45:22

Ладно таблицы спроектированы, даже уже морально смирился с гипертрофированными размерами полей таблиц... новый косяк.

Когда забиваю полную строку и выполняется строка:
Код: Выделить всё
FieldByName('nazvanie').AsString:=srs.Edit1.Text;

получается результат показанный на скрине... заместо последней буквы фигня какаято...

Если строка хоть на одну букву короче лимита, такого не происходит... может это связанно с тем что в компоненте Edit выставлен этот самый лимит и он дописывает какой то лишний бит... или наоборот срезает. Кстате если выполнить
Код: Выделить всё
showmessage (srs.Edit1.Text);

строка отобразится корректно.

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

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru