当前位置: 首页 > 面试题库 >

Java控制台应用程序中的Unicode输入

穆景辉
2023-03-14
问题内容

我一直在尝试从Java应用程序中检索“
unicode用户输入”,以获得一个小的实用程序片段。问题是,它似乎在“开箱即用”的Ubuntu上运行,我猜它在UTF-8上具有操作系统范围的编码,但是从“
cmd”运行时在Windows上不起作用。考虑的代码如下:

public class SerTest {

    public static void main(String[] args) throws Exception {
        testUnicode();
    }

    public static void testUnicode() throws Exception {
        System.out.println("Default charset: " +
           Charset.defaultCharset().name());
        BufferedReader in  =
           new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
        System.out.printf("Enter 'абвгд эюя': ");
        String line = in.readLine();
        String s = "абвгд эюя";
        byte[] sBytes = s.getBytes();
        System.out.println("strg bytes: " + Arrays.toString(sBytes));
        byte[] lineBytes = line.getBytes();
        System.out.println("line bytes: " + Arrays.toString(lineBytes));
        PrintStream out = new PrintStream(System.out, true, "UTF-8");
        out.print("--->" + s + "<----\n");
        out.print("--->" + line + "<----\n");
    }

}

在Ubuntu上的输出(不对配置进行任何更改):

me@host> javac SerTest.java  && java SerTest
Default charset: UTF-8
Enter 'абвгд эюя': абвгд эюя
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113]
line bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113]
--->абвгд эюя<----
--->абвгд эюя<----

在Windows CMD提示符下输出(绝不受JAVA_TOOL_OPTIONS影响):

E:\>chcp 65001
Active code page: 65001

E:\>java -Dfile.encoding=utf8 SerTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=utf8
Default charset: UTF-8
Enter 'абвгд эюя': юя': ': абвгд эюя
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113]
Exception in thread "main" java.lang.NullPointerException
        at SerTest.testUnicode(SerTest.java:26) # byte[] lineBytes = line.getBytes();
        at SerTest.main(SerTest.java:15)

在Eclipse控制台中的输出(使用JAVA_TOOL_OPTIONS之后):

Default charset: UTF-8
Enter 'абвгд эюя': абвгд эюя
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113]
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=utf8
line bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113]
--->абвгд эюя<----
--->абвгд эюя<----

在Eclipse控制台上,它可以正常工作是因为我添加了一个系统范围的环境变量(JAVA_TOOL_OPTIONS),如果可能的话,我会避免该变量。

在Eclipse控制台中的输出( 删除 JAVA_TOOL_OPTIONS之后):

Default charset: UTF-8
Enter 'абвгд эюя': абвгд эюя
strg bytes: [-48, -80, -48, -79, -48, -78, -48, -77, -48, -76, 32, -47, -115, -47, -114, -47, -113]
line bytes: [-61, -112, -62, -80, -61, -112, -62, -79, -61, -112, -62, -78, -61, -112, -62, -77, -61, -112, -62, -76, 32, -61, -111, -17, -65, -67, -61, -111, -59, -67, -61, -111, -17, -65, -67]
--->абвгд эюя<----
--->абвгд �ю�<----

所以我的问题是:这 到底 是怎么回事?为确保此代码段适用于各种“ Unicode”输入,需要进行哪些代码更改?

很抱歉长期困扰您,并预先感谢
佐助


问题答案:

一些注意事项:

  • -Dfile.encoding=utf8是不支持,可能会导致意想不到的副作用:

J2SE平台规范不要求“
file.encoding”属性。它是Sun实现的内部细节,不应由用户代码检查或修改。它也打算是只读的。从技术上讲,不可能在命令行上或程序执行期间的任何其他时间将此属性设置为任意值。

  • Console课程将在Windows检测和使用终端的编码,但不支持65001(UTF-8) -至少,它没有我最后一次尝试它

我相信,将cmd.exe与Unicode一起使用的正确的书面方法是使用WriteConsoleWand ReadConsoleW

当我看到这个时,我写了几篇博客文章:

  • I18N:Windows命令提示符下的Unicode
  • Java:Windows命令行上的Unicode


 类似资料:
  • 问题内容: 我刚刚开始弄乱JLine来解析控制台模式下的字符输入。看来运作良好,但我想知道: JLine中是否有非阻塞方式来查找字符是否可用?(例如,在Windows中。) 我想我总是可以将键盘输入包装在其自己的线程中,该线程随后将键盘字符提供给主线程一个线程安全的队列,但这似乎是不必要的。 编辑 :这是逐字符解析。我不会使用GUI。在控制台模式下,Java中通常的InputStream I /

  • 问题内容: 所有, 我已经用Java编写了基于命令行的PhoneBook应用程序。该应用程序基本上会询问用户的一些详细信息,例如姓名,年龄,地址和电话号码,并将它们存储在文件中。其他操作包括按名称,电话号码等查找电话簿。所有详细信息都通过控制台输入。 我正在尝试为我已实现的每个功能编写JUnit测试用例,但无法弄清楚如何将实现代码重定向到我的JUnit测试方法中的某个东西,当我的实际代码停止供用户

  • 有人能告诉我如何添加HTML Unicode到我的应用程序标题,这样的屁股“空”HTML Unicode或任何东西。因为我已经试了好几天了,但没有什么对我有用的。

  • 问题内容: 我正在用Java和gradle编写控制台应用程序。我正在使用插件,并在中正确配置了必填字段。 在我的主班里,我与有联系。这是问题所在:当我在项目目录中运行时,阅读器不会等待控制台输入。而是在第一次通话时返回。对于我在做什么,这种行为是不可取的。 解决办法是什么?是否有用于gradle的单独的控制台应用程序插件,或者我需要以某种方式调整插件以适合我的需要? 问题答案: 默认情况下,gra

  • 问题内容: 通过控制台进行任何输入的数据类型(如我使用BufferedReader类所做的那样)为String。之后,我们将其类型转换为需要查询的数据类型(如Inter.parseInt()为整数)。但是在C语言中,我们可以接受任何输入原始数据类型,而在Java中,所有输入类型都是Neccerily String。为什么是这样? 问题答案: 控制台输入实际上以一系列字节而不是字符串的形式读入。这是

  • 我目前正在使用Windows控制台制作一个平台游戏。但是,我在发出多个命令时遇到了一个问题。 例如,当我让我的角色朝一个方向运行,然后按“跳跃”时,按住run键的事实被忘记,必须再次按下。 是否有一种输入法可以检查哪些键被按住或按下?或者更确切地说,是检查重复输入的一种方法? 以下是我目前的代码供参考:http://pastebin.com/2y6Rf6rb 我目前使用的输入法是: