web-dev-qa-db-fra.com

Comment compiler un fichier source Java qui est codé "UTF-8"?

J'ai enregistré mon fichier source Java en spécifiant son type d'encodage au format UTF-8 (à l'aide de Notepad, le type d'encodage par défaut de Notepad étant ANSI), puis j'ai essayé de le compiler en utilisant: 

javac -encoding "UTF-8" One.Java

mais cela a donné un message d'erreur "

One.Java:1: illegal character: \65279

?public class One {

^
1 error

Y at-il un autre moyen, je peux compiler cela?

Voici la source:

public class One {
    public static void main( String[] args ){
        System.out.println("HI");
    }
} 
28
asela38

Votre fichier is étant lu comme UTF-8, sinon un caractère avec la valeur "65279" ne pourrait jamais apparaître. javac s'attend à ce que votre code source soit dans le codage par défaut de la plate-forme, selon la documentation javac :

Si -encoding n'est pas spécifié, le convertisseur de plate-forme par défaut est utilisé.

La valeur décimale 65279 est la valeur hexadécimale FEFF, qui correspond à la Unicode Byte Order Mark (BOM) . C'est inutile dans UTF-8, car UTF-8 est toujours codé comme un flux d'octets et n'a pas de problème de finalité.

Notepad aime coller dans les nomenclatures même lorsqu'elles ne sont pas nécessaires, mais certains programmes n'aiment pas les retrouver. Comme d'autres l'ont fait remarquer, le Bloc-notes n'est pas un très bon éditeur de texte. Le passage à un autre éditeur de texte résoudra certainement votre problème.

45
Daniel Pryden

Ouvrez le fichier dans Notepad ++ et sélectionnez Encodage -> Convertir en UTF-8 sans nomenclature.

20
Adrian Toman

Ce n’est pas un problème avec votre éditeur de texte, c’est un problème avec javac! alors javac doit le gérer, mais ce n’est pas le cas. En fait, il est utile d’utiliser la nomenclature dans les fichiers UTF-8 IS pour distinguer un fichier codé ANSI d’un fichier codé Unicode.

La solution proposée, consistant à supprimer la nomenclature, n’est qu’une solution de contournement et non la solution appropriée.

Ce rapport de bogue indique que ce "problème" ne sera jamais résolu: http://bugs.Java.com/view_bug.do?bug_id=4508058

Puisque ce fil est dans le top 2 des résultats Google pour la recherche "javac BOM", je le laisse ici aux futurs lecteurs.

10
Etienne Delavennat

Essayez javac -encoding UTF8 One.Java 

Sans les guillemets et c’est UTF8, pas de tiret.

Voir ce fil de discussion pour plus de liens

9
StevenWilkins

Voir ci-dessous .__ Par exemple, nous pouvons discuter avec un programme (mots en telugu)

Programme (UnicodeEx.Java)

class UnicodeEx {  
    public static void main(String[] args) {   
        double ఎత్తు = 10;  
        double వెడల్పు = 25;   
        double దీర్ఘ_చతురస్ర_వైశాల్యం;  
        System.out.println("The Value of Height = "+ఎత్తు+" and Width = "+వెడల్పు+"\n");  
        దీర్ఘ_చతురస్ర_వైశాల్యం = ఎత్తు * వెడల్పు;  
        System.out.println("Area of Rectangle = "+దీర్ఘ_చతురస్ర_వైశాల్యం);  
    }  
}

Ceci est le programme lors de la sauvegarde en tant que "UnicodeEx.Java" et changez le codage en "unicode"

** Comment compiler **

javac - codage "unicode" UnicodeEx.Java

Comment exécuter

Java UnicodeEx

La valeur de la hauteur = 10.0 et de la largeur = 25.0

Surface du rectangle = 250.0

4
Prashanth

Je sais que c'est un très vieux sujet, mais je rencontrais un problème similaire avec PHP au lieu de Java et Google m'a emmené ici. J'écrivais PHP sur Notepad ++ (pas simplement Notepad) et j'ai remarqué qu'une ligne blanche supplémentaire apparaissait chaque fois que j'appelais un fichier d'inclusion. Firebug a montré qu'il y avait un caractère 65279 dans ces lignes supplémentaires. 

En fait, le fichier principal PHP et les fichiers inclus ont été codés au format UTF-8. Cependant, Notepad ++ a aussi une option pour coder en "UTF-8 sans BOM". Cela a résolu mon problème.

Ligne de fond: Le codage UTF-8 insère ici et là ce caractère de nomenclature supplémentaire, sauf si vous indiquez à votre éditeur d'utiliser UTF8 sans nomenclature.

4
vaelico

Fonctionne bien ici, même édité dans le Bloc-notes. La morale de l'histoire est de ne pas utiliser le Bloc-notes. Il y a probablement un caractère non imprimable là-dedans que Notepad est en train de vous insérer ou de vous cacher avec joie.

0
Nick Veys

Dans l’idée Intellij (Paramètres> Editeur> Encodages de fichiers), l’encodage du projet était "windows-1256". J'ai donc utilisé le code suivant pour convertir des chaînes statiques en utf8

protected String persianString(String persianStirng) throws UnsupportedEncodingException {
    return new String(persianStirng.getBytes("windows-1256"), "UTF-8");
}

Maintenant, c'est bon! Selon l'encodage du fichier, vous devez remplacer "windows-1256" par un fichier approprié.

  • Ouvrez votre fichier avec WordPad ou tout autre éditeur, à l'exception de Notepad.

  • Sélectionnez Enregistrer en tant que type de document texte - Format MS-DOS

  • Rouvrir le projet 

0
Satyam Gupta

Pour étendre les réponses existantes avec une solution pour les utilisateurs de Linux :

Pour supprimer la nomenclature de tous les fichiers .Java à la fois, accédez à votre répertoire source et exécutez-le.

find -iregex '.*\.Java' -type f -print0 | xargs -0 dos2unix

Nécessite l'installation de find, xargs et dos2unix, qui devrait être inclus dans la plupart des distributions. La première instruction trouve tous les fichiers .Java du répertoire en cours de manière récursive, la seconde les convertit à l'aide de l'outil dos2unix, destiné à convertir les fins de ligne mais également à supprimer la nomenclature.

La conversion des fins de ligne ne devrait pas avoir d’effet car elle devrait déjà être au format Linux \n sous Linux si vous configurez votre contrôle de version correctement mais soyez averti qu’il le fait aussi si vous avez un de ces rares cas où cela n’est pas prévu.

0
Konrad Höffner

J'ai eu le même problème. Pour le résoudre, ouvrez le fichier dans un éditeur hexadécimal et trouvez trois octets "invisibles" au début du fichier. Je les ai enlevés et la compilation a fonctionné.

0
Vic