采集的数据中,原来是日文的"ブリーチ, 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
"
);
用.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());
这段代码的作用是将所有的中文、韩文、日文字符通过硬编码输出成为html实体。而Html实体是不受ResponseEncoding和页面编码集影响的。
说明:
\u0800 以上的为中、韩、日字符。
中文的范围:\u4e00 - \u9fa5,日文在\u0800 - \u4e00,韩文为\u9fa5以上。