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




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

分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
/ U5 d5 k( o3 J% Y% S
  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.     } ?>
复制代码
: R" m8 L; P* @

- x7 U  N) w' ]; {# p2 u% n  J
9 S7 D1 g6 ?+ p6 g6 p* [% j3 j$ w; y: F0 I
调用及结果:
+ s9 R1 n% {& T9 \' O# A1 {$ C
4 k0 B9 i$ ^7 w0 ~* Y
  1. $utf8_str = '我';
  2. //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
  3. //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
  4. //输出汉字“你”echo unicode_decodes($unicode_str);
复制代码

7 C% y4 i/ G( g7 j+ D# S! r" Q4 W0 m0 D1 ]1 ^
' [, d9 ~0 M5 l

' c# }' S0 i. i3 M) l  ~& `/ L注:  由于浏览器默认会解读,所以要看源代码   |- q# B  V) c! V, V0 G
( W2 c6 s  j# O
  1. \U6211<br/>你
复制代码
1 |9 q2 h4 k( L6 C4 k: A
: K+ ~4 \, V+ D
+ J/ p. _1 T+ u3 a3 R, z
其它功能类似的函数, 经测试OK的:
3 L9 |/ \/ }7 \/ [9 w; u+ A9 T
, ?) k2 k2 l7 o1 @" b; I. s
( l: Z, G" g$ N( r5 w
  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. ?>
复制代码

, v" z' U7 {2 F8 N5 {
1 T  l# Q$ S; D8 P& j  M

% x  {* W* D) s* f3 k& P) I4 }7 U
输出ASCII形式.
* f* L  z3 f5 f7 }; i& G
  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";?>
复制代码

) Z3 `- j. ^9 v! k$ G2 m  Y& j" o" \$ i% S" X4 q6 a+ J+ _

4 N% J, M" |" ~7 l" O) H, A" b" Y6 j2 e5 R8 j
结果为:
& A5 [" V- ~+ M/ F- D
  1. 正常结果为台 实际为:台<br> 正常结果为风 实际为:风<br>
复制代码

. ^; f# j" ~* q: m0 r) F& g8 L# F( n4 C" X  e( E
' n. T' R3 H: ~: Q. Y) U
- A! T, ]3 y9 H0 r% d. ~% n5 f
  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("你");
复制代码

: t9 J. S& d' F6 c, Z& P% {5 b3 e8 N
) G. |7 Y* w0 r/ T) t/ N9 N1 R2 T- V& @2 \; v- |6 b8 D$ _
这个为只输入Unicode的数字编码" R) `8 o( S$ g  h
( H' e$ ]5 ~# h$ I! O! Q9 A
20197
3 k4 o# i' i% }3 N6 f) S2 y  k# f6 N/ r( [

, D5 R: I8 V# \" x参考:
( {6 F$ v* }# D* jhttp://bbs.tianya.cn/post-itinfo-13681-1.shtml
8 n& L# a' |4 ~$ lhttp://www.thinksaas.cn/group/topic/115335/
* o4 x) ^1 F0 ]/ |/ q/ Y9 Nhttp://www.jb51.net/article/14831.htm


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