php语言

谈谈php中的unicode和utf8编码

时间:2024-08-06 13:49:56 php语言 我要投稿
  • 相关推荐

谈谈php中的unicode和utf8编码

  本文给大家深入讨论了unicode和utf8这两种编码的关系,理解好了会发现网上一些旧的东西,是严重多余兼过期的,因为从utf-8流行开始到现在,早已经由原来六字节可变编码到实际完全居于unicode(UCS-2)的稳定阶段。

  重新认识unicode和utf8编码

  直到今天,准确的说是刚才,我才知道UTF-8编码和Unicode编码是不一样的,是有区别的囧

  他们之间是有一定的联系的,看看他们的区别:

  UTF-8的长度是不一定的,有可能是1、2、3字节

  Unicode长度一定,2个字节(USC-2)

  UTF-8可以和Unicode互相转换

  unicode和utf8的关系

  Unicode(16进制)

  UTF-8(二进制)

  0000 - 007F 0xxxxxxx

  0080 - 07FF 110xxxxx 10xxxxxx

  0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

  上面的表格有2个意思,第一个显而易见就是说Unicode和UTF-8字符范围的对应,还有一个可以看出Unicode怎么和UTF-8互相转换:

  先说UTF-8到Unicode的转换

  UTF-8编码的二进制和上面的3种格式进行匹配,匹配到之后去掉固定位(表格中的非x位置),然后从右到左每8位一组,不够8位左边不领,凑够2个字节16 bits,这16 bits所表示的就是UTF-8对应的Unicode编码,看看下面几个例子:

  上面图片中的文字编码格式为UTF-8,可以用WinHex看到其16进制表示

  复制代码 代码如下:

  字符 => UTF-8   => UTF-8二进制=> 去掉固定位置凑够16位的二进制 => 16进制

  汉  => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49

  字  => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57

  #下面是在chrome命令行下面运行的结果

  '\u6C49'

  "汉"

  '\u5B57'

  "字"

  #到这里的话,从UTF-8转换到Unicode已经是一件非常容易的事了,看看转换的伪代码

  读取一个字节,11100110

  判断该UTF-8字符的格式,属于第三种,3个字节

  继续读取2个字节得到 11100101 10101101 10010111

  按照格式去掉固定位     1011011 01010111

  不够16位,左边补零    01011011 01010111  => 5B57

  再看看从Unicode到UTF-8的转换

  复制代码 代码如下:

  5B57

  获取5B57所在的Unicode范围,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三个字节,形式为1110xxxx 10xxxxxx 10xxxxxx

  获取5B57的二进制编码 101101101010111

  用上一步骤的二进制编码从右至左拼接UTF-8编码 11100101 10101101 10010111

  说说问题

  再说说今天这个问题的起因,从前端输入很多单词,UTF-8格式每个词最多30个字节,因此会在前端和后台分别做验证,javascript用的是Unicode编码,后端程序用的是UTF-8编码,现在的解决办法是这样

  前端

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  20

  21

  22

  23

  24

  function utf8_bytes(str)

  {

  var len = 0, unicode;

  for(var i = 0; i < str.length; i++)

  {

  unicode = str.charCodeAt(i);

  if(unicode < 0x0080) {

  ++len;

  } else if(unicode < 0x0800) {

  len += 2;

  } else if(unicode <= 0xFFFF) {

  len += 3;

  }else {

  throw "characters must be USC-2!!"

  }

  }

  return len;

  }

  #例子

  utf8_bytes('asdasdas')

  8

  utf8_bytes('yrt燕睿涛')

  12

  后台

  ?

  1

  2

  3

  4

  #对于GBK字符串

  $len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);

  #对于UTF8字符串

  $len = ceil(strlen(bin2hex($word))/2);

  以上所述就是本文的全部内容了,希望大家能够喜欢。

【谈谈php中的unicode和utf8编码】相关文章:

ASCII编码和Unicode编码11-03

ASCII编码与Unicode编码10-17

C语言:ASCII编码与Unicode编码10-11

PHP中php://input和$-POST的区别08-26

解读PHP页面编码声明方法09-02

PHP页面编码声明方法详解10-08

4项PHP中文编码技巧10-18

php中php://input和$-POST有什么不同07-23

php实现utf-8转unicode函数分享09-17

Dreamweaver中预览PHP和ASP05-26