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

时间:2018-10-29 18:27:57

标签: php mysql string encoding

我需要使用utf8_general_ci编码将用户输入保存到数据库到列,每个编码点最多需要三个字节。但是,如果用户输入包含使用四个字节的字符(例如,表情符号),则输入不会保存到列中。我需要检查输入内容是否仅包含最多使用三个字节的字符。我知道我可以将列编码更改为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

2 个答案:

答案 0 :(得分:1)

假设$str是UTF-8编码的:

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

它检查字符串是否包含与11110xxxb 10xxxxxxb 10xxxxxxb 10xxxxxxb匹配的四个字符,import torch myTensor = torch.randn(2, 2,requires_grad=True) with torch.enable_grad(): x=myTensor.sum() *10 x.backward() print(myTensor.grad) 是介于U + 10000和U + 10FFFF之间的字符的编码。

答案 1 :(得分:0)

对于utf-8转换:

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

仅用于正则表达式

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

它不是一个完整的答案,只是一个例子,等待更多评论 您可能需要在正则表达式中添加更多符号,添加所需的符号,然后试一下:<< / p>