2012-07-30 36 views
4

,我从不同语言的22个文件分隔件,使他们一的wstring一行:如何编写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到一个文件中,但线路在日本的部分完成(\“生态モードをオンにしました。\“)。 如果我设置wfout.imbue("chs");该行在捷克部分完成(\“Režimeco jezapnutý。\”)

如何将此行写入文件正确?

+0

[写作UTF16以二进制模式到文件]的可能重复(http://stackoverflow.com/questions/207662/writing-utf16-to-file-in-binary-mode) – 2012-07-30 04:40:32

+0

此外,我注意到你的字符串不是以'L“文本”'中的L开始的。这是一个错字吗?这意味着代码中的文本不是wchar_t *,而是char *。这表明该字符串编码为UTF-8。 – 2012-07-30 04:58:52

回答

0

尝试坚持这是你的第一行代码:

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

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

+0

但行中有不同的语言,如果我设置语言环境,则其他语言不能正确输出... – 2012-07-30 06:34:29

+1

@ goss.beta:这不是它的工作原理。我们在这里寻找的是codecvt方面正确踢。这些不用于在语言之间转换,而是在编码格式之间转换。假设你的系统正在使用UTF(很可能),那么它会输出合适的UTF。试试看看会发生什么。 – 2012-07-30 07:10:52

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; 
} 
相关问题