您如何从 Java 应用程序的用户给定输入中读取变音符号?

How do you read umlaut from user-given input for a Java application?

我在 Java 中编写了一个命令行程序,它应该根据特定要求接收文件名并处理其内容。当 运行:

时看起来完全像这样
These content types are required:
[Änderung, Adaptation, Content, Inhalte]

Please enter the name of a file
>> _

(查看菜单的变音符号如何正确显示)
现在,文件名也可能包含元音变音。但是,如果输入,则会发生以下情况:

These content types are required:
[Änderung, Adaptation, Content, Inhalte]

Please enter the name of a file
>> Über
<< [?ber] - Searching for the file
_

我研究了编码,但正确显示的第一个变音符号让我觉得还有其他事情在发生。在 Java 端,我使用 BufferedReader 作为字符串输入。

我通过这样的 .bat 文件启动程序:

java -Dfile.encoding=utf-8 -jar app.jar
PAUSE

我这里要用到-Dfile.encoding=utf-8,所以这个不能去掉

如何解决?

您的问题似乎出在 java 代码写入标准输出流时。

我在以色列,我设法得到我的 java 代码来将希伯来语字符写入 [Windows] 命令提示符。

代码后的解释。

import java.io.UnsupportedEncodingException;

public class StdoutHe {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "\u05DD\u05D5\u05DC\u05E9";
        byte[] bytes = str.getBytes("Cp862");
        System.out.writeBytes(bytes);
    }
}

该代码包含 unicode escape sequences 而不是字面希伯来语字符。

我使用 [charset] Cp862 因为当我在命令提示符中输入命令 CHCP 时,我得到的输出是...

Active code page: 862

然后我使用 JDK 文档中的 Supported Encodings 发现合适的字符集名称是 Cp862.

编辑

你不在以色列。您的计算机可能没有可以在 命令提示符 window 中显示希伯来语字符的字体。您需要对上面的代码进行一些更改。你不能 运行 它在你的计算机上原样。

您需要更改以下行(来自上面的代码):

String str = "\u05DD\u05D5\u05DC\u05E9";

输入适当的字符串,而不是希伯来语 unicode,例如 Über。换句话说,将上面的行替换为...

String str = "Über";

然后打开一个命令提示符并输入命令CHCP.
然后查找与您为 CHCP 命令获得的输出相匹配的适当 java 字符集名称。
然后修改这行代码:

byte[] bytes = str.getBytes("Cp862");

并将 Cp862 替换为与您在 运行 CHCP 命令时获得的输出相匹配的字符集。

然后 运行 代码并查看它是否正确打印 Über.

编辑 2

所以实际上你需要配置你用来从用户那里获取输入的BufferedReader

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class ReadsKbd {
    public static void main(String[] args) throws IOException {
        System.out.print("Enter: ");
        InputStreamReader isr = new InputStreamReader(System.in, "Cp862");
        BufferedReader br = new BufferedReader(isr);
        String input = br.readLine();
        System.out.printf("You entered: %s%n", input);
    }
}

只需将替换 "Cp862" 为与您的计算机相关的值——正如我之前所写,[Windows 的输出] 命令 CHCP。然后你可以 运行 上面的代码,原样。当你 运行 它时,输入一个包含变音符号的字符串,它应该在代码的最后一行正确显示。