Java 输出中未显示泰语

Posted

技术标签:

【中文标题】Java 输出中未显示泰语【英文标题】:Thai language is not showing in Java output 【发布时间】:2019-12-13 12:08:23 【问题描述】:

无法在 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 字符。有没有其他方法可以解决这个问题?需要帮助。

【问题讨论】:

您的控制台很可能有问题 - 您使用的是哪个控制台? IDE 内置、Windows 命令提示符还是其他?尝试使用它的设置。 Windows 命令提示符 Windows 命令提示符/PowerShell。让我澄清整个场景。是的,我可以通过 Eclipse IDE 进行一些特定于 IDE 的配置更改来做到这一点/打印。但我不能在云服务器/部署环境中使用 IDE(尽管创建一个 WAR 文件并将其部署在 tomcat 服务器中是一个不错的选择)。这就是我尝试使用独立程序并使用 Windows Powershell/Windows 命令提示符的原因。 【参考方案1】:

您没有指定您的环境,但这种方法在我的 IDE 和命令窗口中的 Windows 10 上适用于我:

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

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

下载字体Courier Mono Thai。你可以从几个网站下载它,但我got it from here。 安装下载的字体。在 Windows 10 上,您只需在文件资源管理器中选择它 (Courier_MonoThai.ttf),右键单击,然后从上下文菜单中选择 Install

安装字体后,将其设置为命令窗口中的默认字体。打开命令窗口,单击右上角的图标,选择 Properties,然后选择 Courier Mono Thai 作为您的字体:

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

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


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

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

Create a PrintStream 使用 UTF-8 字符集,并使用 PrintStream 写入输出。 在命令窗口中,使用代码页 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);


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

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

【讨论】:

感谢您的努力。 看起来不是。仍然从 windows powershell 我得到“UTF-8: Beautiful:::???”。与(chcp 65001) 好的。 [1] 你在 PowerShell 中使用什么字体? [2] 如果使用可以呈现泰语字符的字体从命令窗口 (cmd.exe) 运行会怎样? 我刚从 PowerShell 运行,它使用字体 Courier Mono Thai 对我有用。也许在更改字体后打开一个新的 PowerShell 窗口?另外,请注意,如果您在 PowerShell 或命令窗口中使用 chcp 65001,那么您必须在代码中使用 PrintStream ps = new PrintStream(System.out, true, StandardCharsets.UTF_8.name());。如果您使用chcp 874,那么您必须在代码中使用System.out.println("Default: " + engParam + ":::" + thaiParam);,如我的回答所示。 使用 chcp 65001,它适用于你提到的字体。非常感谢 :)。欣赏你的工作。【参考方案2】:

无法轻易更改 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

【讨论】:

试过了。在 temp.txt 中,我找到了 "Output :John_help:::สวย" 用记事本打开? java 控制台似乎没问题,一般来说 java 编译器 javac 可以使用其他编码而不是编辑器。但正如 Serge Ballesta 调查的那样,似乎使用了 UTF-8(很好)。也可以试试 Java 控制台或 NotePad++ 之类的程序员编辑器。 "不能轻易更改 Windows 的控制台编码",chcp 可以这样做吗,例如chcp 65001 @GenoChen 你可以考虑给出一个答案来展示如何更改代码页恢复它。我对 Windows 不太熟悉,虽然我知道 chcp,但我发现我的解决方案侵入性较小。【参考方案3】:

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

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

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


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

如果您需要真正支持 UTF-8 的 Windows 控制台,您可以试试出色的 ConEmu。

【讨论】:

我不知道什么是 java 控制台。我知道什么是 Windows 控制台或 Linux xterm(或 alii)终端仿真器。在这两种情况下,您都可以将它们配置为处理 UTF-8。我不知道 Mac 还是 IDE。 是的。抱歉,沟通不畅,我的意思是 Windows 命令提示符。好的,让我澄清整个场景。是的,我可以通过 Eclipse IDE 进行一些特定于 IDE 的配置更改来做到这一点/打印。但我不能在云服务器/部署环境中使用 IDE。这就是我尝试使用独立程序并使用 Windows 命令提示符的原因。【参考方案4】:

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

【讨论】:

是的,我已经完成了。在这种情况下,我必须对 eclipse 配置进行一些更改,但是在普通的独立 java 程序时,它不起作用。 应将仅链接到另一个答案的答案作为评论发布。【参考方案5】:

这个答案假设:

    您正在使用 Windows。 您所说的“Java 控制台”是命令提示符的调用(如果您使用的是 IDE,您可能对此一无所知,但 cmd 和 IntelliJ IDEA 肯定会,尽管我不知道 Eclipse 或其他是否会) . 我的猜测是对的 :-)

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

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

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

【讨论】:

您是否尝试过您的解决方案?我不认为它会起作用有两个原因。 OP 示例中println() 使用的PrintStream 不会编写UTF-8,因此将代码页设置为65001 (UTF-8) 将无济于事。此外,即使已修复,除非命令窗口使用可以呈现泰语字符的字体,否则它们将无法正确呈现。此外,将命令窗口的代码页默认为 65001 与问题无关。 @skomisa 不,我没有尝试我的解决方案,因为我没有OP提到的这样一个环境(尽管OP的环境不是那么清楚)。但是我已经尝试过,并在 IntelliJ IDEA 的 Intelli-Haskell 插件的运行窗口中运行程序时成功解决了我的编码问题。这让我想到,如果我的答案中的第二个假设满足,那么解决方案就满足了。 你说得对,环境细节不清楚。但无论如何,PrintStream() 将始终使用“platform's default character encoding if not specified”,并且由于您的答案假定为 Windows 平台,因此该默认值不太可能是 UTF-8。因为您将代码页设置为 65001,所以 PrintStream 应该是 UTF-8 字符,但事实并非如此。此外,所使用的字体必须支持泰语字符,这对于大多数环境中的命令窗口来说是不可能的。 @skomisa 对于您评论中的两个(实际上是三个)原因,我认为(因为我没有环境)1.我们有足够的证据来确保这个字符串将被输出为 UTF-8(一个来自 Serge Ballesta 的回答给出的混乱输出分析,一个来自 Java 规范(JLS 3.1)......好吧,Java 规范说 Java 字符串使用 UTF-16)。跨度> @skomisa 2. 是的,字体问题可能是问题所在,我已经测试了只有字体“SimSun-ExtB”在我的控制台设置字体列表中支持泰语文本。 3.通过.bat文件测试,发现codepage的编码和source的关系肯定会影响输出。 (汉字,(保存GBK,使用chcp 936)->正常输出,(保存GBK,使用chcp 65001)->乱码输出,(保存UTF-8,使用chcp 65001)->正常,(保存UTF -8,使用chcp 936) -> 混乱)【参考方案6】:

在cmd中设置环境变量java_tool_options=-Dfile.encoding=utf8 使用chcp 65001

【讨论】:

以上是关于Java 输出中未显示泰语的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上正确显示泰语变音符号?

CSV 输出文件中未显示引号

将泰语字符输入 SAS

java泛型:eclipse中未显示编译器错误

反应:下拉显示重复选项比给定

Java Mail - 电子邮件客户端中未显示附件?