Swing不能显示Unicode字符

8

我有一些非 ASCII 字符要在 Swing JComboBox 中显示。然而,这些字符没有正确地显示出来,我看到很多奇怪的字符代替了非 ASCII 字符: 乱码 ComboBox

import javax.swing.*;
public class Test {
  public static void main(String[] args) {
    String[] choices = new String[]{"Good's","Bad’s","தமிழ்"};
    for (String s : choices) System.out.println(s);
    JComboBox choiceBox = new JComboBox(choices);

    JFrame frame = new JFrame("Test");
    frame.setSize(400, 400);
    frame.add(choiceBox);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

(注意Bad's中略有不同的撇号,这是整个问题的起因。)

System.out.println调用在我的终端上完美地显示了字符。

关于此问题,在SO上有很多问题,他们建议从GraphicsEnvironment列出字体,并仅选择声称能够显示我的字符的字体。不幸的是,这个技巧对我不起作用。

Font font = new Font("Ariel", Font.PLAIN, 12);
for (String s : choices) assert font.canDisplayUpTo(s) < 0;
choiceBox.setFont(font);

断言没有失败,但仍然显示乱码。

我使用的是OSX 10.6.5,Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)。


如果您在终端上看到了正确的字符,请找到您终端的字体并在Swing中使用相同的字体。Swing可以显示Unicode字符。 - Costis Aivalis
对此没有运气。 (我的终端是Menlo Regular 11pt。) - Keith Randall
我来到这里是因为我或多或少地在做所有这些事情,但我的上升趋势("\u2714")仍然没有显示出来。答案在Icon in titledBorder title中--我使用的是Tahoma,当我按照示例答案更改为Dialog时--它起作用了。仅仅编码是不够的。 - will
3个回答

6

确保您的编译器使用与您的编辑器相同的编码(您的编辑器似乎已经使用与控制台相同的编码,而编译器通常使用虚拟机的默认编码,由file.encoding属性给出)。

您可以通过向编译器提供-encoding选项或在ant中使用encoding=属性来实现此目的。


好的建议,但可能不是原因。当在控制台上打印时,字符显示正确。 - Stephen C
在源代码中使用Unicode字面量是一种替代特定设置源代码编码的方法。 - Stephen C
1
@Stephen:这可能意味着控制台和编辑器使用类似UTF-8的东西,而编译器和虚拟机使用类似Latin-1的东西。这样你的类中就会有不正确的字符串,但它们在控制台上看起来是正确的。(如果我们能看到一些“乱码字符”的截图,那肯定会有所帮助。) - Paŭlo Ebermann
1
完全正确!"javac -encoding utf8 Test.java"解决了问题。 - Keith Randall
@Keith:你能截一张你的乱码字符的屏幕截图,并放到问题中吗?这可以帮助以后遇到类似问题的人识别是否也是他们的问题。 - Paŭlo Ebermann

2
你试图使用的字体没有必要的字形。在 Mac 上,canDisplay 方法会失败。在 Linux 和 Windows 上,你的代码表现如预期并且断言失败,但在 Mac 上不会失败。我曾经在 Mac 上使用某些字符时遇到了类似的问题,我选择了 Sans 字体,因为它似乎是最完整的 Unicode 字体。如果你查看这个线程,你会发现这是一个相当常见的问题。也许你想尝试 Costis 在评论中建议的方法,并查看这个链接

2

将JCombobox的字体更改为支持泰米尔语的Unicode字体。 从以下链接下载字体: http://www.ildc.in/Tamil/GIST/htm/otfonts.htm

Font font = new Font("TamilFont", Font.PLAIN, 12);
for (String s : choices) assert font.canDisplayUpTo(s) < 0;
choiceBox.setFont(font);

Font font = new Font("TamilFont", Font.PLAIN, 12); for (String s : choices) assert font.canDisplayUpTo(s) < 0; choiceBox.setFont(font); - user2085779
就是这样了。非常感谢。 - Cliff Parnitzky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接