Неспособность написать немецкий 'umlauts' (äöü) из консоли в текстовый файл с Java

В настоящее время я отчаянно пытаюсь записать немецкие умлауты, считанные с консоли, в текстовый файл с кодировкой utf8 на Windows 7.

Вот код для настройки сканера:

Scanner scanner = new Scanner(System.in, "UTF8");

Вот код для чтения строки:

String s = scanner.nextLine();

Вот код для записи в файл:

    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(this.targetFile), "UTF8");

osw.write(s);

К сожалению, вместо примера «überraschung» написанный файл закодирован в utf8, но не будет отображать умлаут. Что делать?

 Ishtar05 окт. 2010 г., 11:40
Попробуйте добавить эту строку,System.out.println(s.contains("ü"));, если этоtrue это ошибка Notepad ++, если он говоритfalse System.in не является utf-8.
 yan.kun05 окт. 2010 г., 11:38
На 100% уверен. Notepad ++ показывает файл в кодировке utf8, и я могу добавить умлауты вручную с помощью редактора. Кроме сканера сканер = новый сканер (System.in, "UTF8"); Я не знаю, как еще я мог бы установить ввод в utf8.
 josefx05 окт. 2010 г., 11:29
Вы уверены, что консольный вход закодирован в utf-8? Поддерживает ли шрифт, который вы используете для вывода, умлаутс? Поддерживает ли используемый вами редактор utf-8?
 barjak05 окт. 2010 г., 11:24
что вы подразумеваете под "файл не будет отображать умлаут"? Как вы отображаете полученный файл, и что вы видите точно?
 josefx05 окт. 2010 г., 15:22
@ yan.kun консольную кодировку нельзя контролировать из java, вы только изменяете, как java интерпретирует уже закодированные байты, что приведет к путанице в кодировке ascii, если консольная кодировка не является utf-8. Кодировка по умолчанию, используемая сканером, должна работать.
 yan.kun05 окт. 2010 г., 11:27
Я открываю полученный файл в любом текстовом редакторе (Notepad ++ или Notepad, оба отображаются одинаково). Вместо умлаута я вижу знак заполнителя, такой как пустой прямоугольник или квадрат с вопросительным знаком.

Ответы на вопрос(3)

У меня была похожая проблема (строка «ç» не была бы «обнаружена» сканером, а строки типа «Açores» имели бы символ ç «искаженный»).

Я решил это, объявив кодировку для языка:

Scanner keyboardReader = new Scanner(System.in, "iso-8859-1");

Это сработало для меня с немецкими умлаутами:

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class P {

    public static void main(String[] args) throws Exception {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        String s = stdin.readLine();
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:/p.txt"), "UTF-8");
        osw.write(s);
        osw.close();
    }
}
Решение Вопроса

Ваша консоль, вероятно, не UTF-8, поэтому, когда вы делаетеnew Scanner(System.in, "UTF8"); вы создаете сканер с неправильной кодировкой, и ваши умлауты теряются при попытке прочитать строки из консоли.

Вы можете использоватьchcp в командной строке, чтобы проверить, какая кодовая страница используется.

На самом деле, вам вообще не нужно указывать кодировку. Если вы просто создаете сканер какnew Scanner(System.in), должна использоваться кодировка платформы по умолчанию.

 yan.kun11 окт. 2010 г., 14:35
Спасибо, на самом деле это вина консоли. Я протестировал Windows CMD и NetBeans, которые оба не удалось. В консоли Eclipse все работало без изъянов.

Ваш ответ на вопрос