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




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

分享PHP自建函数 UTF-8和Unicode编码互转(多语言)/ @7 W* }; _. 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.     } ?>
复制代码

/ ?3 \. j- A  L" o8 s! D3 t- H
/ [. p, X0 i; c5 b& Q; c* z! _2 k3 T" Q! S5 t7 M" E! {# n# k

& m3 x7 N  r& r# i7 [调用及结果:& G' N$ I9 O2 l, G# Z' u

- K7 d9 S& Y1 K( A- F
  1. $utf8_str = '我';
  2. //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
  3. //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
  4. //输出汉字“你”echo unicode_decodes($unicode_str);
复制代码

' x# c" y3 V7 c" ?6 B0 B' W, O" X) Z6 h4 r4 }6 Z
# x+ I+ c+ Z9 \9 B  r* a3 [. J
% D$ X6 {. v- x( W! ^* p4 g7 S6 v
注:  由于浏览器默认会解读,所以要看源代码 4 f* F; ?0 z+ ?. H
( k+ ~( J; J# g" c( N
  1. \U6211<br/>你
复制代码

  T$ T/ p0 Y) I+ M, R, A# M1 p9 K/ f2 r) _, y
. }7 {- t. J2 S$ T4 L
其它功能类似的函数, 经测试OK的:  K1 t! T) I# R  L$ Y/ n

" c+ T, p+ H: n' o' }+ f
1 ~" K( S6 L+ y6 ]# e' m" u5 H& ~6 P
  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. ?>
复制代码
  K; F+ P, s6 w0 x% a
' q( T! J8 [( z0 {

# ?" a4 K0 Q  X6 p$ b' U: }. M# y0 Z" s: ?# o
输出ASCII形式.
3 S+ u. M- o1 r
  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";?>
复制代码
6 f" _* }5 B% n

$ u% `; i$ B- x' h5 y) U, m  s  l8 B% P; h2 ~# _

" D/ @8 v; `$ s, I% O结果为:
4 F. l2 T: v% g- A
  1. 正常结果为台 实际为:台<br> 正常结果为风 实际为:风<br>
复制代码
5 W/ W5 V9 [; ~; W5 B5 O
4 R) g& O8 T$ c9 E9 X. _) o: A

; }) s, `; k; I
, h7 {4 [* H2 E4 M2 s0 \
  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("你");
复制代码

8 D; g* k" f- r+ n
4 n0 [/ h# s5 [- ^$ Q1 w& v9 |2 l" `6 r, B5 R6 `
这个为只输入Unicode的数字编码# b" ]( |( A+ ^8 t: b
( P" x% H( Z  o9 z$ ^1 l
20197
3 S& p: e4 J3 i& X5 Y+ b8 [
* ~0 s) R# p" a+ u" l/ u' C# _" X' ^& E  s  a) g! r; C
参考:
: v! R! d7 I: khttp://bbs.tianya.cn/post-itinfo-13681-1.shtml
% X9 Q* a7 H! P- k- ?http://www.thinksaas.cn/group/topic/115335/% y3 ^+ R* e) w4 \0 ^, T- u
http://www.jb51.net/article/14831.htm

美国VPS、域名代购:http://tu8l.taobao.com

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