Я работаю на элементарном лексическом сканере с ручным кодированием и хочу поддерживать вход UTF-8 (это уже не 1970!). Входные символы читаются из stdin
или файла по одному за раз и помещаются в буфер до тех пор, пока не будут видны пробелы и т. Д. Я думал о написании моей собственной оболочки для fgetc()
, которая вместо этого возвращала бы char[]
байтов, составляющих символ UTF-8 и работать с результатом в виде строки ... это было бы достаточно просто, но стало бы скользким уклоном. Я бы предпочел не тратить время на повторное изобретение колеса, а вместо этого использовать существующую протестированную библиотеку, такую как ICU . И теперь у меня есть код, не поддерживающий UTF-8, который работает с fgetc()
, isspace()
, strcmp()
и т. Д., Который я пытаюсь обновить, чтобы использовать ICU. Это мой первый опыт работы с ICU, когда я перечитывал документацию и пытался найти примеры использования с помощью поиска кода Google, но все же есть некоторые недоразумения, которые, я надеюсь, кто-то сможет прояснить.
Функция u_fgetc()
возвращает UChar
, а u_fgetcx()
возвращает UChar32
... документация рекомендует использовать u_fgetcx()
для чтения кодовых точек, поэтому я и начинаю с этого. Я придерживаюсь того же подхода, что и выше, но я помещаю UChar32
с в буфер вместо char
с.
Как правильно сравнить символ с известным значением? Первоначально я был в состоянии сделать if (c == '+')
, чтобы проверить, был ли знак плюс извлечен из ввода. GCC не жалуется, когда c
является UChar32
(что тогда является сравнением между UChar32
и char
), но действительно ли это правильно?
Мне удалось использовать strcmp()
для сравнения буферизованных символов с известным значением, например if ((strcmp(buf, "else") == 0)
. ICU предоставляет u_strcmp()
, и я думаю, что мне может понадобиться использовать макросы U_STRING_DECL
и U_STRING_INIT
для указания известного литерала, но я не уверен. Документация показывает, что они дают UChar[]
, хотя я предполагаю, что мне нужно UChar32[]
... и я все равно не знаю, как их правильно использовать. Любое руководство здесь будет приветствоваться.
После прочтения ряда числовых символов я преобразовал их с помощью strtol()
, чтобы я мог работать с ними. Есть ли подобная функция, доступная в ICU, поскольку я сейчас конвертирую UChar32[]
?