Discuz教程网

PHP实现gb2312、UTF-8等字符和unicode间的编码转换及PHP版unescape

[复制链接]
authicon dly 发表于 2011-11-11 10:31:05 | 显示全部楼层 |阅读模式
PHP实现gb2312、UTF-8等字符和unicode间的编码转换及PHP版unescape
  1. <?
  2. /**
  3. * 将字符串转换成unicode编码
  4. *
  5. * @param string $input
  6. * @param string $input_charset
  7. * @return string
  8. */
  9. function str_to_unicode($input, $input_charset = 'gbk'){
  10. $input = iconv($input_charset, "gbk", $input);
  11. preg_match_all("/[\x80-\xff]?./", $input, $ar);
  12. $b = array_map('utf8_unicode_', $ar[0]);
  13. $outstr = join("", $b);
  14. return $outstr;
  15. }

  16. function utf8_unicode_($c, $input_charset = 'gbk'){
  17. $c = iconv($input_charset, 'utf-8', $c);
  18. return utf8_unicode($c);
  19. }
  20. // utf8 -> unicode
  21. function utf8_unicode($c) {
  22. switch(strlen($c)) {
  23. case 1:
  24. return $c;
  25. case 2:
  26. $n = (ord($c[0]) & 0x3f) << 6;
  27. $n += ord($c[1]) & 0x3f;
  28. break;
  29. case 3:
  30. $n = (ord($c[0]) & 0x1f) << 12;
  31. $n += (ord($c[1]) & 0x3f) << 6;
  32. $n += ord($c[2]) & 0x3f;
  33. break;
  34. case 4:
  35. $n = (ord($c[0]) & 0x0f) << 18;
  36. $n += (ord($c[1]) & 0x3f) << 12;
  37. $n += (ord($c[2]) & 0x3f) << 6;
  38. $n += ord($c[3]) & 0x3f;
  39. break;
  40. }
  41. return "&#$n;";
  42. }

  43. /**
  44. * 将unicode字符转换成普通编码字符
  45. *
  46. * @param string $str
  47. * @param string $out_charset
  48. * @return string
  49. */
  50. function str_from_unicode($str, $out_charset = 'gbk'){
  51. $str = preg_replace_callback("|&#([0-9]{1,5});|", 'unicode2utf8_', $str);
  52. $str = iconv("UTF-8", $out_charset, $str);
  53. return $str;
  54. }

  55. function unicode2utf8_($c){
  56. return unicode2utf8($c[1]);
  57. }
  58. function unicode2utf8($c){
  59. $str="";
  60. if ($c < 0x80) {
  61. $str.=$c;
  62. } else if ($c < 0x800) {
  63. $str.=chr(0xC0 | $c>>6);
  64. $str.=chr(0x80 | $c & 0x3F);
  65. } else if ($c < 0x10000) {
  66. $str.=chr(0xE0 | $c>>12);
  67. $str.=chr(0x80 | $c>>6 & 0x3F);
  68. $str.=chr(0x80 | $c & 0x3F);
  69. } else if ($c < 0x200000) {
  70. $str.=chr(0xF0 | $c>>18);
  71. $str.=chr(0x80 | $c>>12 & 0x3F);
  72. $str.=chr(0x80 | $c>>6 & 0x3F);
  73. $str.=chr(0x80 | $c & 0x3F);
  74. }
  75. return $str;
  76. }

  77. /**
  78. * 模拟JS里的unescape
  79. *
  80. * @param unknown_type $str
  81. * @return unknown
  82. */
  83. function unescape($str) {
  84. $str = rawurldecode($str);
  85. preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
  86. $ar = $r[0];
  87. #print_r($ar);
  88. foreach($ar as $k=>$v) {
  89. if(substr($v,0,2) == "%u")
  90. $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));
  91. elseif(substr($v,0,3) == "&#x")
  92. $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,3,-1)));
  93. elseif(substr($v,0,2) == "&#") {
  94. echo substr($v,2,-1)."
  95. ";
  96. $ar[$k] = iconv("UCS-2","GB2312",pack("n",substr($v,2,-1)));
  97. }
  98. }
  99. return join("",$ar);
  100. }
  101. ?>
复制代码

转自:http://blog.everalan.com/204.html

补充:
unescape() 函数可对通过 escape() 编码的字符串进行解码。
语法  unescape(string)
参数描述
string必需。要解码或反转义的字符串。

返回值  string 被解码后的一个副本。
说明  该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。




上一篇:Discuz 让编辑能够解析插入mp4格式(作者:evenzhou)
下一篇:有没有专业点的网址给看看呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 04:54

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表