字符编码知识

什么是编码?

字符‘中’, 用unicode表示为:0x4e2d, 用gb2312表示为: 0xd6d0, 这就是编码, 将某种形式信息转化为其它形式.

什么是解码?

把0x4e2d这样信息转化为'中'

为什么会存在编解码这样的概念?

编码的原因: 人们交流用到的文字, 无法再计算机中直接表示[计算机只认数字信息], 因此要把这些文字字符, 编程二进制数字信息, 方便存储和传输. 由于这个世界乱七八糟的组织非常多, 所以吧文字字符编译成二进制信息的方式也不同, 这些就是今天纷繁复杂的编码规则:utf8,gb2312,gbk,utf-16,unicode等.

解码原因: 表达文本信息的, 存储成了二进制, 人不可能看懂的, 所以借助机器帮我们按照原来的规则, 解码一下, 恢复成文字.

更具体的表述, java中,用char ''表达出来的东西, 是已经编码好的数据:

char a = '中';
char b = 'h';
由此引申出来的char*, char[], String等, 都属于已经编码好的数据.
因此char表示已经编码好的数据, 即我们提到的字符, 这个是针对人类交流所用到的表示方式. 比如'中', 对于人而言, 是非常清晰的阅读的.而计算机是不认识字符的, 它只能读懂二进制表示的字节.

但对于机器而言, 这样的方式是不可解读的, 因此它需要把'中',存储起来, 存储的方式是按照字节存储, 遵循某种规则:
'中' 按照gb2312来存储: 0xd6d0
'中' 按照unicode来存储: 0xe42d
...

所以, 常常提到的字符, 字符串这类表达方式, 都是给人交流用的.

而字节, 字, 这类描述, 是描述PC的, 比如一个int有几个字节, 一个double有几个字节,这些,都是为了描述机器中定义基础数据的

可以看到, 如果是一个字符文本信息, 存入到文件中时, 必须知道它的编码格式, 否则文本无法正确读出。

如果是二进制[即只给计算机处理用, 不需要人理解]文件, 这没有这样的问题

下面是Java中一个比较经典的出错:

//char src = 0x0061; //字母a, 97的表示方法 char src = '中'; //char本身的默认编码为utf16或者unicode System.out.println("原始字符:" + src); byte high =(byte) (src>>8); byte low = (byte)(src); System.out.println("高字节:" + Integer.toHexString(high)); System.out.println("低字节:" + Integer.toHexString(low)); //从字节流变成字符, 需要解码, 因此这里只能用unicode或者utf16, gbk或者gb2312肯定出错 System.out.println(new String(new byte[]{(byte)high, (byte)low}, "unicode"));

看到字符, 想到编码, 联想文本
看到字节, 想到解码,联想二进制

上面说到的是java中的表达方式, 在c中表达, 字符和字节是有区别的:

java 和 c关于char/byte的区别

java: char 为unicode编码, 是2个byte

c: 没有byte这个基本类型, byte一般表示0~255的字符, 即unsigned char char而言是有符号的.

延伸阅读和参考文献:

1.关于字符编码,你所需要知道的

2. ANSI编码和Unicode编码的不同

3. Unicode文件标记——BOM(Byte Order Mask)

4. Unicode详解

5. 字符集和字符编码(Charset & Encoding)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值