2009-06-11 5 views
10

Wirklich einfache Frage wirklich. Ich muss eine Unicode-Textdatei in einem Java-Programm lesen.Lesen Sie Unicode Textdateien mit Java

ich zur Verwendung von einfachen ASCII-Text mit einer BufferedReader Filereader Combo verwendet, die offensichtlich nicht funktioniert :(

Ich weiß, dass ich einen String in der ‚traditionellen‘ Art und Weise unter Verwendung eines Buffered Reader lesen kann und dann konvertieren mit so etwas wie:

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

Aber gibt es eine Möglichkeit, den Leser in eine 'Converter'

EDIT einzuwickeln: startet die Datei mit FF FE

Antwort

13

würden Sie den Reader nicht wickeln, sondern würde wickeln Sie den Strom ein Input verwenden. Sie könnten dann wickeln, dass mit Ihren BufferedReader, die Sie derzeit verwenden

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

Ich möchte hebräische Buchstaben lesen, was würde ich durch "Kodierung" ersetzen? – CodyBugstein

+1

um meine eigene Frage zu beantworten, ist es "UTF-8" – CodyBugstein

+0

'Der Konstruktor BufferedReader (InputStreamReader) ist nicht definiert'? – Squareoot

7

Einige Hinweise:

  • das "UTF-16" encoding entweder little- oder Big-Endian-codierten Dateien mit einem lesen markiert BOM; Eine Liste der Java 6-Kodierungen finden Sie unter here; Es wird nicht explizit angegeben, welche Endianity beim Schreiben mit "UTF-16" verwendet wird - es scheint Big-Endian zu sein - also sollten Sie beim Speichern der Daten "UnicodeLittle" verwenden
  • Seien Sie vorsichtig bei der Verwendung der String-Klasse encode/Dekodierungsverfahren, insbesondere mit einer deutlichen variabler Breite Codierung wie UTF-16-use them only on whole data
  • wie andere gesagt haben, ist es oft am besten Zeichendaten zu lesen, indem sie Ihre Input mit einem InputStreamReader Einwickeln; Sie können concatenate your input in einen einzelnen String mit einem StringBuilder oder ähnlichen Puffer.
+0

Danke für den Link zu den Codierungstypen. Ich habe den richtigen für mich gefunden. –

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

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

Ist die Scanner-Klasse spezifisch für Unicode? Wenn man nur den Code liest (und sich solcher Dinge nicht bewusst ist), ist es schwierig festzustellen, ob dies tatsächlich die Frage beantwortet. Bei Problemen, bei denen das OP möglicherweise konzeptionelles Verständnis sowie Code benötigt, ist es nützlich, eine kurze Textbeschreibung von * warum * der Code in Ihrer Antwort enthalten. Eine solche Beschreibung wäre hier von Vorteil. Außerdem habe ich Ihren Beitrag bearbeitet, um den Code in "Code Markup" zu setzen. Bitte machen Sie das gleiche in der Zukunft, da es das Lesen wesentlich erleichtert. Willkommen bei StackOverflow! – BradleyDotNET

1

Ich würde empfehlen, UnicodeReader von Google Data API zu verwenden, finden Sie this answer für eine ähnliche Frage. Es erkennt die Codierung automatisch anhand der Byte Order Mark (BOM).

Sie können auch in Apache Commons IO BOMInputStream betrachten, die im Grunde das gleiche tut, aber nicht alle alternativen Versionen von BOM abdeckt.