[mdk-re] Вопрос по локали...

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_mivlgu=2Emurom=2Eru?=
Пт Сен 28 17:53:01 MSD 2001


On Thu, 27 Sep 2001 11:20:45 +0400
"Serge Ivanoff" <SergeIV на mail.ru> wrote:

> В результате долгих раскопок выяснилось что функция isprintable() не
> воспринимает русские буквы.
> т.е судя по описанию набор символов которые она воспринимает как
> печатабельные зависит от локали - в русской локали должно воспринимать
> русские буквы. А вот и не работает.
> Кто наступал на это? Как решили проблему?

Ничего подобного:

#include <stdio.h>
#include <ctype.h>
#include <locale.h>

int main(void)
{
        int ch;

        setlocale(LC_ALL, "");

        while ((ch = getchar()) != EOF) {
                if (isprint(ch))
                        printf("0x%02x: printable\n", ch);
                else
                        printf("0x%02x: unprintable\n", ch);
        }
        return 0;
}

$ gcc test.c
$ locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=
$ ./a.out 
abc абв      
0x61: printable
0x62: printable
0x63: printable
0x20: printable
0xc1: printable
0xc2: printable
0xd7: printable
0x0a: unprintable
$ LC_ALL=C ./a.out 
abc абв   
0x61: printable
0x62: printable
0x63: printable
0x20: printable
0xc1: unprintable
0xc2: unprintable
0xd7: unprintable
0x0a: unprintable

Возможно, проблема в том, что при обработке обычной строки
(массива char) параметры isxxxx() нужно преобразовывать к типу
unsigned char - иначе получаются отрицательные значения, которые
действительно не обрабатываются. isxxxx() обрабатывает коды от
0x00 до 0xFF, а также EOF (-1); кстати, tolower() и toupper()
ведут себя точно так же.




Подробная информация о списке рассылки community