4

さまざまな言語の 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ý.\")

この行をファイルに正しく書き込むにはどうすればよいですか?

4

2 に答える 2

0

これをコードの最初の行として貼り付けてみてください:

int main()
{
    std::cout.imbue(std::locale(""));

これにより、アプリケーションのローカルがマシンがサポートするものに設定されます (ワイド文字列の場合はおそらく UTF-32 です)。残念ながら、デフォルトのローカルはプログラマー向けの「C」であり、「C」ローカルの codecvt ファセットは何も役に立ちません (おそらくワイドチャーターを変換せずに 1 バイトに切り捨てます)。

于 2012-07-30T04:44:09.630 に答える
0

別の戦略で問題を解決しました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;
}
于 2012-07-31T07:31:19.383 に答える