89 votes

C'est quoi ces Unicode des caractères combinés et comment pouvons-nous les filtrer?

กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้

Ces a récemment montré dans facebook les sections de commentaires.

Comment peut-on désinfecter?

80voto

T.J. Crowder Points 285826

C'est quoi ces caractères unicode?

C'est un personnage avec une série de combinaisons de caractères. Parce que la combinaison de caractères en question veulent aller au-dessus de la base de caractère, ils empilent (littéralement). Par exemple, le cas de

ก้้้้้้้้้้้้้้้้้้้้

...c'est un ก (caractères Thaï ko kai) (U+0E01), suivie par 20 exemplaires de l'Thaïlandais combinaison de caractères mai tho (U+0E49).

Comment peut-on désinfecter?

Vous pourriez pré-traiter le texte et de limiter le nombre de combinaisons de caractères qui peut être appliquée qu'à un seul personnage, mais l'effort ne peut pas être une valeur de la récompense. Vous auriez besoin les fiches techniques de tous les personnages donc, si vous voulez savoir s'ils sont la combinaison ou de l', et vous devez assurez-vous de laisser au moins un peu, parce que certaines langues sont écrites avec plusieurs signes diacritiques sur une seule base. Maintenant, si vous voulez limiter les commentaires aux caractères latins, ce serait plus facile de vérification de plage, mais bien sûr ce n'est qu'une option si vous voulez limiter les commentaires de quelques langues. Plus d'informations, les feuilles de code, etc. au unicode.org.

BTW, si jamais vous voulez savoir comment certains de ces caractères a été composé, pour une autre question tout récemment, j'ai codé un rapide et sale "Unicode Me Montrer" à la page sur JSBin. Vous suffit de copier et coller le texte dans la zone de texte, et il vous montre tous les points de code (~caractères) que le texte est constitué de, avec des liens tels que ceux ci-dessus à la page décrivant chaque personnage. Elle ne fonctionne que pour les points de code dans la plage U+FFFF et la vertu, parce que c'est écrit en JavaScript, et pour traiter les caractères au-dessus de U+FFFF en JavaScript que vous avez à faire plus de travail que je voulais faire de cette question (parce qu'en JavaScript, un "caractère" est toujours 16 bits, ce qui signifie que pour certaines langues, un personnage peut être divisée en deux JavaScript "caractères" et je n'ai pas de compte pour ça), mais c'est pratique pour la plupart des textes...

18voto

nwellnhof Points 7740

Si vous avez un moteur d'expressions régulières décent avec le support de l'Unicode, il est trivial pour assainir ce genre de chaînes de caractères. En Perl, par exemple, vous pouvez supprimer tous les mais la première combinant la marque de chaque (perçue par l'utilisateur) comme ceci:

#!/usr/bin/perl
use strict;
use utf8;

binmode(STDOUT, ':utf8');

my $string = "กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้";
$string =~ s/(\p{Mark})\p{Mark}+/$1/g; # Strip excess combining marks
print("$string\n");

Ce sera d'impression:

กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้

12voto

FlipMcF Points 3577

"Comment peut-on assainir ce" est le mieux répondu ci-dessus par T. J Crowder

Cependant, je pense que la désinfection est pas la bonne approche, et Cristy a droite avec overflow:hidden sur le css contenant l'élément.

Au moins, c'est la façon dont je suis le résoudre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X