2009-06-11 9 views
10

Question vraiment simple vraiment. J'ai besoin de lire un fichier texte Unicode dans un programme Java.Lire des fichiers texte Unicode avec Java

Je suis habitué à l'aide de texte ASCII avec un combo BufferedReader FileReader qui est évidemment ne fonctionne pas :(

Je sais que je peux lire une chaîne de la manière « traditionnelle » à l'aide d'un Buffered Reader et puis le convertir en utilisant quelque chose comme:

temp = new String(temp.getBytes(), "UTF-16"); 

Mais est-il un moyen d'envelopper le lecteur dans un « convertisseur »

EDIT: le fichier commence par FF FE

Répondre

13

vous pas envelopper le lecteur, au lieu que vous envelopper le flux en utilisant un InputStreamReader. Vous pouvez ensuite conclure que votre BufferedReader que vous utilisez actuellement

BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding)); 
+1

Je veux lire les lettres hébraïques, que remplacer avec "encodage"? – CodyBugstein

+1

pour répondre à ma propre question, c'est "UTF-8" – CodyBugstein

+0

'Le constructeur BufferedReader (InputStreamReader) est indéfini'? – Squareoot

7

Quelques notes:

  • le codage « UTF-16 » peut lire les deux fichiers codés-endian grands little- ou marqués d'un BOM; voir here pour une liste des codages Java 6; il n'est pas explicitement indiqué quelle endianness sera employée en écrivant en utilisant "UTF-16" - il semble être big-endian - ainsi vous pourriez vouloir employer "UnicodeLittle" en sauvegardant les données
  • soyez prudent en employant l'encodage de classe de corde/méthodes de décodage, en particulier avec un codage à largeur variable marquée comme UTF-16-use them only on whole data
  • comme d'autres l'ont dit, il est souvent préférable de lire les données de caractère en enveloppant votre InputStream avec un InputStreamReader; vous pouvez concatenate your input dans une seule chaîne en utilisant un tampon StringBuilder ou similaire.
+0

Merci pour le lien vers les types d'encodage. J'ai trouvé le bon pour moi. –

-1
Scanner scan = new Scanner(new File("C:\\Users\\daniel\\Desktop\\Corpus.txt")); 
    while(scan.hasNext()){ 

    System.out.println(scan.nextLine()); 
    } 
+1

La classe Scanner est-elle spécifique à Unicode? Juste en lisant le code (et ne pas être au courant de telles choses) il est difficile de savoir si cela répond réellement à la question. Pour les problèmes où le PO peut avoir besoin d'une certaine compréhension conceptuelle ainsi que d'un code, il est utile d'inclure une courte description textuelle de * pourquoi * le code fonctionne dans votre réponse. Une telle description serait bénéfique ici. En outre, j'ai édité votre message pour mettre le code dans "Code Markup" S'il vous plaît faites la même chose à l'avenir car il est beaucoup plus facile à lire. Bienvenue à StackOverflow! – BradleyDotNET

1

Je recommande d'utiliser UnicodeReader de l'API Google Data, consultez this answer pour une question similaire. Il détectera automatiquement l'encodage à partir de la marque d'ordre d'octet (BOM).

Vous pouvez également prendre en compte BOMInputStream dans Apache Commons IO qui est fondamentalement la même mais ne couvre pas toutes les versions alternatives de BOM.