Символы Unicode для вывода в файл в Linux Ubuntu

Я написал переводчик из десятичного числа в символы Юникода.

Во входном файле у нас есть несколько чисел, которые после перевода выдадут какой-то символ. Например, знак евро, представленный вначале как 226 130 172, будет выглядеть точно так же, как знак евро. Проблема в том, что я не могу вывести это в файл, но могу вывести в консоль. В программе есть метод с расширенным fstream, он позволяет выводить в консоль символы размером до 4 байт. Но в выходном файле ничего нет, и я не понимаю почему. Мой друг использует какой-то способ вывода, перенаправляя обычный поток cout в файл, но, как я понимаю, этот способ будет работать только на винде. Я использую Ubuntu 16.04, этот метод у меня не работает. Я попытался настроить gedit (стандартный текстовый редактор в Ubuntu) для отображения, но мне это не удалось. В этом коде я сначала открываю расширенные потоки, а потом идет следующий код.

int input, result = 0;

if(!fin.is_open()){
    cout << "Не удалось открыть файл!" << endl;
}
else{
    while(fin >> input){
        if(input >= 240){
            input -= 240;
            result += input << 18;
            fin >> input;
            input -= 128;
            result += input << 12;
            fin >> input;
            input -= 128;
            result += input << 6;
            fin >> input;
            input -= 128;
            result += input;
            wcout << (wchar_t)result << endl;
            fout << (wchar_t)result;
        }
        else if(input >= 224){
            input -= 224;
            result += input << 12;
            fin >> input;
            input -= 128;
            result += input << 6;
            fin >> input;
            input -= 128;
            result += input;
            wcout << (wchar_t)result << endl;
            fout << (wchar_t)result;
        }
        else if(input >= 192){
            input -= 192;
            result += input << 6;
            fin >> input;
            input -= 128;
            result = input;
            wcout << (wchar_t)result << endl;
            fout << (wchar_t)result;
        }
        else{
            wcout << (wchar_t)input << endl;  
            fout << (wchar_t)input;
        }
    }
}

  fin.close();
  fout.close();
  return 0;
}

person Community    schedule 08.03.2018    source источник
comment
выводить как UTF-8 и снова читать как UTF-8   -  person phuclv    schedule 09.03.2018


Ответы (1)


Вы должны объявить fout как std::wofstream, а не std::ofstream для вывода wchar в файл. Пример:

wchar_t *temp = L"wchar";
std::wofstream wofs;
wofs.open("output.txt", std::ios::out);
wofs << L"Test\n";
wofs << temp;
wofs.close();

Вы можете сослаться на эту ссылку: Вывод 'wchar_t*' в 'ofstream'

person Le Ngoc Thuong    schedule 09.03.2018
comment
Могу ли я использовать L для некоторого %string_name% без вывода строкового значения? Например: wchar_t *temp = L (%string_name%); - person ; 09.03.2018
comment
Если string_name равно wchar_t, вы можете назначить его другому wchat_t без L: Пример: code wchar_t *string_name = Labc; wchar_t *temp = строка; Но если string_name не является wchar_t (строка или символ), вы не можете напрямую присвоить его переменной wchar_t, вы должны преобразовать его. - person Le Ngoc Thuong; 10.03.2018
comment
Большое спасибо ^_^ - person ; 10.03.2018