69 votes

Erreur "Caractère non mappable pour coder UTF-8"

Je reçois une erreur de compilation à la méthode suivante.

 public static boolean isValidPasswd(String passwd) {
    String reg = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$";
    return Pattern.matches(reg, passwd);
}
 
at Utility.java:[76,74] caractère non mappable pour 
enoding UTF-8. Le 74ème caractère est '"'

Comment puis-je réparer cela? Merci.

47voto

Michael Konietzka Points 3007

Vous avez encodage problème avec votre code source du fichier. C'est peut-être ISO-8859-1 codé, mais le compilateur a été défini pour utiliser UTF-8. Cela se traduit par des erreurs lors de l'utilisation de caractères, qui n'aura pas les mêmes octets de la représentation en UTF-8 et ISO-8859-1. Ce sera le cas pour tous les caractères qui ne font pas partie de l'ASCII, par exemple ¬ de ne PAS SIGNER.

Vous pouvez simuler ce avec le programme suivant. Il utilise juste votre ligne de code source et génère une ISO-8859-1 tableau d'octets et de décoder ce "problème" avec l'encodage UTF-8. Vous pouvez voir à quelle position de la ligne est corrompu. J'ai ajouté 2 espaces à votre code source pour l'adapter à la position de 74 pour s'adapter à ce ¬ PAS de SIGNE, qui est le seul personnage, ce qui va générer différents octets en ISO-8859-1 codage et encodage UTF-8. Je suppose que cela va correspondre à l'indentation avec la vraie source du fichier.

 String reg = "      String reg = \"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$\";";
 String corrupt=new String(reg.getBytes("ISO-8859-1"),"UTF-8");
 System.out.println(corrupt+": "+corrupt.charAt(74));
 System.out.println(reg+": "+reg.charAt(74));     

ce qui entraîne la sortie suivante (foiré à cause de la majoration):

Chaîne reg = "^(?=.[0-9])(?=.[a-z])(?=.[A-Z])(?=.[~#;:?/@&!"'%*=�.,-])(?=[^\s]+$).{8,24}$";: �

Chaîne reg = "^(?=.[0-9])(?=.[a-z])(?=.[A-Z])(?=.[~#;:?/@&!"'%*=.,-])(?=[^\s]+$).{8,24}$";:

Voir "en live" lors d' https://ideone.com/ShZnB

Pour résoudre ce problème, enregistrez les fichiers source avec l'encodage UTF-8.

15voto

Stephen Gelman Points 123

Je suis en train de configurer un serveur de génération de CI sur une machine Linux pour un système hérité démarré en 2000. Une section génère un fichier PDF contenant des caractères non-UTF8. Nous en sommes aux dernières étapes d’une sortie, je ne peux donc pas remplacer les personnages qui me causent du chagrin. Pourtant, pour des raisons liées à Dilbertesque, je ne peux pas attendre une semaine pour résoudre ce problème après la sortie. Heureusement, la commande "javac" dans Ant a un paramètre "encoding".

  <javac destdir="${classes.dir}" classpathref="production-classpath" debug="on"
     includeantruntime="false" source="${java.level}" target="${java.level}"

     encoding="iso-8859-1">

     <src path="${production.dir}" />
 </javac>
 

7voto

Joachim Sauer Points 133411

Le compilateur Java suppose que votre entrée est codée UTF-8, soit parce que vous l'avez spécifiée, soit parce qu'il s'agit du codage par défaut de votre plate-forme.

Cependant, les données de vos fichiers .java ne sont pas réellement encodées en UTF-8. Le problème est probablement le caractère ¬ . Assurez-vous que votre éditeur (ou IDE) de votre choix protège réellement son fichier en encodage UTF-8.

3voto

erickson Points 127945

Le compilateur utilise l'UTF-8 de codage de caractères à lire votre fichier source. Mais le fichier doit avoir été écrit par un éditeur à l'aide d'un codage différent. Ouvrez votre fichier dans un éditeur de jeu de l'encodage UTF-8, corriger la citation de la marque, et l'enregistrer de nouveau.

Alternativement, vous pouvez trouver l'Unicode point pour le personnage et l'utilisation d'un échappement Unicode dans le code source. Par exemple, le caractère" A peut être remplacée par l'échappement Unicode \u0041.

En passant, vous n'avez pas besoin d'utiliser le point de début et de fin de ligne ancres ^ et $ lors de l'utilisation de l' matches() méthode. L'ensemble de la séquence doit être compensée par l'expression régulière lors de l'utilisation de l' matches() méthode. Les ancres ne sont utiles avec l' find() méthode.

1voto

OscarRyz Points 82553

Ce qui suit est compilé pour moi:

 class E{
   String s = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¼.,-])(?=[^\\s]+$).{8,24}$";
}
 

Voir:

entrez la description de l'image ici

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