Как написать строку wstring содержит другой язык в файл?
Я получил отдельные части из 22 файлов на разных языках и сделал из них строку типа wstring:
wstring wstr_line = L"\"IDS_TOAST_ECOON\",\"eco Mode is turned On.\",\"ecoモードをオンにしました。\",\"Režim eco je zapnutý.\",\"Økoindstillingen er aktiveret\"..."
Я использовал wofstream, чтобы поместить wstr_line в файл, но строка завершилась в японской части (\"ecoモードをオンにしました" \"). Если я установлю wfout.imbue("chs");
линия закончена на чешской части (\"Režim eco je zapnutý.\")
Как правильно записать эту строку в файл?
2 ответа
Попробуйте вставить это в качестве первой строки в вашем коде:
int main()
{
std::cout.imbue(std::locale(""));
Это устанавливает для локального приложения то, что поддерживает машина (вероятно, UTF-32 для строк широких символов). К сожалению, по умолчанию local является "C" для программистов, а фасет codecvt для "C" local не делает ничего полезного (вероятно, обрезает широкие символы до одного байта без преобразования).
Я решил проблему в другой стратегии, output the lines in bytes
, Используйте функцию ниже для вывода wstring независимо от того, какой символ он содержит.
void output(ofstream &fout, vector<wstring> wline_list)
{
void outputline(ofstream &, wstring);
//pre output 0xFF and 0xFE to make the file encoding in UTF-16
const BYTE PRE_LOW = 0xFF;
const BYTE PRE_HIGH = 0xFE;
fout << PRE_LOW << PRE_HIGH;
for(vector<wstring>::size_type i(0); i<wline_list.size(); i++)
outputline(fout, wline_list[i]);
}
void outputline(ofstream &fout, wstring line)
{
void getByte(BYTE btchar[2], WORD wdChar);
BYTE btChar[2] = {0,0};
const BYTE CHANGE_LINE1_LOW = 0x0D;
const BYTE CHANGE_LINE1_HIGH = 0x00;
const BYTE CHANGE_LINE2_LOW = 0x0A;
const BYTE CHANGE_LINE2_HIGH = 0x00;
WORD wdChar(0);
for(wstring::size_type i(0); i<line.length(); i++)
{
wdChar = line[i];
getByte(btChar, wdChar);
fout << btChar[0] << btChar[1];
}
//it needs this two chars to change line.
fout << CHANGE_LINE1_LOW << CHANGE_LINE1_HIGH
<< CHANGE_LINE2_LOW << CHANGE_LINE2_HIGH;
}
void getByte(BYTE btchar[2], WORD wdChar)
{
btchar[0] = wdChar % 0x0100;
btchar[1] = wdChar / 0x0100;
}