Java输出中未显示泰语

时间:2019-12-13 12:08:23

标签: java unicode utf-8 java-8 thai

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不是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

答案 2 :(得分:1)

您没有指定您的环境,但是这种方法在Windows 10中从我的IDE以及“命令”窗口中对我都有效:

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

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

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

    CmdFont

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

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


已更新19/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)可正确显示泰语字符:

chcp65001

答案 3 :(得分:0)

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

答案 4 :(得分:0)

此答案假定:

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

转到注册表编辑器(regedit),位于“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Command Processor”中,创建一个名为REG_EXPAND_SZ的{​​{1}},其值为AutoRun。然后重试(无需重新启动)。

实际上,这是为chcp 65001创建和使用“初始脚本”的示例。这可能是我们将 defecto “默认”控制台编码更改为UTF-8(代码页65001)而又无需过多更改系统配置的方法。

要还原它,只需删除此指定值。

答案 5 :(得分:0)

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