Comment remplacer/supprimer 4(+)-octets de caractères à partir d'une chaîne UTF-8 en PHP?
Il semble que MySQL ne prend pas en charge personnages avec plus de 3 octets par défaut UTF-8 charset.
Donc, en PHP, comment puis-je me débarrasser de tous les 4 (et plus)-octets de caractères dans une chaîne de caractères et de les remplacer par quelque chose comme par un autre caractère?
- Êtes-vous sûr que les données que vous allez fonctionner avec la volonté de toujours contenir des caractères qui ne rentre pas dans mysql 3 octets en utf-8?
- Êtes-vous sûr qu'il y a des caractères similaires? 3 octets de vous donner l'ensemble du Plan Multilingue de Base; si votre besoin de beaucoup plus rares personnages au-delà de cela, envisager un autre codage Unicode (par exemple utf-16).
- Le problème c'est que je veux éviter les autres, parce que MySQL tronque les textes à ce point si quelqu'un met un de ces caractères spéciaux, là.
- Voici le billet: fluxbb.org/development/core/tickets/485
- Je suis désolé, mais c'est très bien comme disant: "eh Bien,
ß
etž
etḉ
ne rentre pas en ASCII, donc, nous allons faire enss
etz
etc
; la perte de sens et la grammaire? Je n'ai pas de soins." - Je pensais que MySQL a corrigé ce bug?
- Peut-être que dans les versions plus récentes...
- MySQL prend en charge ces caractères maintenant, à travers les utf8mb4 jeu de caractères.
- si ma réponse ci-dessous est ok, veuillez cliquer sur le gris "check" sur le côté gauche de celui-ci (points ci-dessous)
Vous devez vous connecter pour publier un commentaire.
REMARQUE: vous ne devriez pas juste de bande, mais remplacer par le remplacement de caractères U+FFFD pour éviter unicode attaques, pour la plupart XSS:
http://unicode.org/reports/tr36/#Deletion_of_Noncharacters
Depuis 4 octets UTF-8 séquences commencent toujours avec les octets
0xF0-0xF7
, la suivante devrait fonctionner:Sinon, vous pouvez utiliser
preg_replace
en mode UTF-8, mais ce sera probablement plus lent:Cela fonctionne parce que 4 octets UTF-8 séquences sont utilisées pour les points de code dans le complémentaire de l'Unicode des avions à partir de
0x10000
.Voici un exemple:
Ou, un peu plus compact et efficace:
mbstring
extension?Suis tombé sur cette question lors de la tentative de résoudre mon problème (Facebook crache certaines émoticônes que 4 octets caractères, Amazon Mechanical Turk n'accepte pas les 4 octets).
J'ai fini avec cela, ne nécessite pas d'extension mbstring:
Ci-dessous modification de la fonction 3 et 4 octets de caractères de chaîne utf8 pour '#':
Voici ma mise en œuvre de filtrer de 4 octets caractères
vous pourriez ajuster et remplacer
null
(qui supprime le char) avec certains de substitution de chaîne. Vous pouvez également remplacer>= 4
avec quelques autres octets de contrôle de la longueur.