LINUX.ORG.RU

Анализатор строк на C

 


0

1

Есть ли какая-нибудь библиотека на C позволяющая определить какие типы символов есть в строке?

Хочется примерно следующего:

#define STR_HAS_LATIN_LETTER       0x00000001
#define STR_HAS_LATIN_DIACR_LETTER 0x00000002
#define STR_HAS_UP_LETTER          0x00000004
#define STR_HAS_LO_LETTER          0x00000008
#define STR_HAS_DIGIT              0x00000010
#define STR_HAS_SPEC_ASCII_NOHTML  0x00000020
#define STR_HAS_SPEC_ASCII_HTML    0x00000040
#define STR_HAS_SPEC_NON_ASCII     0x00000080
#define STR_HAS_SPACE              0x00000100
#define STR_HAS_CONTROL            0x00000200
#define STR_HAS_COMB_ACCENT        0x00000400
#define STR_HAS_COMB_NOT_ACCENT    0x00000800
#define STR_HAS_NON_LATIN_LETTER   0x00001000
#define STR_HAS_OTHER              0x80000000

int analyse_str(const char *str);

Очень желательно чтоб работало с UTF-8.

★★★

Последнее исправление: LinuxUser (всего исправлений: 2)

Запили сам. Это не сложно. Вот только как ты ASCII собираешься совмещать с UTF-8?

anonymous
()

Есть ли какая-нибудь библиотека на C позволяющая определить какие типы символов есть в строке?

В ctype.h есть куча функций

int isalnum(int c); //Если аргумент функции является либо буквой, либо цифрой, она возвращает ненулевое значение.
int isalpha(int c); //Возвращает ненулевое значение, если ее аргумент является буквой, в противном случае возвращается нуль.
int isblank(int c); 
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);
derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)

STR_HAS_UP_LETTER
STR_HAS_LO_LETTER
Очень желательно чтоб работало с UTF-8.

ICU в полный рост

Manhunt ★★★★★
()

Написал.

#define STR_HAS_YES    0
#define STR_HAS_NO     1
#define STR_HAS_ERROR -1
 
#define STR_HAS_ALPHA  0x00000001
#define STR_HAS_BLANK  0x00000002
#define STR_HAS_CNTRL  0x00000004
#define STR_HAS_DIGIT  0x00000008
#define STR_HAS_GRAPH  0x00000010
#define STR_HAS_LOWER  0x00000020
#define STR_HAS_PRINT  0x00000040
#define STR_HAS_PUNCT  0x00000080
#define STR_HAS_SPACE  0x00000100
#define STR_HAS_UPPER  0x00000200
#define STR_HAS_XDIGIT 0x000004000
#define STR_HAS_AND_ASCII 0x40000000
#define STR_HAS_ONLY   0x80000000

/* STR_HAS_YES, STR_HAS_NO or STR_HAS_ERROR */
int str_has(const char *str, int char_class, const char *custom);

Исходный код с тестами тут: http://pastebin.mozilla-russia.org/110401

Замечания и конструктивная критика приветствуются.

LinuxUser ★★★
() автор топика
Ответ на: комментарий от anonymous

На китайских и японских работает корректно. Да это и не важно из какой письменности символы. Тут же стандартная библиотека решает какому классу принадлежит каждый конкретный символ.

LinuxUser ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.