检查utf-8字符是否需要最多三个字节

csbfibhn  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(310)

我需要保存一个用户输入到数据库的列 utf8_general_ci 每个码位最多需要三个字节的编码。但如果用户输入包含使用四个字节的字符(例如emojis),则输入不会保存到列中。我需要的是检查输入只包含最多使用三个字节的字符。我知道我可以把列编码改成 utf8mb4 但我不想这么做。
那么我该怎么做呢:

if (maxThreeBytes("?")) { //return fail
    echo "success";
}
else  {
    echo "fail";
}

另一个例子:

maxThreeBytes("a") => true
maxThreeBytes("ščřžý") => true
maxThreeBytes("test this") => true
maxThreeBytes("??") => false
maxThreeBytes("hello ?") => false
maxThreeBytes("test this") => true
maxThreeBytes("test ? this") => false
kqhtkvqz

kqhtkvqz1#

假设 $str utf-8编码:

function maxThreeBytes($str) {
    return preg_match('@[\\xf0-\\xff][\\x80-\\xff][\\x80-\\xff][\\x80-\\xff]@', $str) ? false : true;
}

它检查字符串是否包含四个匹配的字符 11110b 10b 10b 10b 它是u+10000和u+10ffff之间字符的编码。

c9qzyr3d

c9qzyr3d2#

对于utf-8转换:

$input = iconv('UTF-8', 'UTF-8//IGNORE', trim(strip_tags($input)));

只为正则表达式

$input = preg_replace("/[^A-Za-z0-9:[:blank:]]()\+\-/","",$input);

这不是一个完整的答案,只是一个例子,等待更多的评论你可能需要更多的符号在正则表达式,添加你需要的,发挥:<

相关问题