Nom de classe Java avec caractère unicode non exécuté


J'essaie juste de tester le support Java Unicode. J'ai trouvé que Java prend en charge les caractères Unicode dans leurs noms de classe. Mais quand j'ai essayé d'utiliser des polices Unicode, il ne compile pas. Ci-dessous est le code de

Nom de classe Java avec caractères Unicode

Il renvoie une erreur ci-dessous lors de la Compilation

Erreur lors de la compilation

Le jeu de caractères du Fichier et de l'espace de travail Eclipse est en UTF-8.

Mise à jour: Voici la source. Cela a des lettres tamoules Unicode

public class தமிழ் {

    private static String வணக்கம் = "வணக்கம்";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        வணக்கம்சொல்();
    }

    private static void வணக்கம்சொல்() {
        System.out.println(வணக்கம் + " வருக! வருக!!");
    }
}
Author: Avinash, 2018-04-06

2 answers

Une démonstration rapide sur les caractères unicode dans les noms de classe et les tracas sur Windows.

Créer le fichier de classe Java suivant

Principal.java

class Main {
    public static void main(String...args) {
        \u0ba4\u0bae\u0bbf\u0bb4\u0bcd.main(new String[0]);
    }
}

class \u0ba4\u0bae\u0bbf\u0bb4\u0bcd {
    public static void main(String[] arrstring) {
        System.out.println("\u0bb5\u0ba3\u0b95\u0bcd\u0b95\u0bae\u0bcd unicode!");
    }
}

Tous les caractères unicode sont utilisés avec la notation d'échappement unicode.

Donc en fait, la source suivante créerait les mêmes fichiers de classe

class Main {
        public static void main(String...args) {
                தமிழ்.main(new String[0]);
        }
}

class தமிழ் {
        public static void main(String[] args) {
                System.out.println("வணக்கம் unicode!");
        }
}

Compiler la source (celle avec les échappements unicode)

javac Main.java

Cela crée les fichiers de classe Main.class et தமிழ்.class (vous pouvez vérifier la noms de fichiers par exemple avec {[10] } dans le même répertoire)

Dans la console CMD, le nom du fichier unicode ne peut pas être affiché

> dir /b *.class
Main.class
?????.class

> java Main
??????? unicode!

Dans ConEmu, le nom du fichier s'affiche correctement

> dir /b *.class
Main.class
தமிழ்.class

> java Main
??????? unicode!

Même le nom de fichier தமிழ்.class ne peut pas être affiché et accessible correctement dans une session CMD, Java est capable d'exécuter la classe. Cela signifie que la classe est stockée correctement avec les caractères unicode. Mais la sortie est cassée dans les deux cas.

Si vous exécutez le code ci-dessus sur une machine Linux, le la sortie sera comme prévu

$ java Main
வணக்கம் unicode!

Edit {[38] } la classe avec des caractères unicode peut être exécutée directement sous Linux

$ java தமிழ்
வணக்கம் unicode!

Modifier PowerShell I

PS > ls *.class
...
Mode                LastWriteTime     Length Name                                                                                                  
----                -------------     ------ ----                                                                                                  
-a---        08/04/2018     12:34        317 Main.class                                                                                            
-a---        08/04/2018     12:34        443 தமிழ்.class                                                                                           

PS > java Main
??????? unicode!

PS > java தமிழ்
java : Error: Could not find or load main class ?????
At line:1 char:1
+ java தமிழ்

Edit Lié à ce rapport de bogue sur Eclipse {[48] } il semble que cela fonctionne sur Windows 10 (ce que je ne peux pas vérifier, je n'en ai pas)

 1
Author: SubOptimal, 2018-04-09 08:01:46

Il s'agit de:

  • Unicode normalisation du texte: ĉ peut être un point de code Unicode (symbole) ou deux c et une marque diacritique combinée ^ (largeur zéro). Le système d'exploitation utilise un d'entre eux. Idéalement, l'E devrait appliquer une forme canonique. (Aucune idée.)
  • Ligne de commande Windows cmd.exe est limité à son encodage système. Cependant, vous pourriez avoir une classe principale ASCII pure, appelant le principal de votre classe.
  • Un exécutable le fichier jar avec un nom ASCII ne devrait pas non plus poser de problème. manifeste.MF est déjà en UTF-8, mais comme la longueur de la ligne ne doit pas dépasser 72 octets et que UTF-8 est multioctet par caractère, soyez prudent.

  • Ensuite, il y a les systèmes de contrôle de version qui peuvent poser des problèmes. Essayez surtout de basculer entre Windows et Linux.

 0
Author: Joop Eggen, 2018-04-09 06:52:18