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




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

分享PHP自建函数 UTF-8和Unicode编码互转(多语言)0 r- V( I4 n6 K+ 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.     } ?>
复制代码

6 H! f+ }. k; {6 L3 h) D% c! l+ d8 E8 i) a# c# V3 v4 p
( }7 M( `$ E+ b" r9 H
) }- R* l7 A$ R
调用及结果:+ _; g! d; `4 J' _* n

3 r4 e4 N! G  X7 {# B+ e
  1. $utf8_str = '我';
  2. //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
  3. //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
  4. //输出汉字“你”echo unicode_decodes($unicode_str);
复制代码
" l$ n6 b" M" B6 u; ~$ w! w
) P* o. o" }7 e% n, s* q& W1 v5 p
( J; V) s# s; |5 e8 O
5 Y) V' k( \/ I7 s( ?; o
注:  由于浏览器默认会解读,所以要看源代码 - m. C( ~0 F5 n3 v

. I5 E* R0 b# p# t
  1. \U6211<br/>你
复制代码
( W9 f# ?$ d: E: l: ~
4 a3 E5 b: ~& H$ K# q, I  G1 s( t1 m
- A' i2 X+ t4 D, D- }
其它功能类似的函数, 经测试OK的:
' Y2 w, r1 b. [: [% K+ x3 G" x$ e( o' {; x% [
1 E9 g, D3 o. @* E, r+ W/ e: r0 f
  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. ?>
复制代码

2 U6 q2 W- v; u7 h/ x
, k! G4 y9 h4 C4 \+ V2 G* F

0 v0 b. g& y( {' s* T1 x5 |& M
# Q5 }- D! N6 J$ A5 S( L输出ASCII形式.
8 @6 H# y; e; {( }  L2 H! S
  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";?>
复制代码

& I, s: o0 n& [8 n! Q. h$ W; N/ G
# G$ H+ @4 L9 B( ?% f+ ?- Z4 G; l
9 O0 _. K! V/ c! B1 D% {# _! ?' X+ k% M) |
结果为:
7 M9 J. E# ?. f- \9 E
  1. 正常结果为台 实际为:台<br> 正常结果为风 实际为:风<br>
复制代码

2 E, Y  h" ^& i0 _# s0 v5 C5 {2 h# W$ V9 f

( u) W. O2 _% S- k/ @  |0 D) n/ k! B
  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("你");
复制代码
0 w% D6 I* R( F

/ q5 I! j3 n4 I1 c8 R
0 D( `* r; ~* `) n9 J4 U这个为只输入Unicode的数字编码
- s: K3 {$ L: @- C' k& I) Q# V
; ]1 ?% R- k4 W8 d20197( l! f0 [' t, z
: ~  M0 ~# D; G
8 h, C! s0 b9 e5 Q: Z1 M9 c
参考:" H- k, G0 F* a" L& Y
http://bbs.tianya.cn/post-itinfo-13681-1.shtml
5 h" e* f3 W+ s$ j& ?! P0 j* X7 Whttp://www.thinksaas.cn/group/topic/115335/
" n; k1 e) a/ S5 A+ \) Fhttp://www.jb51.net/article/14831.htm




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