【问题标题】:How to write a wstring line contains different language to a file?如何将包含不同语言的 wstring 行写入文件?
【发布时间】:2012-07-27 18:19:17
【问题描述】:

我从 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ý.\”)

如何将这一行正确写入文件?

【问题讨论】:

  • 另外我注意到你的字符串不像L"Text"那样以L开头。这是一个错字吗?因为这意味着代码中的文本不是 wchar_t* 而是 char*。这表明该字符串被编码为 UTF-8。

标签: c++ c string character-encoding wofstream


【解决方案1】:

尝试将此作为代码的第一行:

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

这会将应用程序的本地设置为机器支持的内容(对于宽字符串可能是 UTF-32)。不幸的是,对于程序员来说,默认的本地是“C”,而“C”本地的 codecvt 方面没有做任何有用的事情(可能会在不转换的情况下将宽包截断为单个字节)。

【讨论】:

  • 但是一行中有不同的语言,如果我设置了一个locale,那么其他语言就不能正确输出...
  • @goss.beta:这不是它的工作原理。我们在这里寻找的是正确启动的 codecvt 方面。这些不用于在语言之间进行转换,而是在编码格式之间进行转换。假设您的系统正在使用 UTF(很可能),那么它将输出适当的 UTF。试一试,看看会发生什么。
【解决方案2】:

我已经用另一种策略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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2011-05-02
    • 1970-01-01
    • 2011-09-17
    • 2011-02-25
    相关资源
    最近更新 更多