LINUX.ORG.RU

Использование posix locale и функции isalpha()

 isalpha, , , setlocale


0

1

До конца остается мне неясным: в locale категория LC_CTYPE указывает какие символы считать заглавными, какие прописными и т.д. для данной локали.

Возможно ли делая setlocale(LC_CTYPE, «ru_RU.utf8») и потом пробегая по строке «eng рус» для каждого символа выполнить isaplha() и в итоге получить ответы, что «eng » были не алфавитные символы, а «рус» были алфавитные? Сейчас у меня получается так, что он и латинские и кириллические символы принимает за алфавитные.

Что я неправильно понимаю?

In some locales, there may be additional characters for which isalpha() is true—letters which are neither upper case nor lower case.

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

да, я встречал это. Думаете там находятся латинские символы? Я пытался посмотреть в исходные файлы для русской локали, там в разделе LC_CTYPE нет описания какие символы принадлежат алфавиту и тд. написано только copy «i18n», не знаете что это значит? Откуда оно скопирует?

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

Я не знаю внутреннего устройства. Если надо найти только русские буквы, можно из списка isalpha() для ru_RU локали вычесть isalpha() для C локали.

Elyas ★★★★★
()
21 августа 2014 г.
Ответ на: комментарий от Elyas

Ну вообще-то есть... Посмотрите файл /usr/share/i18n/charmaps/UTF-8.gz(у меня так. Но вообще-то это стандартное расположение) распакуйте его и вы увидите строковое обозначение для каждого символа. Это обозначение состоит из стандартных обозначений аттрибутов и самого символа. Там указан тип символа LETTER или DIGIT. Функция isalpha реагирует на аттрибут LETTER. Что касается utf8 то проблема тут иного рода... Там в качестве аргумента стоит тип int. Этот тип годится для ASCII кодировок и для Unicode также. Но utf8 не является ни той ни другой. Это своего рода уникальная кодировка мультибайтовая. Из-за этого подтормаживает особенно на русских буквах. Так что я бы не рекомендовал эту кодировку. В целом если это не веб и вы не работаете с китайским, то вполне можно обойтись и ASCII кодировкой. К тому же они работают очень быстро, поддерживают 2 языка и ряд др символов(небольшое кол-во...) и занимают мало места. Если не хватает 2-х языков или мало символов тогда Unicode... необходимость же именно в utf8 возникает крайне редко!!! Но в неё помещаются все мыслимые и немыслимые символы... Это как правило совершенно лишнее!!! Возращаясь к исходной проблеме мы видим, что функция isalpha могла бы среагировать на букву даже в utf8 если бы у неё был бы правильный тип. Длинну мультибайтового символа мы не можем знать. Фактически туда надо передавать указатель. Но это совершенно другой интерфейс функции и она его не поддерживает. Вставлять 1 функцию ради этой кодировки комитет по стандартам не стал. Эта проблема не решена... Но есть решение на С++11 с локалями. Там просто другая функция... Аналогично не работают с мультибайтовыми кодировками и другие функции. Для этого их надо либо писать самим. что утомительно либо воспользоваться С++11. Либо самое разумное это просто отказаться от мультибайтовых кодировок. Если есть текст в ней, то его легко сконвертить в другую кодировку с помощью любого конвертора или стандартно через iconv если это строка в программе. И больше никогда не пользоваться такими кодировками Потому что с ними всегда возникают проблемы к тому же характеристики у них наихудшие. Это худшее что могли придумать для кодировок!!! Пользуйтесь Юникодом!!!

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