Java:如何检测(并更改?)System.console 的编码?

发布于 2024-08-24 17:58:31 字数 532 浏览 3 评论 0原文

我有一个在控制台上运行的程序,其变音符号和其他特殊字符在 Mac 上以 ? 的形式输出。这是一个简单的测试程序:

public static void main( String[] args ) {
    System.out.println("höhößüä");
    System.console().printf( "höhößüä" );
}

在默认的 Mac 控制台(使用默认的 UTF-8 编码)上,打印:

 h?h????
 h?h????

但是在手动将 Mac 终端的编码设置为“Mac OS Roman”后,它正确打印

 höhößüä
 höhößüä

注意,在使用 System.console 的 Windows 系统上() 有效:

 h÷h÷▀³õ
 höhößüä

那么如何让我的程序...rolleyes...“到处运行”?

I have a program which runs on a console and its Umlauts and other special characters are being output as ?'s on Macs. Here's a simple test program:

public static void main( String[] args ) {
    System.out.println("höhößüä");
    System.console().printf( "höhößüä" );
}

On a default Mac console (with default UTF-8 encoding), this prints:

 h?h????
 h?h????

But after manually setting the Mac terminal's encoding to "Mac OS Roman", it correctly printed

 höhößüä
 höhößüä

Note that on Windows systems using System.console() works:

 h÷h÷▀³õ
 höhößüä

So how do I make my program...rolleyes..."run everywhere"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你又不是我 2024-08-31 17:58:31

启动应用程序时尝试以下命令行参数:

-Dfile.encoding=utf-8

这会更改 JVM 用于 I/O 操作的默认编码。

您还可以尝试:

System.setOut(new PrintStream(System.out, true, "utf-8"));

Try the following command-line argument when starting your application:

-Dfile.encoding=utf-8

This changes the default encoding of the JVM for I/O operations.

You can also try:

System.setOut(new PrintStream(System.out, true, "utf-8"));
2024-08-31 17:58:31

Epaga:看看这里。您可以在打印流中设置输出编码 - 只需确定或绝对确定正在设置的编码。

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

public class Test {
    public static void main (String[] argv) throws UnsupportedEncodingException {
    String unicodeMessage =
    "\u7686\u3055\u3093\u3001\u3053\u3093\u306b\u3061\u306f";

    PrintStream out = new PrintStream(System.out, true, "UTF-8");
    out.println(unicodeMessage);
  }
}

要确定控制台编码,您可以使用系统命令“locale”并解析输出,在德国 UTF-8 系统上,输出如下所示:

LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=

Epaga: have a look right here. You can set the output encoding in a printstream - just have to determine or be absolutely sure about which is being set.

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

public class Test {
    public static void main (String[] argv) throws UnsupportedEncodingException {
    String unicodeMessage =
    "\u7686\u3055\u3093\u3001\u3053\u3093\u306b\u3061\u306f";

    PrintStream out = new PrintStream(System.out, true, "UTF-8");
    out.println(unicodeMessage);
  }
}

To determine the console encoding you could use the system command "locale" and parse the output which - on a german UTF-8 system looks like:

LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文