特殊字符的html编码转化
采集的数据中,原来是日文的"ブリーチ, Burīchi",html代码中是ブリーチ, Burīchi,这样做有个好处,网页就不一定要像UTF-8这样的编码,但是想要原来的文字,php转半天过不来,后来发现是未指定编码集,用
html_entity_decode("ブリーチ, Burīchi",ENT_NOQUOTES,'UTF-8')
就可以了。
其实,原理也很简单,这个是模拟这个函数的功能,PHP4的话,就一定要用了
function unhtmlentities($string)
{
// replace numeric entities
$string = preg_replace('/([0-9a-f]+);/ei', 'uchr(hexdec("\\1"))', $string);
$string = preg_replace('/&#([0-9]+);/e', 'uchr("\\1")', $string);
// replace literal entities
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($string, $trans_tbl);
}
function uchr ($codes) {
if (is_scalar($codes)) $codes= func_get_args();
$str= '';
foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8');
return $str;
}
unhtmlentities("ブリーチ, Burīchi");
{
// replace numeric entities
$string = preg_replace('/([0-9a-f]+);/ei', 'uchr(hexdec("\\1"))', $string);
$string = preg_replace('/&#([0-9]+);/e', 'uchr("\\1")', $string);
// replace literal entities
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($string, $trans_tbl);
}
function uchr ($codes) {
if (is_scalar($codes)) $codes= func_get_args();
$str= '';
foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8');
return $str;
}
unhtmlentities("ブリーチ, Burīchi");
用.net实现下编码
Byte[] bComments = Encoding.UTF8.GetBytes("一ンブル????中文");
char[] cComments = Encoding.UTF8.GetChars(bComments);
StringBuilder charBuilder = new StringBuilder();
foreach(char c in cComments)
{
if(c > '\u0800')
{
charBuilder.Append("&#");
charBuilder.Append((int)c);
}
else
{
charBuilder.Append(c);
}
}
Response.Write(charBuilder.ToString());
char[] cComments = Encoding.UTF8.GetChars(bComments);
StringBuilder charBuilder = new StringBuilder();
foreach(char c in cComments)
{
if(c > '\u0800')
{
charBuilder.Append("&#");
charBuilder.Append((int)c);
}
else
{
charBuilder.Append(c);
}
}
Response.Write(charBuilder.ToString());
这段代码的作用是将所有的中文、韩文、日文字符通过硬编码输出成为html实体。而Html实体是不受ResponseEncoding和页面编码集影响的。
说明:
\u0800 以上的为中、韩、日字符。
中文的范围:\u4e00 - \u9fa5,日文在\u0800 - \u4e00,韩文为\u9fa5以上。