PHP中的字符串处理 - unicode,gbk,ASCII,ISO-8859,utf-8,utf-16,utf-32

1、字符集:
ASCII:American Standard Code for Information Interchange,美国标准信息交换代码,主要用于显示英语,单字节,已使用127个,第8位为0。

ISO-8859:又称为 扩充ASCII(或高ASCII)字符集,为了满足部分欧洲国家的需求,单字节,255个,第8位为1。

GBK:汉字内码扩展规范,兼容GB2312,包含ASCII,单字节,双字节。

unicode:统一码,包含全世界所有的字符,最大支持四个字节。

2、编码解码方式:
有了字符集之后,单个字符及其对应的码就能对照上了,那么问题是,如何表示字符串呢?在网络世界,数据的传输是二进制形式进行的,我们可以以十六进制来表示,比如,从网络传来了一组数据,转换成十六进制为:1A 2B CC EE 这四个字节,你该如何拆分哪几个字节是一个字符呢?,要知道unicode中的字符可以是一个字节,两个字节,三个字节,甚至四个字节,对于这四个字节的数据,你完全可以当成四个字符,三个字符,两个字符,一个字符。对了,就是字符和字符之间要是有标志就好了,这样程序才能区分哪几个字节应该被当做一个字符,然后去对照Unicode字符集,于是UTF就诞生了。

UTF是"Unicode Transformation Format"的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。分为 utf-8,utf-16,utf-32;分别表示一个字节长度,两个字节长度,四个字节长度。

既然unicode最大支持四个字节,那么最简单的方式就每个字符使用四个字节来存储,既能满足现在的需求,也能满足未来的需求,但是这样做岂不是太浪费存储空间和网络带宽了吗,于是就选择了粒度最小的utf-8。

以下是utf-8的编码规则:
在这里插入图片描述
由以上二进制表示方式,可明显的看到一个字符的起始位置,不管该字符是几个字节表示。比如,我要传输一个字符串:rxy中国

字符unicode码二进制UTF-8
rU+0072111001001110010
xU+0078111100001111000
yU+0079111100101111001
U+4e2d1001110 0010110111100100 10111000 10101101
U+56fd1010110 1111110111100101 10011011 10111101

规则是这样的,比如“国”字,
1010110 11111101 按照第三个模板
1110xxxx 10xxxxxx 10xxxxxx
有16个x,也就是两个字节的位置,因此我们将”国“字拆分为3-6-6,即
101 011011 111101 分别对应 xxxx xxxxxx xxxxxx 于是要在高位补0,就是
0101 011011 111101 然后带入模板就是
11100101 10011011 10111101

可见,对于多字节字符,使用utf-8传输过来的二进制和原始的二进制的值(也就是unicode的值)是不一样的,但是可以通过算法相互转化的,这是由程序底层来完成的,所以在上层,只要网络两端的编码规则一致,那么你接收的数据就不需要转码。实际上我们并不需要知道utf-8的值,因为真正用来展示的是unicode对应的字符。

查看 / 设置 当前环境的编码规则

mb_internal_encoding() - 设置 / 获取内部字符编码规则

echo mb_internal_encoding(); // UTF-8
mb_internal_encoding("UTF-8"); // TRUE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值