首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java输出中没有显示泰语

在Java输出中没有显示泰语
EN

Stack Overflow用户
提问于 2019-12-13 12:08:23
回答 6查看 4.5K关注 0票数 1

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

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

输出显示如下:

代码语言:javascript
复制
Output :Beautiful:::à?ªà??à?¢

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-12-15 02:53:48

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

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

下面是让事情正常运行的步骤:

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

  • 在IDE中运行应用程序。如果源代码或输出没有正确呈现泰语字符,请更改字体。我在NetBeans中使用了CourierMono泰文,一切看起来都很好:

  • 最后在命令窗口中运行。泰文字符可能无法正确渲染。要解决这个问题,只需在运行应用程序之前将代码页更改为支持泰语的人 (chcp 874):

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

更新12/15/19,以提供一种替代办法:

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

  • PrintStream,它使用UTF-8字符集,并使用该PrintStream编写输出。
  • 在命令窗口中,使用代码页65001 (UTF-8)。

下面是代码:

代码语言:javascript
复制
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)正确呈现:

票数 1
EN

Stack Overflow用户

发布于 2019-12-13 12:20:08

很难更改Windows控制台的编码。所以写一个.txt文件。对于Windows检测Unicode UTF-8编码,您可以在开头写入一个不可见的BOM字符:"\ufeff"

代码语言:javascript
复制
String text = "\uFEFF" + "Output :" + engParam + ":::" + thaiParam;
Path path = Paths.get("temp.txt");
Files.write(path, Collections.singletonList(text)); // Writes in UTF-8
票数 1
EN

Stack Overflow用户

发布于 2019-12-13 12:39:57

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59322322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档