定义一个用于处理格式错误的字节序列的函数,并在将字符串传递给 htmlentties 之前调用该函数。有多种方式来定义函数。
首先,如果您不使用 Windows,请尝试 UConverter::transcode。
http://pecl.php.net/package/intl
如果您愿意直接处理字节,请参阅我之前的回答。
https://stackoverflow.com/a/13695364/531320
最后一个选项是开发 PHP 扩展。感谢 php_next_utf8_char,这并不难。这是代码示例。“scrub”这个名字来自 Ruby 2.1(参见 Ruby 1.9.X 中 Iconv.conv("UTF-8//IGNORE",...) 的等价物?)
// header file
// PHP_FUNCTION(utf8_scrub);
#include "ext/standard/html.h"
#include "ext/standard/php_smart_str.h"
const zend_function_entry utf8_string_functions[] = {
PHP_FE(utf8_scrub, NULL)
PHP_FE_END
};
PHP_FUNCTION(utf8_scrub)
{
char *str = NULL;
int len, status;
size_t pos = 0, old_pos;
unsigned int code_point;
smart_str buf = {0};
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &len) == FAILURE) {
return;
}
while (pos < len) {
old_pos = pos;
code_point = php_next_utf8_char((const unsigned char *) str, len, &pos, &status);
if (status == FAILURE) {
smart_str_appendl(&buf, "\xEF\xBF\xBD", 3);
} else {
smart_str_appendl(&buf, str + old_pos, pos - old_pos);
}
}
smart_str_0(&buf);
RETURN_STRINGL(buf.c, buf.len, 0);
smart_str_free(&buf);
}