web-dev-qa-db-fra.com

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 
 codant UTF-8. Le 74ème caractère est '"' 

Comment puis-je réparer cela? Merci.

62
Ravi

Vous avez un problème d'encodage avec votre fichier code source. C'est peut-être codé ISO-8859-1, mais le compilateur était configuré pour utiliser UTF-8. Cela entraînerait des erreurs lors de l'utilisation de caractères, qui n'auront pas la même représentation d'octets dans UTF-8 et ISO-8859-1. Cela arrivera à tous les caractères qui ne font pas partie de l'ASCII, par exemple ¬NOT SIGN .

Vous pouvez simuler ceci avec le programme suivant. Il utilise simplement votre ligne de code source et génère un tableau d'octets ISO-8859-1 et décode ce "mauvais" avec le codage UTF-8. Vous pouvez voir à quelle position la ligne est corrompue. J'ai ajouté 2 espaces à votre code source pour correspondre à la position 74 et à ¬NOT SIGN , qui est le seul caractère qui générera différents octets dans le codage ISO-8859-1 et le codage UTF-8. Je suppose que cela va correspondre à l'indentation avec le fichier source réel.

 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 donne le résultat suivant (foiré à cause du balisage):

String reg = "^ (? =. [0-9]) (? =. [az]) (? =. [AZ]) (? =. [~ #;:?/@ &! "'% * = �., -)) (? = [^\S] + $). {8,24} $ ";:

String reg = "^ (? =. [0-9]) (? =. [az]) (? =. [AZ]) (? =. [~ #;:?/@ &! "'% * = ¬., -)) (? = [^\S] + $). {8,24} $ ";: ¬

Voir "en direct" sur https://ideone.com/ShZnB

Pour résoudre ce problème, enregistrez les fichiers source avec le codage UTF-8.

45
Michael Konietzka

Je suis en train de configurer un serveur de build CI sur une machine Linux pour un système hérité démarré en 2000. Une section génère un PDF qui contient des caractères non-UTF8. Nous sont dans les dernières étapes d’une publication, je ne peux donc pas remplacer les caractères qui me causent du chagrin, mais pour des raisons dilbertesques, je ne peux pas attendre une semaine pour résoudre ce problème après la publication. "paramètre.

 <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>
13
Steve Gelman

Le compilateur Java) suppose que votre entrée est codée en 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.

6
Joachim Sauer

Merci Michael Konietzka ( https://stackoverflow.com/a/4996583/1019307 ) pour votre réponse.

Je l'ai fait dans Eclipse/STS:

Preferences > General > Content Types > Selected "Text" 
    (which contains all types such as CSS, Java Source Files, ...)
Added "UTF-8" to the default encoding box down the bottom and hit 'Add'

Bingo, erreur disparue!

3
HankCa

Dans Eclipse, essayez d’utiliser les propriétés du fichier (Alt + Entrée) et de modifier la ressource -> 'Codage de fichier texte' -> en Autre en UTF-8. Rouvrez le fichier et vérifiez qu’il y aura un caractère indésirable quelque part dans la chaîne/le fichier. Enlevez-le. Enregistrez le fichier.

Modifiez la ressource de codage -> "Codage de fichier texte" sur Par défaut.

Compiler et déployer le code.

3
john

Pour les utilisateurs d'IntelliJ, c'est assez facile une fois que vous avez découvert ce qu'était l'encodage d'origine. Vous pouvez sélectionner le codage dans le coin inférieur droit de votre fenêtre. Une boîte de dialogue vous invitant à choisir:

Le codage que vous avez choisi ("[type de codage]") peut modifier le contenu de "[Votre fichier]". Voulez-vous recharger le fichier à partir du disque ou convertir le texte et l'enregistrer dans le nouvel encodage?

Donc, si vous avez quelques caractères enregistrés dans un encodage impair, vous devez d'abord sélectionner "Recharger" pour charger le fichier dans l'encodage des caractères incorrects. Pour moi cela a tourné le? caractères dans leur valeur appropriée.

IntelliJ peut dire si vous n'avez probablement pas sélectionné le bon encodage et vous avertira. Revenez en arrière et essayez à nouveau.

Une fois que vous pouvez voir les mauvais caractères disparaître, modifiez la zone de sélection d'encodage dans le coin inférieur droit pour revenir au format que vous aviez initialement prévu (si vous recherchez ce message d'erreur sur Google, ce sera probablement UTF-8). Cette fois, sélectionnez le bouton "Convertir" dans la boîte de dialogue.

Pour moi, je devais recharger en tant que "windows-1252", puis reconvertir en "UTF-8". Les caractères incriminés étaient des guillemets simples (‘et’) susceptibles d’être collés à partir d’un document Word (ou d’un courrier électronique) avec un codage incorrect, et les actions ci-dessus les convertiront en UTF-8.

3
cwash

Le compilateur utilise le codage de caractères UTF-8 pour lire votre fichier source. Mais le fichier doit avoir été écrit par un éditeur utilisant un encodage différent. Ouvrez votre fichier dans un éditeur défini sur le codage UTF-8, corrigez le guillemet et enregistrez-le à nouveau.

Vous pouvez également rechercher le point Unicode du caractère et utiliser un échappement Unicode dans le code source. Par exemple, le caractère A peut être remplacé par l'échappement Unicode \u0041.

En passant, vous n'avez pas besoin d'utiliser les ancres de début et de fin de ligne ^ Et $ Lorsque vous utilisez la méthode matches(). L'expression régulière doit correspondre à la séquence entière lors de l'utilisation de la méthode matches(). Les ancres ne sont utiles qu'avec la méthode find().

2
erickson

Le compile suivant pour moi:

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

Voir:

enter image description here

1
OscarRyz

"erreur: caractère non mappable pour le codage UTF-8" signifie, Java a trouvé un caractère qui ne représente pas UTF-8. Par conséquent, ouvrez le fichier dans un éditeur et définissez le codage de caractère sur UTF. -8 Vous devriez être capable de trouver un caractère qui n'est pas représenté dans UTF-8.Offrez ce personnage et recompilez-le.

1
Ganesh R