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) 正确呈现:
此答案假设:
- 您正在使用 Windows。
- 你说的 "Java console" 是命令提示符的调用(如果你使用 IDE,你可能对此一无所知,但 cmd 和 IntelliJ IDEA 肯定知道,虽然我不知道 Eclipse 或其他是否有)。
- 我猜对了:-)
转到注册表编辑器 (regedit),找到 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor",创建一个名为 AutoRun
的 REG_EXPAND_SZ
,值为 chcp 65001
。然后重试(无需重启)。
实际上,这是为 cmd.exe
创建和使用 "initscript" 的示例。这可能是我们将 de facto "default" 控制台编码更改为 UTF-8(代码页 65001)而不更改太多系统配置的方法。
要恢复它,只需删除这个指定的值。
设置环境变量java_tool_options=-Dfile.encoding=utf8 in cmd use chcp 65001
无法在 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) 正确呈现:
此答案假设:
- 您正在使用 Windows。
- 你说的 "Java console" 是命令提示符的调用(如果你使用 IDE,你可能对此一无所知,但 cmd 和 IntelliJ IDEA 肯定知道,虽然我不知道 Eclipse 或其他是否有)。
- 我猜对了:-)
转到注册表编辑器 (regedit),找到 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor",创建一个名为 AutoRun
的 REG_EXPAND_SZ
,值为 chcp 65001
。然后重试(无需重启)。
实际上,这是为 cmd.exe
创建和使用 "initscript" 的示例。这可能是我们将 de facto "default" 控制台编码更改为 UTF-8(代码页 65001)而不更改太多系统配置的方法。
要恢复它,只需删除这个指定的值。
设置环境变量java_tool_options=-Dfile.encoding=utf8 in cmd use chcp 65001