Java 输出中未显示泰语

Thai language is not showing in Java output

无法在 Java 控制台中打印泰语字符串值

public static void main(String [] args){
   String engParam = "Beautiful";
   String thaiParam = "สวย";
   System.out.println("Output :" + engParam + ":::" + thaiParam);}

输出显示如下:

Output :Beautiful:::à?ªà??à?¢

我认为 System.out.println 将无法使用默认控制台设置打印 UTF-8 字符。有没有其他方法可以解决这个问题?需要帮助。

无法轻易更改 Windows' 控制台编码。所以写入一个.txt文件。 为了Windows检测Unicode UTF-8编码,可以在开头写一个不可见的BOM字符:"\ufeff".

String text = "\uFEFF" + "Output :" + engParam + ":::" + thaiParam;
Path path = Paths.get("temp.txt");
Files.write(path, Collections.singletonList(text)); // Writes in UTF-8

问题不在 Java。在 UTF-8 中转换时,泰语字符串“สวย”给出字节 '0xe0'、'0xb8'、'0xaa'、'0xe0'、'0xb8'、'0xa7'、'0xe0'、'0xb8'、'0xa2 '

在Latin1中,0xe0是à,0xaa是ª,oxa2是¢,其他都没有给出?字符的表示。

这意味着 println 已经完成了它的部分工作,但是 thing 应该显示字符(终端屏幕或 IDE ) 不能或未被指示处理 UTF8。


不幸的是,Windows 控制台并不是真正的 Unicode 友好。最新版本 (>= Win 7) 支持所谓的 utf-8 代码页 (chcp 65001),它可以正确处理 UTF-8 字节字符串 前提是其底层字符集可以显示字符 .例如,在键入 chcp 65001 后,我的法语系统成功显示了所有 UTF-8 编码的重音字符 (éèùïêçàâ...),但无法显示您的示例泰语字符串。

如果您在 Windows 上需要一个真正支持 UTF-8 的控制台,您可以尝试优秀的 ConEmu

This answer 类似的问题可能是你的情况,如果你使用的是 eclipse(但它在 IntelliJ 中几乎相同)

你没有指定你的环境,但这种方法在 Windows 10 从我的 IDE 和命令 window:

  • 首先,使用支持泰文字符的字体。但还要确保您选择的字体可以在命令 window 中设置,而不仅仅是在您的 IDE 中设置。有些可以(例如 Courier Mono Thai),有些则不能(例如 Angsana New)。您可以乱用注册表来添加字体 selections,但是 Courier Mono Thai 默认可用,所以我使用了那个。
  • 一旦您确定了可以在命令 window 中设置的字体,您也可以在 IDE 中使用它,如果它的默认字体无法处理泰语字符。

以下是使事情正常进行的步骤:

  • 下载字体 Courier Mono Thai。您可以从多个网站下载它,但我 got it from here.
  • 安装下载的字体。在 Windows 10 上,您所要做的就是 select 它 (Courier_MonoThai.ttf) 在文件资源管理器中,右键单击,然后 select 从上下文菜单安装
  • 安装字体后,将其设为命令 window 中的默认字体。打开命令window,点击右上角的图标,select 属性然后select Courier Mono Thai 作为你的字体:

  • 运行 您的 IDE 中的应用程序。如果源代码或输出没有正确呈现泰语字符,请更改字体。我在 NetBeans 中使用了 Courier Mono Thai,一切看起来都不错:
  • 最后 运行 命令 window。泰语字符可能无法正确呈现。要解决此问题,只需在 运行 应用程序之前将代码页更改为 the one that supports Thai (chcp 874):

这些说明特定于 Windows10。如果您 运行 宁在不同的环境中,请使用您的平台和 IDE 的完整详细信息更新您的问题。


19 年 12 月 15 日更新以提供替代方法:

您可以这样做,而不是使用命令 window 中的代码页 874(泰语):

  • Create a PrintStream 使用 UTF-8 字符集,并使用 PrintStream.
  • 写入输出
  • 在命令 window 中,使用代码页 65001 (UTF-8)。

代码如下:

package thaicharacters;

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

public class ThaiCharacters {

public static void main(String[] args) throws UnsupportedEncodingException {

    String engParam = "Beautiful";
    String thaiParam = "สวย";

    // Write the output to a UTF-8 PrintStream:
    PrintStream ps = new PrintStream(System.out, true, StandardCharsets.UTF_8.name());
    ps.println("UTF-8: " + engParam + ":::" + thaiParam);
}
}

这是命令 window 中的输出,显示:

  • 使用默认代码页 (437) 或泰语代码页 (874) 时,泰语字符无法正确呈现。
  • 泰语字符使用 UTF-8 代码页 (65001) 正确呈现:

此答案假设:

  1. 您正在使用 Windows。
  2. 你说的 "Java console" 是命令提示符的调用(如果你使用 IDE,你可能对此一无所知,但 cmd 和 IntelliJ IDEA 肯定知道,虽然我不知道 Eclipse 或其他是否有)。
  3. 我猜对了:-)

转到注册表编辑器 (regedit),找到 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor",创建一个名为 AutoRunREG_EXPAND_SZ,值为 chcp 65001。然后重试(无需重启)。

实际上,这是为 cmd.exe 创建和使用 "initscript" 的示例。这可能是我们将 de facto "default" 控制台编码更改为 UTF-8(代码页 65001)而不更改太多系统配置的方法。

要恢复它,只需删除这个指定的值。

设置环境变量java_tool_options=-Dfile.encoding=utf8 in cmd use chcp 65001