Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Локаль и неправильный резульятат


Автор: ИванМ 14.3.2012, 11:47
Почему такая функция:
Код

isalpha('Я', locale("eng"));

возвращает true?
Ведь буква "Я" из русского алфавита, а я выбрал английскую локаль.
Компилятор VS2005.

Автор: Result 14.3.2012, 13:23
Код

#include <iostream>
#include <locale>

using namespace std;

int main(){
   if(!isalpha(L'Я',locale("POSIX")))
      cout << "OK" << endl;
}


Видимо имя локали не валидное, по крайней мере раньше эти имена были не стандартизированы и зависели от реализации. 

ЗЫ. POSIX - английский, 7-разрядная кодировка

Автор: Dem_max 14.3.2012, 14:42
вообще буква Я это магическая буква, встречались приложения которые в своем пути и имена файла на русском языке не переваривали только букву Я

Автор: volatile 15.3.2012, 02:04
Цитата(ИванМ @  14.3.2012,  11:47 Найти цитируемый пост)
Почему такая функция:
isalpha('Я', locale("eng"));
возвращает true?

Это баг/фича старой студии. В новой исправили, кажется.
и кстати не только с буквой 'Я', а со многими буквами старшей половины таблицы будет такая фигня.

Решение: 
Во все функции is****(); (их там кучка) нельзя передавать чар. нужно передавать ансигнед чар

Код

isalpha((unsigned char)'Я', locale("eng"));




Автор: xvr 15.3.2012, 09:41
Цитата(Dem_max @  14.3.2012,  14:42 Найти цитируемый пост)
вообще буква Я это магическая буква,

Угу, ее код равен 0xFF. После расширения знака (т.к. char частенько оказывался знаковым, вот ведь сюрприз  smile ) это превращалось в -1, что у функций типа fgetc обозначает конец файла  smile 

Автор: ИванМ 15.3.2012, 14:02
Всем спасибо. Особенно volatile. Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)