Как Посчитать Размер Строки В Байтах?

Serduko

Well-known member
11.10.2011
170
0
#1
У меня есть массив строк, которые я хочу добавить в множественное поле. Но поскольку поле ограничено размером 32 кб, то в случае слишком большого массива, можно потерять информацию. Подскажите как посчитать размер строк в байтах, хочется это сделать до того как добавлять в поле? Возможно это Len, но при добавлении в поле, размер поля увеличивается несоразмерно со строкой, поэтому не уверен. Знаю, что размер поля можно посчитать (Valuelength), но не хочется загружать систему, поскольку придется добавлять каждую ячейку в поле отдельно, а потом проверять ее размер.
 

garrick

Lotus team
26.10.2009
894
61
#3
Len - это длина строки в символах, размер каждого символа в байтах зависит от кодировки. Нужно длину строки умножить на кол-во байт в символе (2 или 4 не помню точно) в зависимости от от вашей кодировки.
 

Serduko

Well-known member
11.10.2011
170
0
#4
Думал об этом, интерактивность сложно реализуема.

Len - это длина строки в символах, размер каждого символа в байтах зависит от кодировки. Нужно длину строки умножить на кол-во байт в символе (2 или 4 не помню точно) в зависимости от от вашей кодировки.
Ansi, один байт. Вероятно, все таки поле хранит доп. информацию, наверно, посчитать сколько строка займет места в поле невозможно без добавления.
 

garrick

Lotus team
26.10.2009
894
61
#5
Ansi - на сколько я понимаю, это только латинские буквы, у вас скорее всего unicode.
 

savl

Lotus team
28.10.2011
2 131
102
#7
Serduko
Интерактивность? Какого рода?
Если просто загнать и максимальная функциональность: редактирование, копирование, вставка. RT вполне подойдет.
Отображать в виде, поиск по значению в базе: не подойдет...
Если загонять в многозначное текстовое, я бы предварительно весь этот текст обработал: убрал бы пустые сроки, запрещенные символы(неразрывные пробелы, лишние пробелы и т.д.) Это часто бывает при вставке из email.
Есть еще вариант... подсчитать, но совсем дикий) Записать в файл по байтам весь текст и взвесить.
Txt файл хранит только текст, размер пустого файла: 11 байт (если не путаю), а размер пустого word 11Кб

И так, инетерсно, если текст окажется больше, что делать будете?
 

Serduko

Well-known member
11.10.2011
170
0
#9
Serduko
Интерактивность? Какого рода?
Если просто загнать и максимальная функциональность: редактирование, копирование, вставка. RT вполне подойдет.
Отображать в виде, поиск по значению в базе: не подойдет...
Если загонять в многозначное текстовое, я бы предварительно весь этот текст обработал: убрал бы пустые сроки, запрещенные символы(неразрывные пробелы, лишние пробелы и т.д.) Это часто бывает при вставке из email.
Есть еще вариант... подсчитать, но совсем дикий) Записать в файл по байтам весь текст и взвесить.
Txt файл хранит только текст, размер пустого файла: 11 байт (если не путаю), а размер пустого word 11Кб

И так, инетерсно, если текст окажется больше, что делать будете?
Это некоторое подобие реляционных таблиц. Строка обработана, удалены лишние символы и пр., содержит данные с разделителем.
Соответственно, программа активно работает с этими данными.

Если текст будет больше 32, то программа автоматически переносит его на следующее поле (количество полей - любое, просто передаю их в массиве в функцию), ну а если все равно не влазит, тогда массив строк обрезается и выдается ошибка (не критичная). Сейчас массив строк обрезаю "на глаз", но хотелось бы большей эффективности.

PS благодаря ООП, если будет связь с SQL, с мин затратами переведу на него.

Добавлено:
Хранить XML в RTF поле? Удобно разбирать потом будет.
Хм., интересно. Вот только вопрос, как интерактивно менять данные в RT поле не сохраняя и не закрывая документ?
 

Serduko

Well-known member
11.10.2011
170
0
#11
Ну тогда у вас по всем законам физики длина строки в символах должна совпадать с количеством байт в этой строке, т.е. используйте Len.
Должна, но не совпадает с полем, где то в 1,5 раза больше (увеличивается в арифметической прогрессии).
 

garrick

Lotus team
26.10.2009
894
61
#12
Хм., интересно. Вот только вопрос, как интерактивно менять данные в RT поле не сохраняя и не закрывая документ?
Не понял. А зачем? Поработайте "интерактивно", держа XML в памяти, по завершению работы сохраните результаты. Вы же не будете пользователю показывать этот XML. Зачем его обновлять в поле?
 

Serduko

Well-known member
11.10.2011
170
0
#13
Не понял. А зачем? Поработайте "интерактивно", держа XML в памяти, по завершению работы сохраните результаты. Вы же не будете пользователю показывать этот XML. Зачем его обновлять в поле?
Полей может быть несколько, + диалоги.
 

savl

Lotus team
28.10.2011
2 131
102
#14
Ничего не понял... Несколько полей? диалоги? Оо
Вы через документ и эти поля хотите данные в SQL-ую базу транслировать "на лету" что ли?
 

Serduko

Well-known member
11.10.2011
170
0
#15
Ничего не понял... Несколько полей? диалоги? Оо
Вы через документ и эти поля хотите данные в SQL-ую базу транслировать "на лету" что ли?
Да, не хочу, а уже могу )). Просто я привел, вырванный из контекста, пример-проблему хранения данных в теле документа.
 

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#16
Должна, но не совпадает с полем, где то в 1,5 раза больше (увеличивается в арифметической прогрессии).
нотусня хранит не вин1251, для русского, по понятным причинам (иначе былоб виндозонли)
стоит пошукать на тему
Length limit for a macro language string literal 2048 bytes Note Strings in formula language are represented internally in the LMBCS character set, which uses one byte for an ASCII character, but may require up to 4 bytes for some non-ASCII characters.
вот здесь чета есть http://planetlotus.org/profiles/andre-guirard_100537
 

Serduko

Well-known member
11.10.2011
170
0
#17
нотусня хранит не вин1251, для русского, по понятным причинам (иначе былоб виндозонли)
стоит пошукать на тему

вот здесь чета есть http://planetlotus.org/profiles/andre-guirard_100537
Нашел, спасибо (плюсомет зарядится, атблагадарю)

Код:
Function LmbcsLen(x$) As Long 
Dim session As New NotesSession, db As NotesDatabase, docTmp As NotesDocument 
Dim mime As NotesMIMEEntity, streamIn As NotesStream, streamOut As NotesStream 
Set db = session.CurrentDatabase 
Set docTmp = db.CreateDocument 
Set mime = docTmp.CreateMIMEEntity("Body") 
Set streamIn = session.CreateStream 
streamIn.WriteText x 
streamIn.Position = 0 
Call mime.SetContentFromText(streamIn, "text/plain;charset=LMBCS", ENC_NONE) 
Set streamOut = session.CreateStream 
mime.getContentAsBytes streamOut, False 
LmbcsLen = streamOut.Bytes 
End Function
Теперь надо подумать, целесообразно ли пользоваться этим "извратом", либо искать другой способ отталкиваясь от этого, либо забить. :)