HTML字符实体 解码后用php trim()函数无法清除的问题
背景:
在做多语言翻译的时候,原始内容是用富文本编辑器编辑的。获取富文本编辑器的内容后拿去翻译成其它语言(如阿拉伯语、韩语、印度尼西亚语等),为了保持各种语言翻译结果的正确性,需要把原始内容中的html字符实体解码成对应的字符,然后再拿去翻译。碰到的问题是html字符实体 解码后用php trim()函数无法删除。
示例代码:
<?php /** * html字符实体 解码后用php trim()函数无法删除的问题 * @date 2022-08-28 */ $a = " <span>It's a hot day.</span>"; // 从富文本编辑器中获取到的内容 var_dump($a); // 输出内容: string(38) " <span>It's a hot day.</span>" $b = html_entity_decode($a, ENT_QUOTES); // 将html字符实体解码成UTF-8编码的字符(html_entity_decode函数第三个参数不传的话默认是UTF-8编码) var_dump($b); // 输出内容: string(30) "Â <span>It's a hot day.</span>" $c = bin2hex($b); // 将字符串转成十六进制 // 输出内容: string(60) "c2a03c7370616e3e49742773206120686f74206461792e3c2f7370616e3e" // 可以看出html字符实体 解码成UTF-8编码后对应的十六进制为:0xc2 0xa0 var_dump($c); $d = trim($b, chr(0xc2) . chr(0xa0)); // 去掉左右的0xc2字符拼接0xa0字符 var_dump($d); // 输出内容: string(28) "<span>It's a hot day.</span>" $e = html_entity_decode($a, ENT_QUOTES, "ISO-8859-1"); // 将html字符实体解码成ISO-8859-1编码的字符 var_dump($e); // 输出内容: string(29) " <span>It's a hot day.</span>" $f = bin2hex($e); // 将字符串转成十六进制 // 输出内容: string(58) "a03c7370616e3e49742773206120686f74206461792e3c2f7370616e3e" // 可以看出html字符实体 解码成ISO-8859-1编码后对应的十六进制为:0xa0 var_dump($f); $g = trim($e, chr(0xa0)); // 去掉左右的0xa0字符 var_dump($g); // 输出内容: string(28) "<span>It's a hot day.</span>" ?>
总结:
1. php的html_entity_decode()函数的官方文档 https://www.php.net/manual/zh/function.html-entity-decode.php 有提到如下内容:
注意:
You might wonder why trim(html_entity_decode(' ')); doesn't reduce the string to an empty string, that's because the ' ' entity is not ASCII code 32 (which is stripped by trim()) but ASCII code 160 (0xa0) in the default ISO 8859-1 encoding.
2. ISO 8859-1编码表可参见 https://zh.wikipedia.org/wiki/ISO/IEC_8859-1
3. UTF-8 NO-BREAK SPACE可参见:https://www.fileformat.info/info/unicode/char/00a0/index.htm