Страница 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) верно)