/*******************************
//GB转UTF-8编码
*******************************/
function gb2utf8($gbstr) {
global $CODETABLE;
if(trim($gbstr)=="") return $gbstr;
if(empty($CODETABLE)){
$filename = dirname(__FILE__)."/gb2312-utf8.table";
$fp = fopen($filename,"r");
while ($l = fgets($fp,15))
{ $CODETABLE[hexdec(substr($l, 0, 6))] = substr($l, 7, 6); }
fclose($fp);
}
$ret = "";
$utf8 = "";
while ($gbstr) {
if (ord(substr($gbstr, 0, 1)) > 127) {
$thisW = substr($gbstr, 0, 2);
$gbstr = substr($gbstr, 2, strlen($gbstr));
$utf8 = "";
@$utf8 = u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW)) - 0x8080]));
if($utf8!=""){
for ($i = 0;$i < strlen($utf8);$i += 3)
$ret .= chr(substr($utf8, $i, 3));
}
}
else
{
$ret .= substr($gbstr, 0, 1);
$gbstr = substr($gbstr, 1, strlen($gbstr));
}
}
return $ret;
}
//Unicode转utf8
function u2utf8($c) {
for ($i = 0;$i < count($c);$i++)
$str = "";
if ($c < 0x80) {
$str .= $c;
} else if ($c < 0x800) {
$str .= (0xC0 | $c >> 6);
$str .= (0x80 | $c & 0x3F);
} else if ($c < 0x10000) {
$str .= (0xE0 | $c >> 12);
$str .= (0x80 | $c >> 6 & 0x3F);
$str .= (0x80 | $c & 0x3F);
} else if ($c < 0x200000) {
$str .= (0xF0 | $c >> 18);
$str .= (0x80 | $c >> 12 & 0x3F);
$str .= (0x80 | $c >> 6 & 0x3F);
$str .= (0x80 | $c & 0x3F);
}
return $str;
}
function utf82gb($utfstr)
{
global $UC2GBTABLE;
$okstr = "";
if(trim($utfstr)=="") return $utfstr;
if(empty($UC2GBTABLE)){
$filename = dirname(__FILE__)."/gb2312-utf8.table";
$fp = fopen($filename,"r");
while($l = fgets($fp,15))
{ $UC2GBTABLE[hexdec(substr($l, 7, 6))] = hexdec(substr($l, 0, 6));}
fclose($fp);
}
$okstr = "";
$utfstr = urlencode($utfstr);
$ulen = strlen($utfstr);
for($i=0;$i<$ulen;$i++)
{
if($utfstr[$i]=="%")
{
if($ulen>$i+2){
$hexnext = hexdec("0x".substr($utfstr,$i+1,2));
if($hexnext<127){
$okstr .= chr($hexnext);
$i = $i+2;
}
else{
if($ulen>=$i+9){
$hexnext = substr($utfstr,$i+1,8);
$c = "";
@$c = dechex($UC2GBTABLE[url_utf2u($hexnext)]+0x8080);
if($c!=""){
$okstr .= chr(hexdec($c[0].$c[1])).chr(hexdec($c[2].$c[3]));
}
$i = $i+8;
}
}
}
else
{ $okstr .= $utfstr[$i]; }
}
else if($utfstr[$i]=="+")
$okstr .= " ";
else
$okstr .= $utfstr[$i];
}
$okstr = trim($okstr);
return $okstr;
}
//三字节的URL编码转成的utf8字符转为unicode编码
function url_utf2u($c)
{
$utfc = "";
$cs = split("%",$c);
for($i=0;$i<count($cs);$i++){
$utfc .= chr(hexdec("0x".$cs[$i]));
}
$n = (ord($utfc[0]) & 0x1f) << 12;
$n += (ord($utfc[1]) & 0x3f) << 6;
$n += ord($utfc[2]) & 0x3f;
return $n;
}
网上找的,没有测试过,国内的iconv应用一般就是gb2312转utf8或者反向,上面两个函数应该够用了。
//GB转UTF-8编码
*******************************/
function gb2utf8($gbstr) {
global $CODETABLE;
if(trim($gbstr)=="") return $gbstr;
if(empty($CODETABLE)){
$filename = dirname(__FILE__)."/gb2312-utf8.table";
$fp = fopen($filename,"r");
while ($l = fgets($fp,15))
{ $CODETABLE[hexdec(substr($l, 0, 6))] = substr($l, 7, 6); }
fclose($fp);
}
$ret = "";
$utf8 = "";
while ($gbstr) {
if (ord(substr($gbstr, 0, 1)) > 127) {
$thisW = substr($gbstr, 0, 2);
$gbstr = substr($gbstr, 2, strlen($gbstr));
$utf8 = "";
@$utf8 = u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW)) - 0x8080]));
if($utf8!=""){
for ($i = 0;$i < strlen($utf8);$i += 3)
$ret .= chr(substr($utf8, $i, 3));
}
}
else
{
$ret .= substr($gbstr, 0, 1);
$gbstr = substr($gbstr, 1, strlen($gbstr));
}
}
return $ret;
}
//Unicode转utf8
function u2utf8($c) {
for ($i = 0;$i < count($c);$i++)
$str = "";
if ($c < 0x80) {
$str .= $c;
} else if ($c < 0x800) {
$str .= (0xC0 | $c >> 6);
$str .= (0x80 | $c & 0x3F);
} else if ($c < 0x10000) {
$str .= (0xE0 | $c >> 12);
$str .= (0x80 | $c >> 6 & 0x3F);
$str .= (0x80 | $c & 0x3F);
} else if ($c < 0x200000) {
$str .= (0xF0 | $c >> 18);
$str .= (0x80 | $c >> 12 & 0x3F);
$str .= (0x80 | $c >> 6 & 0x3F);
$str .= (0x80 | $c & 0x3F);
}
return $str;
}
function utf82gb($utfstr)
{
global $UC2GBTABLE;
$okstr = "";
if(trim($utfstr)=="") return $utfstr;
if(empty($UC2GBTABLE)){
$filename = dirname(__FILE__)."/gb2312-utf8.table";
$fp = fopen($filename,"r");
while($l = fgets($fp,15))
{ $UC2GBTABLE[hexdec(substr($l, 7, 6))] = hexdec(substr($l, 0, 6));}
fclose($fp);
}
$okstr = "";
$utfstr = urlencode($utfstr);
$ulen = strlen($utfstr);
for($i=0;$i<$ulen;$i++)
{
if($utfstr[$i]=="%")
{
if($ulen>$i+2){
$hexnext = hexdec("0x".substr($utfstr,$i+1,2));
if($hexnext<127){
$okstr .= chr($hexnext);
$i = $i+2;
}
else{
if($ulen>=$i+9){
$hexnext = substr($utfstr,$i+1,8);
$c = "";
@$c = dechex($UC2GBTABLE[url_utf2u($hexnext)]+0x8080);
if($c!=""){
$okstr .= chr(hexdec($c[0].$c[1])).chr(hexdec($c[2].$c[3]));
}
$i = $i+8;
}
}
}
else
{ $okstr .= $utfstr[$i]; }
}
else if($utfstr[$i]=="+")
$okstr .= " ";
else
$okstr .= $utfstr[$i];
}
$okstr = trim($okstr);
return $okstr;
}
//三字节的URL编码转成的utf8字符转为unicode编码
function url_utf2u($c)
{
$utfc = "";
$cs = split("%",$c);
for($i=0;$i<count($cs);$i++){
$utfc .= chr(hexdec("0x".$cs[$i]));
}
$n = (ord($utfc[0]) & 0x1f) << 12;
$n += (ord($utfc[1]) & 0x3f) << 6;
$n += ord($utfc[2]) & 0x3f;
return $n;
}
网上找的,没有测试过,国内的iconv应用一般就是gb2312转utf8或者反向,上面两个函数应该够用了。
解决方案 »
- 请教一个图片上传到多目录的问题,循环不出不知道为什么,请教下大家
- 请问这两个有什么区别?
- 一天只能刷新一次的随机数
- php mail 函数发送邮件失败
- 多个程序员同时操作一文件的时候有什么好机制?
- 数据库总是出现Warning: mysql_connect(): User 'playbb' has exceeded the 'max_connections' resource (current value: 60000)
- $R=($color>>16) & 0xff; 这句怎么解释?
- 请问如何update一个字符串,我用update db set txt=txt+'$word,它竟然认为是数值加法,结束为0
- 求教,关于PHP 5.6 PDO如何处理sql server 数据库
- 各位大神,求助! 写了一段php,连接mysql之后,谷歌浏览器可以显示连接数据库成功,但IE和firefox提示需要下载PHP,是什么情况
- 有关PHP个人blog源码的问题
- 求教一个PHP的问题?谢谢
下載地址osc_iconv.zip
里面有对照表的如果需要非要使用,建议在php中打开iconv吧。
iconv 能处理的字符集有很多,自己写的肯定不能全包括
不过要开启php_mbstring.dll扩展。