$7.49 .com domain with free InstantPage Website Builder$1.99 Web Hosting   捷飞网络官方淘宝店   Godaddy 优惠码
返回列表 发帖
分享到:




[PHP 语言] 分享PHP自建函数 UTF-8和Unicode编码互转(多语言)

分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
! d' l1 ^3 H, W, Y
  1. <?/**
  2.      * //将内容进行UNICODE编码
  3.      * utf-8 转unicode
  4.      *
  5.      * @param string $name
  6.      * @return string
  7.      */
  8.     function utf8_unicode($name){  
  9.         $name = iconv('UTF-8', 'UCS-2', $name);  
  10.         $len  = strlen($name);  
  11.         $str  = '';  
  12.         for ($i = 0; $i < $len - 1; $i = $i + 2){  
  13.             $c  = $name[$i];  
  14.             $c2 = $name[$i + 1];  
  15.             if (ord($c) > 0){   //两个字节的文字  
  16.                 $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);  
  17.                 //$str .= base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);  
  18.             } else {  
  19.                 $str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);  
  20.                 //$str .= str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);  
  21.             }  
  22.         }  
  23.         $str = strtoupper($str);//转换为大写  
  24.         return $str;  
  25.     }  
  26.   
  27.     /**
  28.      * unicode 转 utf-8
  29.      *
  30.      * @param string $name
  31.      * @return string
  32.      */  
  33.     function unicode_decodessss($name)  
  34.     {  
  35.         $name = strtolower($name);  
  36.         // 转换编码,将Unicode编码转换成可以浏览的utf-8编码  
  37.         $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';  
  38.         preg_match_all($pattern, $name, $matches);  
  39.         if (!empty($matches))  
  40.         {  
  41.             $name = '';  
  42.             for ($j = 0; $j < count($matches[0]); $j++)  
  43.             {  
  44.                 $str = $matches[0][$j];  
  45.                 if (strpos($str, '\\u') === 0)  
  46.                 {  
  47.                     $code = base_convert(substr($str, 2, 2), 16, 10);  
  48.                     $code2 = base_convert(substr($str, 4), 16, 10);  
  49.                     $c = chr($code).chr($code2);  
  50.                     $c = iconv('UCS-2', 'UTF-8', $c);  
  51.                     $name .= $c;  
  52.                 }  
  53.                 else  
  54.                 {  
  55.                     $name .= $str;  
  56.                 }  
  57.             }  
  58.         }  
  59.         return $name;  
  60.     } ?>
复制代码
( _8 @1 y/ M' y$ ^& t
( V$ G/ l* S: t( r; `

, q7 I3 `* v/ P
5 T0 m( u& |* y/ O. }7 f调用及结果:3 ]! a5 I: h/ j, Z% X
& g% V9 U: G' t
  1. $utf8_str = '我';
  2. //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
  3. //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
  4. //输出汉字“你”echo unicode_decodes($unicode_str);
复制代码
+ ]* v: T$ |% P
3 c; i$ ?2 M" ]& ~
) I2 i4 }. _* k
- N. p+ [" v* M. }: R  ?) e
注:  由于浏览器默认会解读,所以要看源代码
4 D* P) N- f9 y' y2 ^' }4 x3 ?) y- P# Q9 u% R
  1. \U6211<br/>你
复制代码

* K. r- J) \* q. Y8 d$ Z+ U/ H: y' y4 Q6 {* O( E' Z! e
, F& |' U+ e- i
其它功能类似的函数, 经测试OK的:* f; @, C6 O% U; i+ ~
/ l5 o; Z7 Q& q6 d

1 I# o3 B5 C: z, }; l/ |( |2 y* i
  1. <?
  2. // utf8 - unicode        this OK
  3. function utf8_unicode($c) {
  4. switch(strlen($c)) {
  5. case 1:
  6. return ord($c);
  7. case 2:
  8. $n = (ord($c[0]) & 0x3f) << 6;
  9. $n += ord($c[1]) & 0x3f;
  10. return $n;
  11. case 3:
  12. $n = (ord($c[0]) & 0x1f) << 12;
  13. $n += (ord($c[1]) & 0x3f) << 6;
  14. $n += ord($c[2]) & 0x3f;
  15. return $n;
  16. case 4:
  17. $n = (ord($c[0]) & 0x0f) << 18;
  18. $n += (ord($c[1]) & 0x3f) << 12;
  19. $n += (ord($c[2]) & 0x3f) << 6;
  20. $n += ord($c[3]) & 0x3f;
  21. return $n;
  22. }
  23. }

  24. echo "utf8_unicode正常结果为中 实际为:".utf8_unicode('中')."\r\n";
  25. ?>
复制代码

( {# u, @. F* i2 Y3 L3 W
4 {# d% O7 U* u

  [$ ^  t# ?$ Z5 P( v. y8 E
: C  t' T5 X, O- \' q6 u/ c- ?输出ASCII形式.
/ J' z3 S4 _0 X* _" o& ^
  1. <?
  2. function enode($utf8_str){
  3.         $len = strlen($utf8_str);
  4.         $a = 0;
  5.         while ($a < $len){
  6.                 $ud = 0;
  7.                 if (ord($utf8_str{$a}) >=0 && ord($utf8_str{$a})<=127)
  8.                 {
  9.                         $ud = ord($utf8_str{$a});
  10.                         $a += 1;
  11.                 }
  12.                 else if (ord($utf8_str{$a}) >=192 && ord($utf8_str{$a})<=223)
  13.                 {
  14.                         $ud = (ord($utf8_str{$a})-192)*64 + (ord($utf8_str{$a+1})-128);
  15.                         $a += 2;
  16.                 }
  17.                 else if (ord($utf8_str{$a}) >=224 && ord($utf8_str{$a})<=239)
  18.                 {
  19.                         $ud = (ord($utf8_str{$a})-224)*4096 + (ord($utf8_str{$a+1})-128)*64 + (ord($utf8_str{$a+2})-128);
  20.                         $a += 3;
  21.                 }
  22.                 else if (ord($utf8_str{$a}) >=240 && ord($utf8_str{$a})<=247)
  23.                 {
  24.                         $ud = (ord($utf8_str{$a})-240)*262144 + (ord($utf8_str{$a+1})-128)*4096 + (ord($utf8_str{$a+2})-128)*64 + (ord($utf8_str{$a+3})-128);
  25.                         $a += 4;
  26.                 }
  27.                 else if (ord($c{$a}) >=248 && ord($c{$a})<=251)
  28.                 {
  29.                         $ud = (ord($utf8_str{$a})-248)*16777216 + (ord($utf8_str{$a+1})-128)*262144 + (ord($utf8_str{$a+2})-128)*4096 + (ord($utf8_str{$a+3})-128)*64 + (ord($utf8_str{$a+4})-128);
  30.                         $a += 5;
  31.                 }
  32.                 else if (ord($utf8_str{$a}) >=252 && ord($utf8_str{$a})<=253)
  33.                 {
  34.                         $ud = (ord($utf8_str{$a})-252)*1073741824 + (ord($utf8_str{$a+1})-128)*16777216 + (ord($utf8_str{$a+2})-128)*262144 + (ord($utf8_str{$a+3})-128)*4096 + (ord($utf8_str{$a+4})-128)*64 + (ord($utf8_str{$a+5})-128);
  35.                         $a += 6;
  36.                 }
  37.                 else if (ord($utf8_str{$a}) >=254 && ord($utf8_str{$a})<=255)
  38.                 { //error
  39.                         $ud = false;
  40.                 }
  41.                 @$scill .="&#$ud;";
  42.         }
  43.         return $scill;
  44. }

  45. echo "正常结果为台 实际为:".enode('台')."<br>\r\n"; // 台 浏览器默认会解读,所以要看源代码echo "正常结果为风 实际为:".enode('风')."<br>\r\n";?>
复制代码

' v% w% w6 {5 N" I4 W) S1 A4 `. ~" M4 ~
; e& q6 n9 k7 G' F
. E4 v# y. f, q
结果为:
; j) S3 W2 ]2 b1 p1 z& H7 k8 W
  1. 正常结果为台 实际为:台<br> 正常结果为风 实际为:风<br>
复制代码
2 G, M6 m9 ~% Y% F& e' P  P6 Q
3 `9 F& F! i4 e

1 ~1 k1 ]% U- K. v- t: |2 H
) b8 \+ q4 m2 Q  `
  1. /**
  2. * utf8字符转换成Unicode字符
  3. * @param  [type] $utf8_str Utf-8字符
  4. * @return [type]           Unicode字符
  5. */

  6. function utf8_str_to_unicode($utf8_str) {
  7.     $unicode = 0;
  8.     $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
  9.     $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
  10.     $unicode |= (ord($utf8_str[2]) & 0x3F);
  11.     return dechex($unicode);
  12. }
  13. echo utf8_str_to_unicode("你");
复制代码
9 j2 D; {/ L/ n
7 ?6 f9 g) |1 r

. _  c- f1 z5 s$ S! ^这个为只输入Unicode的数字编码( A( m( C+ h) f& M% @
' g1 f5 X3 x( M8 }1 I. Y
20197
: M0 O# B8 @( e, X0 m6 `1 S, \$ z0 n. f  d& N

0 n3 V3 T; |! O( z6 U2 r. A参考:8 }# i: Q( K9 V# r! q8 u2 Y& v/ ?( t
http://bbs.tianya.cn/post-itinfo-13681-1.shtml
6 O  Q( s2 H2 q7 H; Hhttp://www.thinksaas.cn/group/topic/115335/
: e' b# [; o3 O# Uhttp://www.jb51.net/article/14831.htm

返回列表
Namecheap
Namecheap.com - Cheap domain name registration, renewal and transfers - Free SSL Certificates - Web Hosting
互联网安全