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




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

分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
4 Q1 Q2 D0 b. }9 ^- l
  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.     } ?>
复制代码

# }! P8 o0 ?: |* F$ Z
( W6 f; A4 A, p7 g/ X+ y" v3 f
- |. c" s( `+ M1 B% B& _- @; t3 h
2 ?, i$ R) ?/ t, Z' N( O  L- v调用及结果:
5 W1 `* d' Q# K. U" V5 Y3 n$ ]8 Y/ `9 Z* R3 {, L  m- n4 E  P
  1. $utf8_str = '我';
  2. //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
  3. //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
  4. //输出汉字“你”echo unicode_decodes($unicode_str);
复制代码
, i3 g# `1 D- A2 z1 I

' p' h5 H2 y; X4 }) _8 x1 \9 c% |# B

% z) l) n6 X! Q' L注:  由于浏览器默认会解读,所以要看源代码
: v* C8 B3 @- X
2 N9 N3 q8 U1 d' S
  1. \U6211<br/>你
复制代码
/ l3 s( P+ c( x: N
/ p# [; N6 Y, }( j' s: e; V5 r* }
9 Q+ V; j& Z, Z. `5 [$ t, f( M7 M
其它功能类似的函数, 经测试OK的:+ ]! ?1 c+ \& x- N8 R) S) \
/ Q8 B6 n, G4 q& M

5 b% v# Y0 p4 c
  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. ?>
复制代码

4 U; J# A. g/ b/ |' |

/ B2 C1 G" T  o" n" g
: K. e0 J/ f) ~. T; a$ e1 e& _& R4 h( u% E" x. h) S. v
输出ASCII形式.
. y( W# E$ j) M# V" n
  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";?>
复制代码

# R" p$ E0 E/ r" X+ F( u% r  i9 _* h; o

& C# s1 H9 N& N
5 @* y0 k' ]& S: `9 \$ E" G( w结果为:
' _2 x$ X. G( D* C
  1. 正常结果为台 实际为:台<br> 正常结果为风 实际为:风<br>
复制代码

) }" G% K) ^- P6 I0 z) T
: |/ }8 Y1 |) X( q5 v% V* T
, g2 T$ @  Z2 t4 Z8 K. @  C( Y- y( Y
2 ?! U! v/ I+ Q# p3 M* [9 O. H
  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("你");
复制代码
1 X) U/ T! b/ K9 }

5 _' f. U- R( m3 o" w2 Y% b) p/ z: @# D  ~: M
这个为只输入Unicode的数字编码5 T0 e7 p# _4 P( h3 o
* U0 D# O( p' r  S2 l9 ?. W
20197$ P5 U9 m5 q% S+ m; I, q2 J+ A0 I

$ K. p+ v: }0 ?& M
5 K, I7 q% i8 s- F  w# }+ q参考:+ r! {! g+ u9 O9 F
http://bbs.tianya.cn/post-itinfo-13681-1.shtml$ f: C( F9 F( c1 E, |
http://www.thinksaas.cn/group/topic/115335/4 N3 k7 \' y: R( A( A
http://www.jb51.net/article/14831.htm

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