
提取utf-8里面的宽字符,转换成unicode原始编码
本来用mb_substr就可以的,但是我试着写了替代方案:
="五零零+ さす ねむめほ ミムモノサセキゥィァヰン ㄆㄊㄍㄔㄧㄛㄟㄣㄠㄜㄨㄘ";
//utf-8 string convent to unicode number array
//提取utf-8里面的宽字符,转换成unicode原始编码
function utf8_to_int($str)
{
$len = strlen($str);
$result = array(); //unicode number array
$code = 0; //unicode number
$code_n = 0; //utf8 byte number
//01111111 00011111 00001111 00000111 00000011 00000001
static $head_mask = array(0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01);
for($i = 0; $i < $len; $i++)
{
$byte = ord( $str[$i] );
/* utf8 byte */
if( ($byte & ~$head_mask[5] ) == 0xfc ) //6 byte '1111110x 10xxxxxx ...'
{
$code_n = 6;
}
elseif( ($byte & ~$head_mask[4] ) == 0xf8 ) //5 byte '111110xx 10xxxxxx ...'
{
$code_n = 5;
}
elseif( ($byte & ~$head_mask[3] ) == 0xf0 ) //4 byte '11110xxx 10xxxxxx ...'
{
$code_n = 4;
}
elseif( ($byte & ~$head_mask[2] ) == 0xe0 ) //3 byte '1110xxxx 10xxxxxx ...'
{
$code_n = 3;
}
elseif( ($byte & ~$head_mask[1] ) == 0xc0 ) //2 byte '110xxxxx 10xxxxxx '
{
$code_n = 2;
}
elseif( ($byte & ~$head_mask[0] ) == 0x00 ) //1 byte utf8 (ansi byte) '0xxxxxxx'
{
$code_n = 1;
}
else //other encoding byte (no utf8)
{
//error byte
printf("error($i):0x%02x\n", $byte);
continue;
}
//echo( "\n$i,$code_n:{". substr($str, $i, $code_n) ."}\n" );
$code = $byte & $head_mask[$code_n-1];
//$code <<=
for($j = 0; $j < $code_n-1; $j++)
{
$code <<= 6;
$code |= ord( $str[$i + $j + 1] ) & 0x3f ;
}
$i += $code_n-1;
$result[] = $code;
}
}
//$a = "中国";
for($i=0; $i<strlen($a); $i++)
{
printf("%2x ", ord($a[$i]) );
}
utf8_to_int($a);
?>
--EOF--
--EOF--
若无特别说明,本站文章均为原创,转载请保留链接,谢谢
本文地址: http://www.dulao5.com/note/2007/04/29/how-to-convert-utf-8-to-unicode.textile