powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Можно ли подсчитать размер строки в байтах?
4 сообщений из 4, страница 1 из 1
Можно ли подсчитать размер строки в байтах?
    #39068349
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыстория
В Ensemble 2015 столкнулся с ошибкой SUBSCRIPT в EnsLib.SQL.Common
Система пытается кэшировать sql запросы, причём ключом массива является сам запрос.
Программисты пытаются обрезать строку до 230 символов, но если в строке появляется хотя бы один wide char (читай - кириллица), то вся строка становится wide char, значит длина строки = [кол. символов] * 2
Код: c#
1.
2.
3.
4.
5.
6.
USER>ZZDUMP "kot"
 
0000: 6B 6F 74                                                kot
USER>ZZDUMP "koт"
 
0000: 006B 006F 0442                                          koт


Я заменил последнюю букву на кириллицу и вся строка увеличилась в размере в два раза.
Таким образом, если в SQL запросе есть кириллица и размер превышает 251 байт, то получаем SUBSCRIPT в недрах ансамбля.


Вопрос
Как посчитать размер строки в байтах?
...
Рейтинг: 0 / 0
Можно ли подсчитать размер строки в байтах?
    #39068397
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле по идее я думаю это не совсем верно, по поводу того что длина сразу становится двойной
zzdump выводит просто, если есть widechar в строке то будет выравнивание всех будет до двух байтZZDUMP(x) public { Ztrap:'$D(x) $$$APPERROR($$$ERSYNTX) Set $ZT="zzderr"
#; c is number of characters per line
#; d is number of hexadecimal digits per character code
 If $ZISWIDE(x) { Set c=8,d=4 } Else { Set c=16,d=2 }
 For i=0:c:$Length(x)-1 {
    Set s=$Extract(x,i+1,i+c),n=$Length(s)
    Write !,$TR($J($ZHEX(i),4)," ","0")_": "
    For j=1:1:n {
       Write $TR($J($ZHEX($A(s,j)),d)," ","0")_" "
       Set:$E(s,j)?1C $E(s,j)="."
    }
    Write ?62,s
 }
 Quit
zzderr Set $ZT="" Ztrap $$$APPERROR($$$LASTERROR)
}вот пример кода и результат  s test="testтест"
  zzdump test
  w !
  f i=1:1:$l(test) zzdump $e(test,i)
  w !
  w !,"length = ",$l($zcvt(test,"O","UTF8"))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
0000: 0074 0065 0073 0074 0442 0435 0441 0442                 testтест
 
0000: 74                                                      t
0000: 65                                                      e
0000: 73                                                      s
0000: 74                                                      t
0000: 0442                                                    т
0000: 0435                                                    е
0000: 0441                                                    с
0000: 0442                                                    т
 
length = 12
...
Рейтинг: 0 / 0
Можно ли подсчитать размер строки в байтах?
    #39068406
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с другой стороны. ощущение что вы неправильно боретесь с проблемой?
может подробнее опишите саму ошибку, что возникла, а так если ошибка внутри кода Cache, может стоит обратиться в WRC
...
Рейтинг: 0 / 0
Можно ли подсчитать размер строки в байтах?
    #39068418
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78Я заменил последнюю букву на кириллицу и вся строка увеличилась в размере в два раза.Неверный вывод:ДокументацияTherefore, on a Unicode implementation of Caché each character is counted as 2 bytes; a Unicode instance of Caché counts two bytes per character even when string contain no Unicode characters.
Проверить легко:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
USER>s s1="kot",s2="koт"

USER>zzdump $zcvt(s1,"O","SAME")
 
0000: 6B 00 6F 00 74 00                                       k.o.t.
USER>zzdump $zcvt(s2,"O","SAME")
 
0000: 6B 00 6F 00 42 04                                       k.o.B.

u78 Вопрос
Как посчитать размер строки в байтах? BYTELEN (или $l($zcvt(строка,"O","UTF8")))

Но Вам это не поможет. Нужно смотреть в сторону максимальной длины ссылки на глобал: 6937128 , 17670875
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Можно ли подсчитать размер строки в байтах?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]