Проверьте, требуется ли для символа UTF-8 максимум три байта - PullRequest
0 голосов
/ 29 октября 2018

Мне нужно сохранить пользовательский ввод в базу данных в столбец с кодировкой 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 голосов
/ 29 октября 2018

Предполагая, что $str имеет кодировку UTF-8:

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

Он проверяет, содержит ли строка четыре символа, которые соответствуют 11110xxxb 10xxxxxxb 10xxxxxxb 10xxxxxxb, что является кодировкой символов от U + 10000 до U + 10FFFF.

0 голосов
/ 29 октября 2018

для преобразования utf-8:

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

для регулярного выражения

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

это не полный ответ, просто пример, ждите больше комментариев Возможно, вам понадобится больше символов в регулярном выражении, добавьте те, которые вам нужны, поиграйте: <</p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...