retweet

提取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--

若无特别说明,本站文章均为原创,转载请保留链接,谢谢

本文地址: http://www.dulao5.com/note/2007/04/29/how-to-convert-utf-8-to-unicode.textile