isLetter с акцентированными символами в C - PullRequest
3 голосов
/ 09 апреля 2011

Я хотел бы создать (или найти) функцию C, чтобы проверить, является ли символ c буквой ... Конечно, я могу легко сделать это для аз и AZ.

Однако я получаюошибка при тестировании c == á, ã, ô, ç, ë, и т. д.

Возможно, эти специальные символы хранятся более чем в символе ...

Я хотел бы знать:Как хранятся эти специальные символы, какие аргументы должна получить моя функция и как это сделать?Я также хотел бы знать, есть ли какая-нибудь стандартная функция, которая уже делает это.

Ответы [ 4 ]

4 голосов
/ 09 апреля 2011

Я думаю, что вы ищете iswalpha() рутину:

   #include <wctype.h>

   int iswalpha(wint_t wc);

DESCRIPTION
   The iswalpha() function is the wide-character equivalent of
   the isalpha(3) function.  It tests whether wc is a wide
   character belonging to the wide-character class "alpha".

Это зависит от LC_CTYPE текущего locale(7), поэтому его использование в программе, которая должна обрабатывать несколько типов ввода одновременно, не может быть идеальным.

3 голосов
/ 09 апреля 2011

Если вы работаете с однобайтовыми наборами кодов, такими как ISO 8859-1 или 8859-15 (или с любым другим набором кодов 8859-x), то функция isalpha() выполнит эту работу, если вы также не забудете использовать setlocale(LC_ALL, ""); (или другой подходящий вызов setlocale()) в вашей программе. Без этого программа работает в локали C, которая классифицирует только символы ASCII (8859-x символов в диапазоне 0x00..0x7F).

Если вы работаете с многобайтовыми или кодовыми наборами широких символов (такими как UTF8 или UTF16), то вам нужно обратиться к функциям широких символов, найденным в <wchar.h> и <wctype.h>.

1 голос
/ 09 апреля 2011

Вы, вероятно, хотите http://site.icu -project.org / . Для этого предоставляется переносимая библиотека с API.

0 голосов
/ 09 апреля 2011

Способ хранения этих символов зависит от локали.В большинстве систем UNIX они будут храниться как UTF8, тогда как машина Win32, скорее всего, будет представлять их как UTF16.UTF8 хранится как переменное количество символов, в то время как UTF16 хранится с использованием суррогатных пар - и, следовательно, внутри wchar_t (или беззнакового шорт) (хотя, кстати, sizeof (wchar_t) в Windows - только 2 (против 4 в * nix)и, таким образом, вам часто потребуется 2 типа wchar_t для хранения 1 символа, если используется кодировка суррогатной пары - что будет во многих случаях).

Как уже упоминалось, процедура iswalpha() сделает этодля вас и документировано здесь .Он должен позаботиться о специфичных для вас вопросах.

...