- 帖子
- 212
- 主题
- 189
- 精华
- 0
- 积分
- 1452
- 贡献
- 1134
- 激情
- 1349
- 阅读权限
- 100
- 最后登录
- 2018-6-13
|
[PHP 语言] 分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
! d' l1 ^3 H, W, Y- <?/**
- * //将内容进行UNICODE编码
- * utf-8 转unicode
- *
- * @param string $name
- * @return string
- */
- function utf8_unicode($name){
- $name = iconv('UTF-8', 'UCS-2', $name);
- $len = strlen($name);
- $str = '';
- for ($i = 0; $i < $len - 1; $i = $i + 2){
- $c = $name[$i];
- $c2 = $name[$i + 1];
- if (ord($c) > 0){ //两个字节的文字
- $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
- //$str .= base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
- } else {
- $str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);
- //$str .= str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);
- }
- }
- $str = strtoupper($str);//转换为大写
- return $str;
- }
-
- /**
- * unicode 转 utf-8
- *
- * @param string $name
- * @return string
- */
- function unicode_decodessss($name)
- {
- $name = strtolower($name);
- // 转换编码,将Unicode编码转换成可以浏览的utf-8编码
- $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
- preg_match_all($pattern, $name, $matches);
- if (!empty($matches))
- {
- $name = '';
- for ($j = 0; $j < count($matches[0]); $j++)
- {
- $str = $matches[0][$j];
- if (strpos($str, '\\u') === 0)
- {
- $code = base_convert(substr($str, 2, 2), 16, 10);
- $code2 = base_convert(substr($str, 4), 16, 10);
- $c = chr($code).chr($code2);
- $c = iconv('UCS-2', 'UTF-8', $c);
- $name .= $c;
- }
- else
- {
- $name .= $str;
- }
- }
- }
- return $name;
- } ?>
复制代码 ( _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
- $utf8_str = '我';
- //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
- //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
- //输出汉字“你”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
* 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- <?
- // utf8 - unicode this OK
- function utf8_unicode($c) {
- switch(strlen($c)) {
- case 1:
- return ord($c);
- case 2:
- $n = (ord($c[0]) & 0x3f) << 6;
- $n += ord($c[1]) & 0x3f;
- return $n;
- case 3:
- $n = (ord($c[0]) & 0x1f) << 12;
- $n += (ord($c[1]) & 0x3f) << 6;
- $n += ord($c[2]) & 0x3f;
- return $n;
- case 4:
- $n = (ord($c[0]) & 0x0f) << 18;
- $n += (ord($c[1]) & 0x3f) << 12;
- $n += (ord($c[2]) & 0x3f) << 6;
- $n += ord($c[3]) & 0x3f;
- return $n;
- }
- }
- echo "utf8_unicode正常结果为中 实际为:".utf8_unicode('中')."\r\n";
- ?>
复制代码
( {# u, @. F* i2 Y3 L3 W4 {# 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& ^- <?
- function enode($utf8_str){
- $len = strlen($utf8_str);
- $a = 0;
- while ($a < $len){
- $ud = 0;
- if (ord($utf8_str{$a}) >=0 && ord($utf8_str{$a})<=127)
- {
- $ud = ord($utf8_str{$a});
- $a += 1;
- }
- else if (ord($utf8_str{$a}) >=192 && ord($utf8_str{$a})<=223)
- {
- $ud = (ord($utf8_str{$a})-192)*64 + (ord($utf8_str{$a+1})-128);
- $a += 2;
- }
- else if (ord($utf8_str{$a}) >=224 && ord($utf8_str{$a})<=239)
- {
- $ud = (ord($utf8_str{$a})-224)*4096 + (ord($utf8_str{$a+1})-128)*64 + (ord($utf8_str{$a+2})-128);
- $a += 3;
- }
- else if (ord($utf8_str{$a}) >=240 && ord($utf8_str{$a})<=247)
- {
- $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);
- $a += 4;
- }
- else if (ord($c{$a}) >=248 && ord($c{$a})<=251)
- {
- $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);
- $a += 5;
- }
- else if (ord($utf8_str{$a}) >=252 && ord($utf8_str{$a})<=253)
- {
- $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);
- $a += 6;
- }
- else if (ord($utf8_str{$a}) >=254 && ord($utf8_str{$a})<=255)
- { //error
- $ud = false;
- }
- @$scill .="&#$ud;";
- }
- return $scill;
- }
- 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- 正常结果为台 实际为:台<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 `- /**
- * utf8字符转换成Unicode字符
- * @param [type] $utf8_str Utf-8字符
- * @return [type] Unicode字符
- */
- function utf8_str_to_unicode($utf8_str) {
- $unicode = 0;
- $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
- $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
- $unicode |= (ord($utf8_str[2]) & 0x3F);
- return dechex($unicode);
- }
- 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 |
|