Трудности перевода

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Трудности перевода

Сообщение Игорь Столяров »

Привет всем !

Есть вопрос (который, кстати, возникает не первый раз) при подключении внешней библиотеки.
В описании структуры данных на C есть вот такая строка:

Код: Выделить всё

  unsigned char text[128]; /* Human Readable Text (if any), UTF-8, NUL-terminated (output only) */
И вроде бы, ежу понятно, что речь идёт о массиве символов - в Clarion'е это cтрока CString(128).
Но мне непонятно: разве может строка с UTF-8 (бинарные данные) размещаться в CString ?
Ведь первый же символ Chr(0) в любом месте просто сработает как терминатор строки и всё. :(
Или я чего-то не понимаю ? Заранее спасибо. :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Трудности перевода

Сообщение kreator »

Чисто теоретически в строке UTF-8 не будет символов со значением 0. Откуда?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Трудности перевода

Сообщение Игорь Столяров »

Если бы я знал ...
Как я понимаю (но могу ошибаться): UTF строка может содержать любые коды от 0 до 255 ...

Здесь "узким" местом может быть интерпретация одних и тех же данных.
Если я хочу показать или использовать CString в Clarion - то получу строку до первого символа Chr(0).

Для C те же данные - это массив символов.
И их можно рассматривать как строка до первого символа не Chr(0) с хвоста массива.
А это уже другое и сама строка в таком случае может содержать и Chr(0) ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Трудности перевода

Сообщение kreator »

Я не пойму. Chr(0) - конец строки. По-моему без разницы какой ЯП.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Трудности перевода

Сообщение Дед Пахом »

Речь же про utf-8? Там в мультибайтных символах 0 не используется.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Трудности перевода

Сообщение Игорь Столяров »

Дед Пахом писал(а): 20 Август 2021, 12:21 Там в мультибайтных символах 0 не используется
Понял. Спасибо. Буду пробовать ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Трудности перевода

Сообщение RaFaeL »

Игорь Столяров писал(а): 20 Август 2021, 7:33

Код: Выделить всё

  unsigned char text[128]; /* Human Readable Text (if any), UTF-8, NUL-terminated (output only) */
И вроде бы, ежу понятно, что речь идёт о массиве символов - в Clarion'е это cтрока CString(128).
CString(129)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Трудности перевода

Сообщение Дед Пахом »

RaFaeL писал(а): 20 Август 2021, 15:00CString(129)
CString(128)
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Трудности перевода

Сообщение RaFaeL »

Эт почему? В С и других известных мне языках нулл-терминатор не учитывается при объявлении размера переменной, эт только в Кларионе решили учитывать
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Трудности перевода

Сообщение Игорь Столяров »

RaFaeL писал(а): 21 Август 2021, 9:38 В С и других известных мне языках нулл-терминатор не учитывается при объявлении размера переменной
В общем да. Но здесь нет. :)
Посмотрите пожалуйста моё первое сообщение.

Там на сях объявлен массив из 128 символов, т.е. он занимает 128 байт. Без вариантов.
То что эта переменная используется как строка с нуль-терминатором - просто написано в комментарии.

Ну и в реале эта строка находится в структуре данных (см. соседнюю ветку с ZINT) и если сделать
её длину 129 байт - то всё собьётся. Проверено. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Трудности перевода

Сообщение RaFaeL »

Игорь Столяров писал(а): 21 Август 2021, 10:33 Там на сях объявлен массив из 128 символов, т.е. он занимает 128 байт. Без вариантов.
Такой массив я бы тогда как string(128) объявил
Иначе непонятно что туда после терминатора может уйти
Хотя если вам на чтение, то наверное прокатит и так
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Трудности перевода

Сообщение Дед Пахом »

Какая разница, что там после терминатора, если строка utf-8 это всё что до терминатора? Хотя неважно, это поле для чтения (UTF-8, NUL-terminated (output only)).
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Трудности перевода

Сообщение Игорь Столяров »

Получается, что если объявить эту конструкцию как String(128) - то при обращении из Clarion
мы получим строку с данными длиной 128 символов и это неправильно. :(

Если объявить конструкцию как CString(128) - то при обращении из Clarion мы получим строку
с данными до терминатора Chr(0) и это правильно ! :)
(Если предположение о том, что строка UTF-8 не содержит Chr(0) верно)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить