php编码与字符串处理

 

在php中,如果编码处理的不好的话,经常会出现乱码,最常见的是字符串截取,

字符串截取一般都是用substr这一个函数,可是这一个函数在截取中文字符串的时候, 

往往是不尽人意的,其根本原因还是在字符串编码的问题上,对编码没有一个清楚的理解。

 

以上代码执行结果

 

什么是字符编码?

所谓的字符编码就是字符在计算机中的二进制表现形式.

常见的编码有ansic,unicode,gbk,gb2312这些编码.

 

 

unicode,gbk,gb2312,utf8之间的关系

unicode指的是一种编码方式,而utf8是unicode编码的一种实现或者表现方式,这是unicode与utf8之间最大的区别。
在Unicode中:汉字“字”对应的数字是23383
例如,“汉字”对应的数字是0x6c49和0x5b57,也就是其unicode编码
但是在utf的实现或者表现方式是
BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码
同样是一个unicode编码,可以用不同的表现方式,其实UTF的全称是UCS Transformation Format,可以译成Unicode字符集转换格式
unicode,gbk,gb2312都是一种编码的值,并不是一种编码的表现方式.

(1)utf-8

  UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
  Unicode编码(16进制) ║ UTF-8 字节流(二进制)
  000000 - 00007F     ║ 0xxxxxxx
  000080 - 0007FF     ║ 110xxxxx 10xxxxxx
  000800 - 00FFFF     ║ 1110xxxx 10xxxxxx 10xxxxxx
  010000 - 10FFFF     ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
UTF-8编码的最大长度是4个字节。
  例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
  例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用用4字节模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。
从上面可以看出,中文字符要用二字节来表示,所以编码要大于110xxxxx 10xxxxxx,也就是第一个字节要大于192

(2)gbk编码特点

字符有一字节和双字节编码,00–7F范围内是一位,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。
之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81–FE(也就是不含80和FF),第二字节的一部分领域在40–FE,其他领域在80–FE。
具体来说,定义的是下列字节:
GBK的编码范围
范围 第1字节 第2字节 编码数 字数
水准 GBK/1 A1–A9 A1–FE 846 717
水准 GBK/2 B0–F7 A1–FE 6,768 6,763
水准 GBK/3 81–A0 40–FE (7F除外) 6,080 6,080
水准 GBK/4 AA–FE 40–A0 (7F除外) 8,160 8,160
水准 GBK/5 A8–A9 40–A0 (7F除外) 192 166
用户定义 AA–AF A1–FE 564
用户定义 F8–FE A1–FE 658
用户定义 A1–A7 40–A0 (7F除外) 672
合计: 23,940 21,886

 

有一个字符串,里面有中文,英文,全角,半角,
 
现在要把里面的中文全部去掉,只有中文,并且是全角的字符.

 

 

输出结果

 

 

 

Locations of visitors to this page

统计

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值