Чтение символов вне ASCII - PullRequest
       14

Чтение символов вне ASCII

0 голосов
/ 30 ноября 2009

Мой друг показал мне ситуацию, когда чтение символов вызывало неожиданное поведение. Чтение символа «¤» привело к падению его программы. Я смог сделать вывод, что «¤» - это 164 десятичное число, поэтому оно превышает диапазон ASCII.

Мы заметили поведение на «¤», но любой символ> 127, кажется, показывает проблему. Вопрос в том, как мы могли бы надежно читать такие символы char за char?

int main(int argc, const char *argv[])
{
    char input;
    do
    {
        cin >> input;
        cout << input;
        cout << " " << setbase(10) << (int)input;
        cout << " 0x" << setbase(16) << (int)input;

        cout << endl;
    } while(input);
    return 0;
}


masse@libre:temp/2009-11-30 $ ./a.out 
¤
 -62 0xffffffc2
¤ -92 0xffffffa4

Ответы [ 3 ]

2 голосов
/ 30 ноября 2009

Ваша система использует кодировку UTF-8 (как и должно быть), поэтому символ '¤' заставляет вашу программу читать последовательность байтов C2 A4. Поскольку char - это один байт, он читает их по одному. Посмотрите на wchar_t и соответствующие потоки wcin и wcout для чтения многобайтовых символов, хотя я не знаю, какую кодировку они поддерживают или как они играют с локалями.

Кроме того, ваша программа выводит недопустимый UTF-8, так что вы действительно не должны видеть эти два символа - я получаю знаки вопроса в моей системе.

(Это придирка и несколько оффтоп, но ваш while(input) должен быть while(cin), иначе вы получите бесконечный цикл.)

1 голос
/ 30 ноября 2009

объявляет 'input' как неподписанный символ вместо

1 голос
/ 30 ноября 2009

Трудно сказать, почему программа вашего друга падает, не видя код, но это может быть потому, что вы используете char в качестве индекса в массиве. Поскольку символы за пределами обычного диапазона ASCII превысят лимит подписанного символа, символ будет отрицательным.

...