Страница 1 из 1
Трудности перевода
Добавлено: 20 Август 2021, 7:33
Игорь Столяров
Привет всем !
Есть вопрос (который, кстати, возникает не первый раз) при подключении внешней библиотеки.
В описании структуры данных на 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) в любом месте просто сработает как терминатор строки и всё.
Или я чего-то не понимаю ? Заранее спасибо.
Трудности перевода
Добавлено: 20 Август 2021, 11:18
kreator
Чисто теоретически в строке UTF-8 не будет символов со значением 0. Откуда?
Трудности перевода
Добавлено: 20 Август 2021, 11:42
Игорь Столяров
Если бы я знал ...
Как я понимаю (но могу ошибаться): UTF строка может содержать любые коды от 0 до 255 ...
Здесь "узким" местом может быть интерпретация одних и тех же данных.
Если я хочу показать или использовать CString в Clarion - то получу строку до первого символа Chr(0).
Для C те же данные - это массив символов.
И их можно рассматривать как строка до первого символа не Chr(0) с хвоста массива.
А это уже другое и сама строка в таком случае может содержать и Chr(0) ...
Трудности перевода
Добавлено: 20 Август 2021, 12:13
kreator
Я не пойму. Chr(0) - конец строки. По-моему без разницы какой ЯП.
Трудности перевода
Добавлено: 20 Август 2021, 12:21
Дед Пахом
Речь же про utf-8? Там в мультибайтных символах 0 не используется.
Трудности перевода
Добавлено: 20 Август 2021, 12:28
Игорь Столяров
Дед Пахом писал(а): ↑20 Август 2021, 12:21
Там в мультибайтных символах 0 не используется
Понял. Спасибо. Буду пробовать ...
Трудности перевода
Добавлено: 20 Август 2021, 15:00
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)
Трудности перевода
Добавлено: 20 Август 2021, 17:02
Дед Пахом
RaFaeL писал(а): ↑20 Август 2021, 15:00CString(129)
CString(128)
Трудности перевода
Добавлено: 21 Август 2021, 9:38
RaFaeL
Эт почему? В С и других известных мне языках нулл-терминатор не учитывается при объявлении размера переменной, эт только в Кларионе решили учитывать
Трудности перевода
Добавлено: 21 Август 2021, 10:33
Игорь Столяров
RaFaeL писал(а): ↑21 Август 2021, 9:38
В С и других известных мне языках нулл-терминатор не учитывается при объявлении размера переменной
В общем да. Но здесь нет.
Посмотрите пожалуйста моё первое сообщение.
Там на сях объявлен массив из 128 символов, т.е. он занимает 128 байт. Без вариантов.
То что эта переменная используется как строка с нуль-терминатором - просто написано в комментарии.
Ну и в реале эта строка находится в структуре данных (см. соседнюю ветку с ZINT) и если сделать
её длину 129 байт - то всё собьётся. Проверено.
Трудности перевода
Добавлено: 21 Август 2021, 13:23
RaFaeL
Игорь Столяров писал(а): ↑21 Август 2021, 10:33
Там на сях объявлен массив из 128 символов, т.е. он занимает 128 байт. Без вариантов.
Такой массив я бы тогда как string(128) объявил
Иначе непонятно что туда после терминатора может уйти
Хотя если вам на чтение, то наверное прокатит и так
Трудности перевода
Добавлено: 21 Август 2021, 15:58
Дед Пахом
Какая разница, что там после терминатора, если строка utf-8 это всё что до терминатора? Хотя неважно, это поле для чтения (UTF-8, NUL-terminated (output only)).
Трудности перевода
Добавлено: 21 Август 2021, 17:52
Игорь Столяров
Получается, что если объявить эту конструкцию как String(128) - то при обращении из Clarion
мы получим строку с данными длиной 128 символов и это неправильно.
Если объявить конструкцию как CString(128) - то при обращении из Clarion мы получим строку
с данными до терминатора Chr(0) и это правильно !
(Если предположение о том, что строка UTF-8 не содержит Chr(0) верно)