我从一开始就一直在使用 StackOverflow,并且有时很想发布问题,但我总是自己想出来或者最终找到答案......直到现在。这感觉应该相当简单,但我已经在互联网上徘徊了几个小时没有成功,所以我转向这里:
我有一个非常标准的 utf-16 文本文件,混合了英文和中文字符。我希望这些字符以字符串结尾(从技术上讲,是一个 wstring)。我已经看到很多相关的问题得到了回答(这里和其他地方),但他们要么正在寻求解决在不知道编码的情况下读取任意文件的更困难的问题,要么在编码之间进行转换,或者只是对“Unicode”感到困惑" 是一系列编码。我知道我要读取的文本文件的来源,它始终是 UTF16,它有一个 BOM 和一切,它可以保持这种状态。
我一直在使用此处描述的解决方案,该解决方案适用于全英文文本文件,但在遇到某些字符后,它停止读取文件。我发现的唯一其他建议是使用ICU,这可能会起作用,但我真的不想在分发应用程序中包含整个大型库,而只是在一个地方读取一个文本文件。不过,我不关心系统独立性——我只需要它在 Windows 中编译和工作。不依赖该事实的解决方案会更漂亮,当然,但我会很高兴有一个使用 stl 的解决方案,同时依赖于关于 Windows 体系结构的假设,甚至是涉及 win32 函数或 ATL 的解决方案;我只是不想包含另一个像 ICU 这样的大型 3rd 方库。除非我想自己重新实现它,否则我是否仍然完全不走运?
编辑:对于这个特定的项目,我坚持使用 VS2008,所以 C++11 代码很遗憾无济于事。
编辑2:我意识到我之前借用的代码并没有像我想象的那样在非英文字符上失败。相反,它在我的测试文档中的特定字符上失败,其中包括':'(FULLWIDTH COLON,U+FF1A)和')'(FULLWIDTH RIGHT PARENTHESIS,U+FF09)。bames53 发布的解决方案也大多有效,但被那些相同的字符难住了吗?
编辑 3(以及答案!):我一直使用的原始代码 - 大部分都可以工作 - 正如 bames53 帮助我发现的那样,只需要以二进制模式打开 ifstream 就可以工作。