开发者社区> 问答> 正文

请问一下,c++怎么读取文件不乱码:报错

无论是记事本,notepad++,还是UltraEdit,都可以轻松打开文本文件,

无论文件是Ansi编码,还是Unicode,Utf8.

实现这种功能的原理是什么,有没有代码比较简单的开源代码呢?

展开
收起
kun坤 2020-06-07 12:51:22 548 0
1 条回答
写回答
取消 提交回答
  • 以 Windows 为例,通常来说 文件编码有 GBK UTF8-Without-BOM UTF8-BOM, UTF16LE UTF16BE ,实际上你只要解析这些编码即可,通过读取文件的 BOM 也就是前3个或者4个字符,可以判断是否为 UTF16 或者是 UTF8 BOM,对于 GBK 或者 UTF8 without BOM 就不行了,https://github.com/BYVoid/uchardet 这是 Byvoid 从 Mozilla 提取出来的 检测 文件编码的,除掉主文件 其他文件可以用于 Windows,检测出编码后,比如 Windows 可以使用 MultiByteToWideChar 转成 UTF16 然后输出。只是过程比较繁琐。
    ######"无论是记事本,notepad++,还是UltraEdit,都可以轻松打开文本文件 ",只是你没碰到,其实他们都会出现乱码,如果文件内容是任意编码的混合编码文件,没有哪个编辑器可以正确显示 ,因为不存在足够多的信息让编辑器识别每个编码的类型。对于单一编码的文件,可以通过对编码规则的试探来猜测是哪种编码的,比如一个文件的内容,如果每个字节的最高位都为0,则可以猜测它是assic码,再比如上面那位说的ucs2,如果前两个字节是0xfffe或0xfeff则认为这是ucs2编码,但实际文件中这两个字节经常不存在,所以编辑器没法识别,gb系列则每个字节的高位都是1,utf有很强的规则性也比较好识别,这里说的比较好识别不是一定能识别出来,而是规律性与其他编码区别较大,不太容易搞混。

    2020-06-07 12:51:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载