Правильный способ проверить, является ли символ буквой, это проверить, находится ли он в одной из категорий букв: Lu, Ll, Lt, Lm или Lo.Вы можете использовать библиотеку ICU от IBM, это довольно популярная библиотека для обработки Unicode.
http://icu -project.org / apiref / icu4c / uchar_8h.html
Вы также можете напрямую использовать функцию u_isalpha
из ICU или u_charType
, чтобы определить категорию символа.Обратите внимание, что термин «буква» предпочтительнее «альфа», поскольку в Юникоде есть много неалфавитных «букв» (например, китайских символов).
Однако сначала необходимо декодировать символ.Если вы используете массив char
, то кодировкой может быть ASCII, LATIN-1, Windows 1252, UTF-8 или любая из более чем миллиарда других кодировок.Если вы обращаетесь к char
напрямую, он может быть подписан или не подписан в зависимости от вашей платформы, поэтому вы получите явно неправильный номер, например 4294967168 - именно это происходит, когда байт 0x80 интерпретируется как подписанный char
и затем приведение к unsigned int
.
Использование таблицы поиска - очень плохой выбор для такого рода задач, поскольку таблица должна быть такой большой - около 700 КБ.Вместо этого я рекомендую либо использовать ICU, либо создать таблицу диапазонов символов и выполнить двоичный поиск в таблице.Это может быть весьма эффективным.
Я работаю над инструментом для создания именно таких таблиц.Инструмент в настоящее время не готов к работе, но если вы любите приключения, вы можете его использовать, и в README есть примеры его использования.
https://github.com/depp/uniset