编码解码方式的不同导致你打开的文件是乱码

在计算机的世界中一个字符用哪个数字来表示,有很多标准,下面一一介绍。

1、ASCII

ASCII 是 “American Standard Code Information Interchange”的缩写,美国信息交换标准码。在英美常用字母就26分,区分大小写,加上标点符号也超不过127个。2^7 = 127。因此每一个字符用一个字节表示足够了。一个字节的7位表示128个数值,在ASCII码中最高位永远是0.

2、 ANSI

参考链接:https://www.cnblogs.com/malecrab/p/5300486.html
ANSI包容ASCII码。ANSI对于ASCII字符仍以一个字节来表示,对于非ASCII字符则使用2字节表示。并没有固定的ANSI编码,它跟计算机的“本地化”密切相关,比如在中国大陆地区,ANSI编码默认是 GB2312,在港澳台地区的默认编码是BIG5。因为ASCII字符的bit7都是0,当ANSI发现bit7不是0时,就可以判定它不是ASCII码,从而区分哪些是ASCII码,哪些不是ASCII码。使用ANSI时,同一个值在不同的字符集下代表不同的意思。以下图为例讲:以数值“0xd0d6”为例,对于 GB2312 编码它表示“中”;对于 BIG5 编码它表示“笢”。
这个问题的原因在于没有统一的编码。解决方法就是使用统一的编码:UNICODE.

在这里插入图片描述
unicode解决了数值和字符一对多的关系。

UNICODE

UNICODE 中的数值范围是 0x0000 至 0x10FFFF,可以表示 100 多万个字符,足够地球人使用了。
UNICODE 编码实现:
先总结下其他的编码实现:

  1. ASCII 编码中使用一个字节来表示一个字符,只用到其中的 7 位,最高位恒为 0;
  2. ANSI 编码中,对于 ASCII 字符仍使用一个字节来表示(BIT7 是 0),对于非 ASCII 字符一般使用 2 个字节来表示,非 ASCII 字符的数值 BIT7 都是 1。

如何表示一个UNICODE
1、使用三个字节表示,弊端:浪费
2、UTF-16 LE 用两个字节表示,小端模式(权重小的放在前边表示),可以标识2^16 = 65536个字符。
3、UTF-16 BE 用两个字节表示,大端模式(权重大的放在前边表示)。
4、UTF8 变长的编码方法。不局限于只用两个字节或者三个来表示。如果是ASCII字符,直接用ASCII码来表示。对于非ASCII字符,使用变长的编码方式:每一个字节的高位都自带长度信息。同时还可以解决对于UTF-16 LE UTF-16 BE 来表示UNICODE值时,如果某个字节丢失,会使得后面的所有字符因为错位而无法显示的问题。

举例:
"A中"的unicode 的编码值为0x41 0x4e2d。
UTF-16 LE 编码实现的表示方式:ff fe 41 00 2d 4e  // ff fe 表示 UTF-16 LE
UTF-16 BE 编码实现的表示方式:fe ff 00 41 4e 2d // fe ff 表示UTF-16 BE
UTF8  编码实现的表示方式:4e e4 b8 ad  // 不带有头部的UTF8
UTF-8 编码实现的表示方式:ef bb bf 41 e4 b8 ad // ef bb bf 表示带有头部的UTF8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值