[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