getline问题和"奇怪的人物"

NoS*_*tAl 6 c++ wstring

我有一个奇怪的问题,我用

wifstream a("a.txt");
wstring line;
while (a.good()) //!a.eof()  not helping
{
     getline (a,line);
      //...
     wcout<<line<<endl;

}
Run Code Online (Sandbox Code Playgroud)

和它的作品很好地为这样的txt文件 http://www.speedyshare.com/files/29833132/a.txt (抱歉的联系,但它仅仅是80个字节,所以它不应该是一个问题,得到它,如果SO换行上的ic/p丢失了)但是当我添加例如水(来自http://en.wikipedia.org/wiki/UTF-16/UCS-2#Examples)到任何加载线的行时停止.我错误的认为getline将wstring作为一个输入和wifstream,因为其他人可以咀嚼任何txt输入...有没有办法读取文件中的每一行,即使它包含时髦的字符?

Ala*_*air 8

不太令人满意的答案是,您需要使用能够理解所讨论的特定字符编码的语言环境来灌输输入流.如果您不知道要选择哪个区域设置,则可以使用空区域设置.

例如(未经测试):

std::wifstream a("a.txt");
std::locale loc("");
a.imbue(loc);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,没有标准的方法来确定给定平台可用的区域设置,更不用说根据字符编码选择一个.

上面的代码将区域设置选择放在用户手中,如果他们将其设置为合理的东西(例如en_AU.UTF-8)它可能都是Just Work.

如果做不到这一点,您可能需要求助于第三方库,例如iconvICU.

博客条目也相关(为自我推销道歉).