以下是我的代码:

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相关问答推荐

方法没有用正确的值填充数组—而是将数组保留为null,'

如何在Javascript中设置文本区域圆角的样式

了解Android Studio中的调试器输出

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

为什么不应用类型推断?

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

如何获取Instant#of EpochSecond(?)的最大值

生成桥方法以解决具有相同擦除的冲突方法

用OSQL创建索引

Log4j与jdk21兼容吗?

Cordova Android Gradle内部版本组件不兼容

如何生成指定范围内的11位序列号?

嘲笑黄瓜中的对象

无法在IntStream上应用Collectors.groupingBy

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

Maven创建带有特定类的Spring Boot jar和普通jar

";重复键的值提示唯一约束«;livre_genre_pkey»";例外

可以';不要在Intellij IDEA中使用最新的Java版本(JDK 21)

当一个 boolean 或 int 被放置在包含对象的 java Map 中时,放置它们实际上会创建一个新对象吗?