
在 PHP 中,HTML 实体编号(如 &、< 等)与非 ASCII 字符串(如中文、特殊符号等)之间的转换是一个常见的需求。PHP 提供了内置函数来实现这种转换,例如 htmlentities()、html_entity_decode()、mb_convert_encoding() 等。
以下是一个实现 HTML 实体编号与非 ASCII 字符串相互转换的 PHP 类实例。
实现功能
将非 ASCII 字符串转换为 HTML 实体编号:
例如:
中文→中文。将 HTML 实体编号转换为非 ASCII 字符串:
例如:
中文→中文。
类实现
<?phpclass HtmlEntityConverter{
/**
* 将非 ASCII 字符串转换为 HTML 实体编号
*
* @param string $input 输入字符串
* @return string 转换后的字符串
*/
public static function encode($input)
{
$encoded = '';
$length = mb_strlen($input, 'UTF-8');
for ($i = 0; $i < $length; $i++) {
$char = mb_substr($input, $i, 1, 'UTF-8');
if (mb_check_encoding($char, 'ASCII')) {
$encoded .= $char; // ASCII 字符直接保留
} else {
$encoded .= '&#' . self::unicodeOrd($char) . ';'; // 非 ASCII 字符转换为实体编号
}
}
return $encoded;
}
/**
* 将 HTML 实体编号转换为非 ASCII 字符串
*
* @param string $input 输入字符串
* @return string 转换后的字符串
*/
public static function decode($input)
{
return html_entity_decode($input, ENT_QUOTES, 'UTF-8');
}
/**
* 获取字符的 Unicode 码点
*
* @param string $char 单个字符
* @return int Unicode 码点
*/
private static function unicodeOrd($char)
{
$ord = ord($char[0]);
if ($ord < 128) {
return $ord;
}
$bytes = strlen($char);
$result = $ord & (0xFF >> ($bytes + 1));
for ($i = 1; $i < $bytes; $i++) {
$result = ($result << 6) | (ord($char[$i]) & 0x3F);
}
return $result;
}}// 示例用法$input = '中文测试 & 特殊符号:<>&"';// 编码$encoded = HtmlEntityConverter::encode($input);echo "编码后的字符串: " . $encoded . "\n";// 解码$decoded = HtmlEntityConverter::decode($encoded);echo "解码后的字符串: " . $decoded . "\n";?>代码说明
encode()方法:遍历输入字符串的每个字符。
如果是 ASCII 字符,直接保留。
如果是非 ASCII 字符,将其转换为 HTML 实体编号(如
中)。decode()方法:使用
html_entity_decode()函数将 HTML 实体编号转换为原始字符。unicodeOrd()方法:获取字符的 Unicode 码点,用于生成 HTML 实体编号。
示例输出
编码后的字符串: 中文测试 & 特殊符号:<>&" 解码后的字符串: 中文测试 & 特殊符号:<>&"
支持的功能
支持多字节字符:
使用
mb_*函数处理多字节字符(如中文、日文等)。保留 ASCII 字符:
ASCII 字符(如字母、数字、标点符号)不会被转换。
支持特殊符号:
特殊符号(如
<、>、&、")会被正确编码和解码。
注意事项
字符编码:
确保输入字符串的编码是 UTF-8,否则可能导致转换错误。
性能问题:
对于非常大的字符串,遍历每个字符可能会影响性能。可以考虑优化算法或使用内置函数。
安全性:
在输出到 HTML 页面时,建议使用
htmlspecialchars()函数防止 XSS 攻击。
扩展功能
如果需要更复杂的功能(如只转换特定字符、支持更多编码等),可以扩展该类。例如:
public static function encodeSpecific($input, $charsToEncode){
$encoded = '';
$length = mb_strlen($input, 'UTF-8');
for ($i = 0; $i < $length; $i++) {
$char = mb_substr($input, $i, 1, 'UTF-8');
if (in_array($char, $charsToEncode)) {
$encoded .= '&#' . self::unicodeOrd($char) . ';';
} else {
$encoded .= $char;
}
}
return $encoded;}总结
通过以上实现,可以轻松地在 PHP 中实现 HTML 实体编号与非 ASCII 字符串之间的相互转换。根据实际需求,可以进一步扩展和优化代码。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


