- 帖子
- 212
- 主题
- 189
- 精华
- 0
- 积分
- 1452
- 贡献
- 1134
- 激情
- 1349
- 阅读权限
- 100
- 最后登录
- 2018-6-13
|
[PHP 语言] 分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
分享PHP自建函数 UTF-8和Unicode编码互转(多语言)
4 Q1 Q2 D0 b. }9 ^- l- <?/**
- * //将内容进行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;
- } ?>
复制代码
# }! 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
- $utf8_str = '我';
- //这是汉字“你”的Unicode编码$unicode_str = '\u4f60';
- //输出 6211echo utf8_unicode($utf8_str) . "<br/>";
- //输出汉字“你”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/ 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- <?
- // 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";
- ?>
复制代码
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- <?
- 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";?>
复制代码
# 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- 正常结果为台 实际为:台<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- /**
- * 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("你");
复制代码 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 |
|