如果只是unicode转utf-8编码的算法,网上到处都是了,不过很多人也是你抄我,我抄你,根本就不理解why和do,本文除了给出最简单的php对unicode转utf-8编码函数之外,也深入讨论了这两种编码的关系,理解好了会发现网上一些旧的东西,是严重多余兼过期的,因为从utf-8流行开始到现在,早已经由原来六字节可变编码到实际完全居于unicode(UCS-2)的稳定阶段。

unicode编码是实现utf-8与gb系列编码(gb2312、gbk、gb18030)转换的基础,虽然我们也可以直接做一个utf-8到这些编码的对照表,但很少有人会这么做,因为utf-8的可变编码具有不确定性,因此一般情况使用都是unicode与gb编码的对照表,unicode(UCS-2)实际上是utf-8的基础编码,utf-8只是它的一种实现而已,两者存在下面的对应关系:

Unicode符号范围           | UTF-8编码方式

u0000 0000 - u0000 007F   | 0xxxxxxx

u0000 0080 - u0000 07FF   | 110xxxxx 10xxxxxx

u0000 0800 - u0000 FFFF   | 1110xxxx 10xxxxxx 10xxxxxx

由于目前utf-8使用的字符都是居于UCS-2的,因此对于4-6字节编码的情况是不必考虑的,同样地,在反向转换的时候,如果出现四字节以上的utf-8字符,可以直接视为乱码忽略掉或转为unicode实体形式("long int;"形式),然后交给浏览器或相关解析程序去处理,用php把unicode转为utf-8编码的算法如下:

/*

* 参数 $c 是unicode字符编码的int类型数值,如果是用二进制读取的数据,在php中通常要用 hexdec(bin2hex( $bin_unichar )) 这样转换

*/

function uni2utf8( $c )

{

if ($c < 0x80)

{

$utf8char = chr($c);

}

else if ($c < 0x800)

{

$utf8char = chr(0xC0 | $c >> 0x06).chr(0x80 | $c & 0x3F);

}

else if ($c < 0x10000)

{

$utf8char = chr(0xE0 | $c >> 0x0C).chr(0x80 | $c >> 0x06 & 0x3F).chr(0x80 | $c & 0x3F);

}

//因为UCS-2只有两字节,所以后面的情况是不可能出现的,这里只是说明unicode HTML实体编码的用法。

else

{

$utf8char = "{$c};";

}

return $utf8char;

}

在目前的环境范围内,可以认为 utf-8字符集==unicode(UCS-2),但从理论上,主要字符集之关的包含关系如下:

utf-8 > unicode(UCS-2) > gb18030 > gbk > gb2312

因此,如果编码都正确的情况下

gb2312 => gbk => gb18030 => unicode(UCS-2) => utf-8

这样的一个转变过程,基本上是无损的,但反而言之,由

utf-8 => unicode(UCS-2) => gb18030=> gbk => gb2312

这样的转变过程,是很可能存在不能识别的字符的,因此,如果对于使用utf-8编码的系统,尽量不要轻易的去做反向转换编码的操作。

php 16进制转换utf-8,php对unicode转utf-8编码相关推荐

  1. python ascii码16进制转换_如何在Python十六进制整数和ASCii编码的字符串之间进行转换...

    今天,我将与您分享一种将Python十六进制整数转换为ASCii编码的字符串的方法,该方法具有很好的参考价值,希望对大家有所帮助. 让我们一起关注小编,看看 当使用Pyserial与STM32通信时, ...

  2. java 10zhuan8,Java代码 10进制转2、8、16进制转换 / 2、8、16进制转10进制转换

    public static void main(String[] args) { int i = 10; System.out.println("***********10进制转换2进制.8 ...

  3. C# 中关于汉字与16进制转换的代码

    /// <summary>     /// 从汉字转换到16进制     /// </summary>     /// <param name="s" ...

  4. c# .net 16进制转换10进制

    业务调用 #region C#十六进制字符串转十进制 { Console.WriteLine("-----------十六进制字符串转十进制---------");//H:十六进制 ...

  5. C# .NET 16进制转换,10进制转换,8进制转换,2进制转换

    C# .NET 16进制转换,10进制转换,8进制转换,2进制转换 介绍: 16进制:外文名"Hexadecimal"简写 hex: 大多时候以"H"表示 10 ...

  6. C语言 将16进制转换成10进制输出

    大家好!今天来打印16进制转换成10进制输出,16进制前面是0x.这里以打印ABCDEF的10进制为例 如下: 希望有所启发!!!^__^ 大雨落幽燕,白浪滔天,秦皇岛外打鱼船. ---------- ...

  7. oracle转换为16进制,Oracle的十进制和16进制转换函数

    Oracle的10进制和16进制转换函数 在数据库中,常常需要将10进制转16进制,又会需要将16进制转10进制.有两个使用PL/SQL开发的函数,可以方便使用. create or replace ...

  8. JS 10和16进制转换 封装

    /* * 10和16进制转换* prin 为true将10进制转为16进制* prin 为false将16进制转为10进制*/ function Sixteen_ten(str,prin){str = ...

  9. Python 各种进制相互转换 16进制转换成2进制 不够用0补齐 前面补0

      2进制 8进制 10进制 16进制 2进制 - bin(int(x, 8)) bin(int(x, 10)) bin(int(x, 16)) 8进制 oct(int(x, 2)) - oct(in ...

  10. 【汇编】16进制转换成10进制(三种方法)

    汇编语言程序:16进制转换成10进制(三种方法) 1 ;天水浪客(Gouki Jiang) , 16进制to10进制例题 2007.5.18 2 STACK SEGMENT PARA STACK 3 ...

最新文章

  1. R堆叠柱状图各成分连线画法:突出展示组间物种丰度变化
  2. 一口气说出 6 种 @Transactional 注解的失效场景
  3. Spring-Security-入门(一):登录与退出
  4. Swift之高德地图自定义标注弹出气泡样式
  5. 一步一步SharePoint 2007之三十一:实现文档Event Handler(3)——附加Handler程序
  6. Linux01-BASH的while流程控制41
  7. 在表格中批量显示图片
  8. DCMTK:用于管理常见的增强型CT特定类型的类
  9. SQLite的局限性
  10. sql server 2008 身份验证失败 18456
  11. oracle dba开头的表,oracle中以dba_、user_、v$_、all_、session_、index_开头的常用表和视图...
  12. ucdavis计算机科学专业,UCDavis的CS「加州大学戴维斯分校计算机科学专业」
  13. codeforce 贪心1
  14. 2022-07-28 顾宇佳 学习笔记
  15. 《影响力》第七章:稀缺
  16. 电影「哪吒之魔童降世」免 费 高 清 完 整 版 在 线 观 看
  17. 华为智慧屏鸿蒙系统缺点,华为智慧屏用户评论及华为智慧屏电视真实体验优缺点情况...
  18. Python官方编译器的安装
  19. [RaspberryPi] 一键部署树莓派Zero电子相框功能!
  20. 数字图像处理(Digital Image Processing)

热门文章

  1. Linux之grep:过滤器按照字符进行过滤  选项规定内容样式 模式规定内容
  2. 反思读别人代码的思路
  3. 开发一个出生年份的下拉选择框供用户选择_你的下拉式菜单设计对了吗?
  4. 微信小程序页面间的对象传递
  5. java 语法 冒号_java中生僻的冒号跳转语法
  6. php 去除中英文空格,php去除字符串首尾中英文空格程序_PHP教程
  7. git gui管理服务器配置文件,从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)...
  8. python input函数赋值法_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
  9. 【javascript】四舍五入
  10. Nutch2.4 存储方式配置