VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 545|回复: 1

[分享] 读写Unicode编码文件乱码解决方案

[复制链接]
51_avatar_middle
最佳答案
83 
online_admins 发表于 2019-7-3 01:56:25 | 显示全部楼层 |阅读模式
首先,有必要了解下记事本文件的几种编码方式:
读写Unicode编码文件乱码解决方案

四种常见文本文件编码方式研究:

ANSI、Unicode 、Unicode big endian、UTF-8 四种格式编码存在差别,简要介绍如下:

ANSI编码:
无文件头(文件编码开头标志性字节)
ANSI编码字母数字占一个字节,汉字占两个字节,
回车换行符单字节,十六进制表示为 0d 0a

Unicode编码:
文件头,十六进制表示为:FF FE
每一个字符都用两个字节编码
回车换行符双字节:000d 000a

Unicode big endian 编码:

文件头十六进制表示为:FE FF
后面编码是把字符的高位放在前面,低位放在后面,正好和 Unicode 编码颠倒。
回车换行符为双字节,十六进制表示为:0d00 0a00

UTF-8 编码:

文件头,十六进制表示为:EF BB BF
UTF-8 是 Unicode 的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占3个字节。
回车换行符,单字节,十六进制表示为:0d 0a

以中文“你好”二字为例,各种类型的编码对应的十六进制格式(可由EditPlus查看)如下图所示:
读写Unicode编码文件乱码解决方案

一个汉字在 Unicode 中用两个字节表示,a-z 等字母也是两个字节。
UTF-8 是 Unicode的一种表现形式(Unicode 编码值使用 UTF-8 方式编码存储),是一种变长的表达方式,把字符的 Unicode 编码在文件中表现出来,从一个字节到三个字节不等(为了减少如 a-z 等 Ascii 码字符占用的空间,因为他们出现太频繁了)。

UTF-8编码范围为:

0000 - 007F : 0xxxxxxx
0080 - 07FF : 110xxxxx 10xxxxxx
0800 - FFFF : 1110xxxx 10xxxxxx 10xxxxxx

如“汉”的 Unicode 编码为 6C49,在 0800 - FFFF 之间,所以要使用3字节模板:1110xxxx 10xxxxxx 10xxxxxx
6C49 的二进制是:0110 110001 001001
用这个二进制流依次代替3字节模板中的 x 得:11100110 10110001 10001001,即 E6 B1 89
保存到文件中的就是3个字节 E6 B1 89,而不是2个字节 6C 49

文本编码方式是 Unicode,在读取文件流时需要指定 encoding 为 Unicode little。
文本编码方式是 Unicode big endian, 在读取文件时指定 encoding 为 Unicode。
在写文件时,当 encoding 指定为 Unicode 时,生成的文本文件的编码格式为 Unicode big endian,故需指定为 Unicode little。
若为ANSI 编码,在文件流操作时,不需要指定编码方式,使用默认即可。




上一篇:初学MFC,写的简易计算器,各位看看
下一篇:VS2017单文档程序窗口分割没有CFormView基类的解决方法
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-11-28 07:16

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表