2013-12-07 1 views
0

я некоторые погуглить вокруг, но не смог найти однозначный ответ (не используя правильную терминологию, возможно?)Как читать символы WCP-1252 на C++?

Во всяком случае, у меня есть несколько текстовых файлов в формате ANSI (WCP-1252), чьи персонажи я хочу обработать в программе C++, но дело в том, что я не знаю, как хранить символы 2 байта, которые соответствуют десятичным кодам от 128 до 255. Просто, чтобы быть уверенными, хотя, я попытался следующий код:

ifstream infile("textfile.txt"); 
char c; 
infile>>c;       //also tried infile.get(c); 
cout<<c; 

Неудивительно, что 1-байтовый символ не смог сохранить символ из расширенного набора после 0x7F (я думаю, он просто отобразил символ ASCII, соответствующий значению первого байта, и отбросил второй или наоборот).

+0

* Чтение * символы на самом деле не проблема, но вы преобразовываете их в нечто другое (и «2 байта» предлагает Unicode). Вы правы: вы не можете сохранить символ Unicode в простой символ. Вместо этого используйте 'wchar'. Тем не менее, 'cout' не работает на высоких ASCII-символах - это другая (не связанная) проблема. – usr2564301

+0

Я, хотя и нелюбимый >> c; будут захватывать не печатные материалы, но их распечатать - это другое дело. попробуйте 'cout << int (c) <<" ";' чтобы более устойчивый взгляд на то, что вы читаете. – RichardPlunkett

+0

У вас есть два байтовых символа в файле? Если я не смущен, WCP-1252 имеет только символы от 0 до 255 или один байт. –

ответ

0

WCP-1252 представлен в формате 8 бит, но некоторые символы не являются частью ASCII. Я предлагаю вам написать таблицу преобразования из WCP-1252 в wchar_t. Чтение char с помощью char и конвертирование в wchar_t. Вы можете написать на карте < uint8_t, wchar_t>. Например:

wchar_t WCP1252Towc(char ch) 
{ 
    static map< char, wchar_t > table 
    { 

     {0x30, L'0' }, 
     {0x31, L'1' }, 
     // .. 
     {0x39, L'9'}, 

     {0x40, L'A'}, 
     // ... 
     {0x5A, L'Z'}, 

     {0x61, L'a'}, 
     // ... 
     {0x7A, L'z'}, 

     // ... 
    }; 

    return table[ ch ]; 
}; 

wstring WCP1252sTowcs(string str) 
{ 
    const auto len = str.size(); 
    wstring res(len, L'\0'); 

    for(size_t i = 0; i < len; ++i) 
     res[ i ] = WCP1252Towc(str[ i ]); 

    return res; 
} 

ifstream infile("textfile.txt"); 
string line; getline(infile, line); 
auto unicode = WCP1252sTowcs(line); 
wcout << unicode; 
+0

Спасибо. Я делаю полную карту прямо сейчас, но что такое «L» в записи карты перед персонажем? – Ali250

+0

, потому что у вас есть какой-то символ WCP1252, не являющийся доступным с типом char. Вам нужно использовать wchar_t, так что 'L' перед строкой сообщает компилятору, что мы используем wchar_t, а не char –

+0

' wchar_t' является специфичным для реализации и не может гарантировать сохранение символов Unicode – Erbureth

 Смежные вопросы

  • Нет связанных вопросов^_^