c – 在没有外部库的情况下正确读取utf-16文本文件到字符串中?

我从一开始就一直在使用StackOverflow,并且有时候很想发布问题,但我总是要么自己想出来,要么最终找到答案……直到现在.感觉它应该相当简单,但我已经在互联网上闲逛几个小时没有成功,所以我转到这里:

我有一个非常标准的utf-16文本文件,混合了英文和中文字符.我希望这些字符以字符串结尾(技术上是一个wstring).我已经看到很多相关的问题得到解答(这里和其他地方),但是他们要么想要解决在不知道编码的情况下读取任意文件这么难的问题,要么在编码之间进行转换,或者只是对“Unicode”感到困惑. “是一系列编码.我知道我正在尝试阅读的文本文件的来源,它将始终是UTF16,它有一个BOM和一切,它可以保持这种方式.

我一直在使用here所描述的解决方案,该解决方案适用于所有英文文本文件,但在遇到某些字符后,它停止读取文件.我发现的唯一其他建议是使用ICU,这可能会有效,但我真的不想在应用程序中包含一个完整的大型库,只需在一个地方读取一个文本文件.我不关心系统独立性 – 我只需要它在Windows中编译和工作.当然,一个不依赖于这个事实的解决方案会更漂亮,但是对于使用stl同时依赖于关于Windows体系结构的假设,甚至涉及win32函数或ATL的解决方案的解决方案,我也会感到高兴.我只是不想要包括像ICU这样的另一个大型第三方库.除非我想自己重新实现,否则我还是完全没有运气了吗?

编辑:我坚持使用VS2008进行这个特定的项目,所以C 11代码遗憾地无济于事.

编辑2:我意识到我之前借过的code并没有像我认为的那样在非英文字符上失败.相反,它在我的测试文档中的特定字符上失败,其中包括’:'(FULLWIDTH COLON,U FF1A)和’)'(FULLWIDTH RIGHT PARENTHESIS,U FF09). bames53的发布解决方案也大部分都有效,但被这些相同的角色难住了?

编辑3(和答案!):我一直在使用的原始代码-did-主要是工作 – 正如bames53帮助我发现的那样,ifstream只需要以二进制模式打开才能工作.

解决方法

打开UTF-16文件时,必须以二进制模式打开它.这是因为在文本模式下,某些字符被特殊解释 – 具体而言,0x0d被完全过滤掉,0x1a标记文件的末尾.有一些UTF-16字符将其中一个字节作为字符代码的一半,并将弄乱文件的读取.这不是一个错误,它是故意行为,是使用单独的文本和二进制模式的唯一原因.

由于0x1a被认为是文件末尾的原因,请参阅此blog post from Raymond Chen跟踪Ctrl-Z的历史记录.这基本上是向后兼容性的.

相关文章

文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...
文章浏览阅读1.8k次,点赞11次,收藏37次。因为自己对决策树...
文章浏览阅读492次。C++ 设计模式之策略模式
文章浏览阅读683次。我也算是个C++的小白,对于C++中的谓语我...
文章浏览阅读225次。又看了一遍操作符的东西,感觉之前对操作...