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

稀饭桶子 发布于 2016/03/07 14:01
阅读 544
收藏 0
c++

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

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

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

加载中
0
Force武装卫队
Force武装卫队
以 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 然后输出。只是过程比较繁琐。
0
cys1357
cys1357
"无论是记事本,notepad++,还是UltraEdit,都可以轻松打开文本文件",只是你没碰到,其实他们都会出现乱码,如果文件内容是任意编码的混合编码文件,没有哪个编辑器可以正确显示,因为不存在足够多的信息让编辑器识别每个编码的类型。对于单一编码的文件,可以通过对编码规则的试探来猜测是哪种编码的,比如一个文件的内容,如果每个字节的最高位都为0,则可以猜测它是assic码,再比如上面那位说的ucs2,如果前两个字节是0xfffe或0xfeff则认为这是ucs2编码,但实际文件中这两个字节经常不存在,所以编辑器没法识别,gb系列则每个字节的高位都是1,utf有很强的规则性也比较好识别,这里说的比较好识别不是一定能识别出来,而是规律性与其他编码区别较大,不太容易搞混。
返回顶部
顶部