suppression de caractères spécifiques d'un unicode gamme à partir d'une chaîne
J'ai un programme qui est parsting tweets en temps réel sur le flux twitter de l'api. Avant de les ranger, je suis d'encodage comme de l'utf-8. Certains personnages finissent par apparaître dans la chaîne ?, ??, ou ??? au lieu de leurs codes unicode et causer des problèmes. Après enquête, j'ai constaté que la problématique de caractères sont de la "émoticône" bloc, U+1F600 - U+1F64F, et les "Divers Les symboles Et les Pictogrammes" bloc, U+1F300 - U+1F5FF. J'ai essayé de l'enlever, mais n'a pas réussi le comparateur de fini par remplacer presque tous les caractères d'une chaîne, et pas seulement de mon choix unicode gamme.
String utf8tweet = "";
try {
byte[] utf8Bytes = status.getText().getBytes("UTF-8");
utf8tweet = new String(utf8Bytes, "UTF-8");
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Pattern unicodeOutliers = Pattern.compile("[\\u1f300-\\u1f64f]", Pattern.UNICODE_CASE | Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE);
Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(utf8tweet);
utf8tweet = unicodeOutlierMatcher.replaceAll(" ");
Que puis-je faire pour supprimer ces caractères?
Si vous voyez ? au lieu d'un caractère Unicode lors de l'affichage d'un encodés en Unicode string dans un composant d'interface graphique ou en IDE sortie de la console; ne vous inquiétez elle n'est pas due au codage Unicode, il est dû à un mauvais choix de la police d'affichage qui ne supporte pas les points de code Unicode comme le Latin-1 les polices de caractères (255 points de code uniquement). Essayez d'utiliser Unicode-les polices prises en charge comme Arial Unicode MS
Désolé de ne pas être précis! Par "pas de travail", je voulais dire que le personnage n'a pas été trouvé par le matcher, ou au moins la fonction replaceAll n'a pas été appliqué. Merci, eee! C'est un bon point. Cependant, je remarque des unicodes dans ma sortie (c'est à dire "u20A2"), tandis que les personnages en question sont toujours aussi ??
OriginalL'auteur Saiato | 2012-08-17
Vous devez vous connecter pour publier un commentaire.
De l'expression régulière pattern ajouter l'opérateur de négation
^
. Pour le filtrage des caractères imprimables, vous pouvez utiliser l'expression suivante[^\\x00-\\x7F]
et vous devriez obtenir le résultat souhaité.Résultats dans la sortie suivante:
MODIFIER
Pour de plus amples explications, vous pouvez aussi garder exprimant la gamme avec le
\u
formulaire de la façon suivante[^\\u0000-\\u007F]
, qui correspond à tous les caractères qui ne sont pas les 128 premiers caractères UNICODE (le même qu'avant). Si vous souhaitez étendre la gamme à l'appui de caractères supplémentaires, vous pouvez le faire en utilisant la liste des caractères UNICODE ici.Par exemple, si vous souhaitez inclure les voyelles avec accent (utilisé en espagnol), vous devez étendre la gamme de
\u00FF
, de sorte que vous avez[^\\u0000-\\u00FF]
ou[^\\x00-\\xFF]
:BEFORE: #MentionSomeoneYouDontWannaLose@OG_RiiSky ! or i'd be ? . AFTER: MentionSomeoneYouDontWannaLose@OG_RiiSky or i d be
A été la problématique de caractère supprimé parce que les regex pensais que c'était effectivement une question de marque ou était-il réellement en mesure de tirer de cette gamme?Vous avez raison. J'ai édité la réponse de changer l'utilisé les regex, il correspond seulement les caractères imprimables.
Merci! Qui travaille tellement mieux 🙂 par curiosité, comment avez-vous obtenu que le nouveau modèle à partir de l'unicode des caractères de gamme? Il semble être l'élimination de certains caractères en dehors de la plage
BEFORE: RT @JulianSerrano01: #ContraseñasQueTuve "notelavoyadecir" le puse esa contraseña a la unica PC de la casa en ese momento, se las decia ... AFTER: RT @JulianSerrano01: #Contrase asQueTuve "notelavoyadecir" le puse esa contrase a a la unica PC de la casa en ese momento, se las decia ...
Je suis de l'autre, de SORTE quesiton j'ai répondu il y a quelques temps 🙂 (voir le lien à la fin du commentaire). Je n'ai pas d'abord penser de lui, mais alors qu'il semblait une bonne solution. La regex proposé regarde pour les caractères qui sont PAS imprimable, qui est, qui ne sont pas dans la plage spécifiée. stackoverflow.com/questions/11811301/...
Merci pour votre travail d'édition!! J'ai modifié la palette unicode dans le modèle de spécifier tous les personnages que je veux autoriser. Il fonctionne parfaitement 🙂 Pour tous les curieux, le modèle que j'ai fini par utiliser est
[^\\u0000-\\uFFEF]
, qui permet à peu près tous les caractères spéciaux et des émoticônes emoji qui briserait mon programme.OriginalL'auteur
Tout d'abord, les blocs unicode, déterminée en java (en suivant strictement la norme) comme Caractère.UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS. Dans une regex:
s.replaceAll("\\p{So}+", "")
correcte de Java (déclarée comme OTHER_SYMBOLS)merci, droit
Comment pouvez-vous savoir que "Donc" correspond à Divers? Je suis en utilisant le formulaire détaillé du bloc en ce moment:
[\\p{InMiscellaneousSymbolsAndPictographs}|\\p{InEmoticons}]+
oui, c'était la raison pour laquelle je l'ai d'abord utilisé le nom long, se trouvent dans la javadoc. Bien que certainement trop longue, qui au moins est l'auto-documentation.
ce lien sur le java Motif de javadoc. Voir catégories.
OriginalL'auteur
J'ai essayé ce. Les plages unicode sont de emoji plages
OriginalL'auteur
En supposant
status.getText()
renvoie unejava.lang.String
...Ci-dessus opération de transcodage produit les mêmes résultats que:
Cordes de Java sont implicitement UTF-16. UTF-16 et UTF-8 partagent le même jeu de caractères (Unicode) afin de transformer de l'une à l'autre et les résultats dans les données d'origine.
Java expressions régulières soutien supplémentaire de plage à l'aide de les paires de substitution. Vous pouvez faire correspondre, comme indiqué dans les réponses aux cette question.
Comme eee des notes dans son commentaire, vous avez plus de chances d'avoir une police en question. Si un graphème peut être affichée dépend généralement des polices disponibles sur le système de l'utilisateur, la police choisie et le type de police de substitution de la technologie de rendu prend en charge.
transport end (undefined)
et les gouttes de ma connexion. De sorte que les caractères doivent être supprimés en quelque sorte 🙂ressemble à un problème avec le protocole de transport.
OriginalL'auteur