以下是我的代码:

class Hello{
    public static void main(String[] arg)throws Exception{
        System.out.println("Hello");
        String str = "سلام";
            System.out.println(new String(str.getBytes("UTF-8")));
    }
}

编译为:javac -encoding UTF8 Hello.java输出为:

C:\Users\Windows\Desktop>java Hello
Hello
ط³ظ„ط§ظ…

chcp场演出:Active code page: 65001

我怎样才能准确地显示它?

诚挚的问候

推荐答案

您的代码很好,但有两个问题:

  • 您在Command Prompt窗口中使用的字体不能正确支持波斯语字符.
  • 波斯语是从右向左书写的,但Command Prompt窗口是从左向右呈现文本的,因此即使您使用适当的字体,波斯语文本也会以相反的方式呈现.

在使用您的样例应用程序时,下面是在我的Command Prompt窗口中使用支持波斯语字符的Courier New字体呈现输出的方式:

Farsi from cmd window

请注意,字符呈现正确,但顺序相反.

可能有一种简单的解决方法,可以让字符在Command Prompt窗口中从右向左正确呈现文本,但在任何情况下,更好的替代方法是使用由Microsoft's Terminal utility提供的Command Prompt实现.

如果这样做,则无需进行任何配置更改即可正确呈现应用程序的输出:

Terminal output

备注:

  • 我的环境是Windows10,区域设置为United States,默认代码页为65001.我使用JDK 20进行了测试,但任何JDK版本都应该可以.
  • 除非出于兼容性原因必须使用传统的Command Prompt窗口,否则请考虑使用Terminal提供的Command Prompt实现.所有类型的文本呈现问题都消失了,因为传统的Command Prompt窗口的一些长期存在的错误/限制已经得到解决.
  • 如果您不熟悉终端,这是Microsoft's overview描述:

Windows Terminal is a modern host application for the command-line shells you already love, like Command Prompt, PowerShell, and bash (via Windows Subsystem for Linux (WSL)). Its main features include multiple tabs, panes, Unicode and UTF-8 character support, a GPU accelerated text rendering engine, and the ability to create your own themes and customize text, colors, backgrounds, and shortcuts.

Java相关问答推荐

我应该避免在Android中创建类并在运行时编译它们吗?

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

为什么在枚举中分支预测比函数调用快?

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

获取字符串中带空格的数字和Java中的字符

使用REST客户端和对象映射器从字符串反序列化Json

在Spring Boot中使用哪个Java类来存储创建时间戳?

如何修复PDF重建过程中的文本定位

如何使用带有谓词参数的方法,而不使用lambda表达式

如何在Application.yaml中连接字符串?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

从映射列表中检索所有键

如何根据配置动态创建N个bean

除0错误/抱歉我的句子是PT

何时调用密封层次 struct 的switch 中的默认情况

具有最大共同前景像素的图像平移优化算法

在实例化中指定泛型类型与不指定泛型类型之间的区别

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

无泄漏函数的Java DRY

始终使用Spring Boot连接mongodb上的测试数据库