Détection de caractères / émoticônes encodés sur quatre octets avec PHP
Publié le 17/05/2024 • Actualisé le 17/05/2024
Dans ce bout de code, nous voyons comment détecter des caractères ou des émoticônes encodés sur quatre octets avec PHP. Cela peut être utile pour éviter des erreurs à l'insertion de données utilisateurs dans des bases de données MySQL ou MariaDB. En effet, les colonnes qui utilisent la collation utf8_general_ci
ne supportent pas les émojis encodés sur quatre octets ou plus.
<?php
declare(strict_types=1);
namespace App\Controller\Snippet;
/**
* J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
* Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
* ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
* Les services sont injectés dans le constructeur du contrôleur principal.
*/
trait Snippet302Trait
{
public function snippet302(): void
{
$fourBytesPattern = '/[\xF0-\xF7][\x80-\xBF]{3}/';
$chars = [
'c', // std character (1 byte)
'é', // french accent (2 bytes)
// 3 bytes emoji
'✅',
'⚙',
'☃',
'❄',
// chinese standard character (3 bytes)
'文',
// chinese special characters (4 bytes)
'𠜎',
'𡃁',
// other special characters (4 bytes)
'𐍈',
'𐎠',
// 4 bytes emojis
'🖋',
'🎶',
'🌈',
'🐰',
'🔗',
// 8 bytes emojis (flags)
'🇫🇷',
'🇬🇧',
// other complex emojis (18 bytes)
'👨👩👧',
];
foreach ($chars as $char) {
$utf8Bytes = mb_convert_encoding($char, 'UTF-8');
$length = \strlen($utf8Bytes); // Get the length of the UTF-8 bytes
echo $char.': 4 bytes or more? '.(preg_match($fourBytesPattern, $char) === 1 ? 'true' : 'false').' (bytes length: '.$length.')';
echo PHP_EOL;
}
// That's it! 😁
}
}
Exécuter le snippet Plus sur Stackoverflow Snippet aléatoire