Размер строки в байтах (вне зависимости от кодировки)

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

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

Размер строки в байтах (вне зависимости от кодировки)

Сообщение qivi » 21.10.2013 16:36:32

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

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение SeZuka » 21.10.2013 16:50:52

А разве Length() не делает это самое штатно?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение qivi » 21.10.2013 17:04:41

В новом фпц при использовании директивы {$codepage UTF8} и строк типа UnicodeString он возвращает в символах.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение VirtUX » 21.10.2013 19:28:27

А если вычесть разницу между адресом первого символа @s[1] и адресом последнего @(s+chr(1))[Lenght(s + chr(1))]?
P.S. выделенное жирным считать объяснением, а не кодом ;)
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение zub » 21.10.2013 19:42:35

думаю должен прокатить такой вариант
Код: Выделить всё
SizeInBytes:=Length(s)*SizeOf(s[1]);
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение VirtUX » 21.10.2013 20:09:24

zub писал(а):думаю должен прокатить такой вариант

не прокатит! Т.к. в UTF8 один символ может занимать от 1-ого байта до минимум 4-х. И если s[1] будет из области 0...128, то Вы всю строку идентифицируете как строку в однобайтной кодировке. А ведь первый символ может и 2, и 3, и 4 байта быть ;)
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение zub » 21.10.2013 20:15:43

прокатит, прокатит - в описаном вами случае SizeOf(s[1])=1, а length сразу вернет размер строки в байтах так как он не парсит символы. У ТС насколько я понимаю строки в utf16 ибо {$codepage UTF8}, тогда length это размер в символах, а SizeOf размер символа - т.е. 2.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение VirtUX » 21.10.2013 20:47:36

UTF-8 и UTF-16 гласят об не постоянном размере одного символа.
Не знаю как там у ТС (да и что такое ТС я тоже не знаю), но название темы указывает на "вне зависимости от кодировки". Я так понимаю, что нужно учесть, что строка содержащая 2 символа в UTF-8 кодировке может занимать в памяти: 2, 3, 4, 5, 6 ... до 12 байт. Т.о. если первый символ будет занимать 2 байта, а второй - один байт, то вся строка будет занимать в памяти 3 байта. А следуя вашей формуле - 4 байта, что не является истиной.
Очень извиняюсь, если не прав..........
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение zub » 21.10.2013 21:18:27

ИМХО
length не оперирует "парными" символами, он их посчитает разными и если один символ в утф8 строке занимает 4 байта то и length вернет 4. Для подсчета именно символов с учетом суррогатов (или как они называются) есть UTF8Length
В утф16 и других кодировках думаю логика такаяже, отличается только минимальный размер символа. И sizeof(s[1]) должен вычисляться не на основе фактического содержимого строки, а на основе типа строки (в последних версиях на основе инормации о кодировке из строки), т.е.
кострукция вида:
Код: Выделить всё
  s:='';
  writeln(sizeof(s[1]));

вполне работоспособна (проверил на 2.7.1) несмотря на то что самого s[1] какбы и нету вовсе
ТС - топик стартер
Тоже извиняюсь если неправ....))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение SeZuka » 22.10.2013 08:40:23

qivi писал(а):В новом фпц при использовании директивы {$codepage UTF8} и строк типа UnicodeString он возвращает в символах.

Для Length вообще пофиг в какой кодировке строка, он смотрит только на тип параметра и для UnicodeString надо результат просто умножать на 2, так как двух байтовые символы.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение SSerge » 22.10.2013 08:49:11

Насколько помню, ВСЕ строки, кроме ShortStrings, - zero terminated для совместимости с Си.
Дык, найти адрес первого элемента. Найти адрес нулевого байта за последним элементом. Между ними - длина массива в байтах.
Для параноидальности. )) Если считать, что нулевого байта нет. Найти адрес первого символа. Найти адрес последнего символа. Вычислить разницу. Найти ширину в байтах последнего символа. К разнице приложить. ))
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение qivi » 23.10.2013 10:01:01

Меня не было некоторое время, спасибо за подсказки.

Можно конечно и без пароноидальности, но из за (пока что) недостатка информации, неопределённости "как жить далее" с этими строками в новом FPC 2.7.1, задумываешся о независимости от кодировки. Больше всего напрягает утф8, со своей непостоянной длиной кода символа (реально задействованные коды от 1 до 6).

>>UTF-8 и UTF-16 гласят об не постоянном размере одного символа.
УТФ16 с постоянной длиной кода символа.

Для Length вообще пофиг в какой кодировке строка, он смотрит только на тип параметра и для UnicodeString надо результат просто умножать на 2, так как двух байтовые символы.


Насколько я понял из тех немногочисленных и не официальных материалов, UnicodeString это не строго утф16, её можно заставить содержать строки и в других кодировках (но как я уже говорил неопределённость), отсюдова и удивляет что при директиве {$codepage UTF8} строка должна содержать утф16... или эта деректива не влияет на строку и предопределяет кодировку неявного перекодирования?

П.С.: Сейчас в вики глянул... оказывается утф16 первый юникод, а утф8 появился только через год... а я всегда был уверен что утф8 это первый "блин комом"... хотя понятно что в 91-92 году конечно объём занимаемой памяти постоянной и оперативной имел другой вес и значение... видимо как то так не хватило дальновидности и стратегического тяму.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение Vadim » 23.10.2013 11:30:31

qivi писал(а):УТФ16 с постоянной длиной кода символа

Нет, не так. Там минимальный размер - 2 байта, в отличие от UTF8. Дело в том, что это порождение Микрософт у которой до этого был уже Unicodе, но только с фиксированной 2-ухбайтной длиной. Чтобы не переделывать английский алфавит опять (китайский, японский, корейский языки в этот ранний Unicode не влезали), добавили доп. пару байт для более ёмких языков-символов. В UTF-16 есть определённый диапазон кодов, который в стандартной кодировке не используется и в этом диапазоне добавляются эти самые дополнительные байты.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение SeZuka » 23.10.2013 14:51:38

qivi писал(а): отсюдова и удивляет что при директиве {$codepage UTF8} строка должна содержать утф16... или эта деректива не влияет на строку и предопределяет кодировку неявного перекодирования?

Вроде как {$codepage UTF8} указывает компилятору на то, в какой кодировке находится исходник, то есть в какой кодировке компилятор получает строковые константы из исходника, и на работу готовой программы не влияет.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Размер строки в байтах (вне зависимости от кодировки)

Сообщение qivi » 23.10.2013 15:16:29

Код: Выделить всё
Вроде как {$codepage UTF8} указывает компилятору на то, в какой кодировке находится исходник, то есть в какой кодировке компилятор получает строковые константы из исходника, и на работу готовой программы не влияет.


Вобще то влияет, как минимум при этой директиве Length возвращает в символах длину строк типа UnicodeString, а без неё в байтах. Так же при этой директиве все операторы для работы со строкой работают со строками типа UnicodeString посимвольно.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru