澳门新葡萄京娱乐场PHP6的新特性:Unicode和TextIterator

我刚刚安装了PHP6
DEV版本,决定测试一下PHP6的新特性-PHP的Unicode支持。我并没有打算讲PHP6的新特性或者是Unicode,下面仅仅是我做的关于Unicode的测试。

汉字转换成unicode方法

首先要做的是让php6支持Unicode,在php.ini文件中修改。

 代码如下

;;;;;;;;;;;;;;;;;;;;; Unicode settings
;;;;;;;;;;;;;;;;;;;;;unicode.semantics = onunicode.runtime_encoding =
utf-8unicode.script_encoding = utf-8unicode.output_encoding =
utf-8unicode.from_error_mode =
U_INVALID_SUBSTITUTEunicode.from_error_subst_char =
3f由于我使用的是法语和英语有所不同,有一些字符需要处理。所以,我第一次试验的目的是检验strlen功能的Unicode

<?php
//将utf8编码的汉字转换为unicode
function htou($c){
 $n = (ord($c[0]) & 0x1f) << 12;
 $n = (ord($c[1]) & 0x3f) << 6;
 $n = ord($c[2]) & 0x3f;
 return $n;
}

$word = tre;echo Length: .strlen($word);

//在代码中隐藏utf8格式的字符串
function my_utf8_unicode($str) {
 $encode=”;
 for($i=0;$i<strlen($str);$i ){
  if(ord(substr($str,$i,1))> 0xa0){
   $encode.=’&#’.htou(substr($str,$i,3)).’;’;
   $i =2;
  }else{
   $encode.=’&#’.ord($str[$i]).’;’;
  }
 }
 return $encode;
}

结果是: Length: 4 。结果非常的正确 但它仅仅是个开始! : )

echo my_utf8_unicode(“哈哈ABC”);
?>

我的第二个测试对象是与PHP6新的SPL中的TextIterator textiterator$word =
tre;foreach (new TextIterator($word, TextIterator::CHARACTER) as
$character) {? var_inspect($character);}

汉字转换成unicode方法二

输出: unicode(1) { 00ea } unicode(1) t { 0074 } unicode(1) r { 0072 }
unicode(1) e { 0065 }分解单词,得到了很多的字母和字母的信息

 代码如下

TextIterator::CHARACTER的操作看上去非常的强大啊,不过TextIterator::WORD更强大

function getUnicode($word)
{
 // 转UTF8
 $word0 = iconv(‘gbk’, ‘utf-8’, $word);
 $word1 = iconv(‘utf-8’, ‘gbk’, $word0);
 $word =  ($word1 == $word) ? $word0 : $word;
 // 拆分汉字
 preg_match_all(‘#(?:[x00-x7F]|[xC0-xFF][x80-xBF]+)#s’, $word,
$array, PREG_PATTERN_ORDER);
 $return  = array();
 // 转换
 foreach ($array[0] as $cc)
 {
  $arr = str_split($cc);
  $bin_str = ”;
  foreach ($arr as $value)
  {
   $bin_str .= decbin(ord($value));
  }
  $bin_str =
preg_replace(‘/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/’,’$1$2$3′,
$bin_str);
  $return[] = ‘&#’ . bindec($bin_str) . ‘;’;
 }
 
 return implode(”, $return);
}

$sentences = Bonjour, nous sommes Franais ! Ae :);foreach (new
TextIterator($sentences, TextIterator::WORD) as $word) {
var_inspect($word);}

函数用法:

得到的结果: unicode(7) Bonjour { 0042 006f 006e 006a 006f 0075 0072 }
unicode(1) , { 002c } unicode(1) { 0020 } unicode(4) nous { 006e 006f
0075 0073 } unicode(1) { 0020 } unicode(6) sommes { 0073 006f 006d 006d
0065 0073 } unicode(1) { 0020 } unicode(8) Franais { 0046 0072 0061 006e
00e7 0061 0069 0073 } unicode(1) { 0020 }

 代码如下

$word = ‘一个汉字转换成Unicode四字节编码的PHP函数。’;
echo getUnicode($word);

上述将输出如下结果:

&#19968&#20010&#27721&#23383&#36716&#25442&#25104&#65333&#65358
&#65353&#65347&#65359&#65348&#65349&#22235&#23383&#33410&#32534
&#30721&#30340&#80&#72&#80&#20989&#25968&#12290

这一组函数可以将汉字转成unicode编码,也可以将unicode解码成汉字。
将汉字转成Unicode的函数:

 代码如下

function uni_encode ($word)
{
 $word0 = iconv(‘gbk’, ‘utf-8’, $word);
 $word1 = iconv(‘utf-8’, ‘gbk’, $word0);
 $word =  ($word1 == $word) ? $word0 : $word;
    $word = json_encode($word);
    $word = preg_replace_callback(‘/\u(w{4})/’,
create_function(‘$hex’, ‘return ‘&#’.hexdec($hex[1]).’;’;’),
substr($word, 1, strlen($word)-2));
    return $word;
}

对Unicode编码进行解码的函数:

 代码如下

function uni_decode ($uncode)
{
    $word = json_decode(preg_replace_callback(‘/&#(d{5});/’,
create_function(‘$dec’, ‘return ‘u’.dechex($dec[1]);’),
‘”‘.$uncode.'”‘));
    return $word;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注