我在mysql 5.1服务器中使用utf8 charset mysql表,它不支持表中的utf8mb4编码。插入4字节编码的utf8字符时,如"","","","","","唧",""
。该表将弹出错误或跳过以下文本。
如何在PHP中以编程方式检测4字节编码的utf8字符并替换它们?
答案 0 :(得分:16)
这应该有效:
if (max(array_map('ord', str_split($string))) >= 240)
代码指向并包括U + FFFF的合理存在被编码为1110xxxx 10xxxxxx 10xxxxxx
形式的三个字节。较高的代码点具有11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
形式,即最高字节具有240或更高的值。如果字符串中有任何这样的字节,则它是4字节序列的指示符。
如果你想删除长字符,可以这样做:
preg_replace_callback('/./u', function (array $match) {
return strlen($match[0]) >= 4 ? null : $match[0];
}, $string)
虽然可能有更优雅的正则表达方式直接表达高代码点。
答案 1 :(得分:15)
以下正则表达式将替换4字节的UTF-8字符:
function replace4byte($string, $replacement = '') {
return preg_replace('%(?:
\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)%xs', $replacement, $string);
}
var_dump(replace4byte('d'), replace4byte('dd'));
这不依赖于/u
修饰符,因此您不必担心编译PCRE的UTF-8。但是,如果您有这种支持,则deceze的preg_replace_callback
是更整洁。
(正则改编自Ensuring valid utf-8 in PHP)