1

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

4

6 回答 6

1

问题不在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 编码的,但无法显示您的示例泰语字符串。

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

于 2019-12-13T12:39:57.983 回答
1

不能轻易更改 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
于 2019-12-13T12:20:08.327 回答
1

您没有指定您的环境,但这种方法在我的 IDE 中的 Windows 10 上对我有用,也可以从命令窗口中使用:

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

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

  • 下载字体Courier Mono Thai。你可以从几个网站下载它,但我是从这里下载的。
  • 安装下载的字体。在 Windows 10 上,您只需在文件资源管理器中选择它 ( Courier_MonoThai.ttf ),右键单击,然后从上下文菜单中选择安装。
  • 安装字体后,将其设置为命令窗口中的默认字体。打开命令窗口,单击右上角的图标,选择属性,然后选择Courier Mono Thai作为您的字体:

    CmdFont

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

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


2019 年 12 月 15 日更新以提供另一种方法:

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

  • 创建一个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) 正确呈现:

chcp65001

于 2019-12-15T02:53:48.357 回答
0

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

于 2020-02-19T14:19:25.650 回答
0

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

于 2019-12-13T13:13:14.263 回答
0

这个答案假设:

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

转到注册表编辑器(regedit),找到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor”,创建一个REG_EXPAND_SZ名为AutoRunvalue的文件chcp 65001。然后再试一次(无需重新启动)。

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

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

于 2019-12-16T10:29:00.803 回答