【问题标题】:Monospace and UTF8等宽和 UTF8
【发布时间】:2013-05-03 06:14:39
【问题描述】:

我正在纠正我们的一个旧 java Swing 应用程序中的字体显示。 在运行时使用“-Dfile.encoding=UTF-8”选项后发生了变化。

FontClass.jar 是我的示例 jar 文件。

option 1:
javaw -Xmx256M -jar -Dfile.encoding=UTF-8 "FontClass.jar"

option 2:
javaw -Xmx256M -jar "FontClass.jar"

使用选项 1: 我得到等宽显示

使用选项 2: 我得到非等宽显示。

限制:

i) -Dfile.encoding=UTF-8 我们已添加此选项以使我们的所有流都支持 UTF-8 支持。 而不是手动修改每个流。

ii) 我们在很多地方都在使用 java swing frame work。我们使用默认字体。 改变这一切需要大量工作。

所以现在我的问题是有任何命令行选项可以通过选项 1 获得等宽显示:

下面是示例代码:

class Show extends Frame {
    FontMetrics fontM;
    String outString;

    Show(String target, String title, Font font) {

        setTitle(title);
        outString = target;

        fontM = getFontMetrics(font);
        setFont(font);

        int size = 0;
        for (int i = 0; i < outString.length(); i++) {
            size += fontM.charWidth(outString.charAt(i));
        }
        size += 24;

        setSize(size, fontM.getHeight() + 60);
        setLocation(getSize().width / 2, getSize().height / 2);
        setVisible(true);
    }

    public void paint(Graphics g) {
        Insets insets = getInsets();
        int x = insets.left;
        int y = insets.top;
        g.drawString(outString, x + 6, y + fontM.getAscent() + 14);
    }
}

public class Fontclass {

    public static void main(String[] args) { 



        String jaString = new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217");  

        String inputString = "\niiii\naaaaiiii";

        String displayString = jaString + " " + inputString;

        Font font;
        font = new Font("Courier",3, 24);

        new Show(displayString, "Demo",font);

    }
}

【问题讨论】:

  • "下面是示例代码:" 问题在哪里?为什么代码使用 AWT 组件而不是 Swing?请修复代码格式,有近 700 个代表。你现在应该想通了..
  • 这两种情况对我来说看起来完全一样...
  • 对我和我团队中的许多其他人来说,两者看起来都不一样。使用选项 1 字体“Courier”是“Courier”。但是使用选项 2 Courier”看起来像“Courier new”
  • 涉及一些文本文件(比如 ISO-8859-1 中的文件)是否不合理,可能列出字体?查看 jre/lib 中的 fontconfig 和 psfont*.properties。可能插入了一个非 ASCII 字符。

标签: java swing utf-8 monospace


【解决方案1】:

来自FontMetrics API,它根据charWidth() 定义advance,“请注意,String 的前进不一定是其字符前进的总和。”此外,名为"Courier" 的字体可能是等宽字体,但它可能Font.MONOSPACED 指定的字体相同。

改为使用TextLayout 导出所需的几何图形,如hereherehere 所示。

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2021-10-02
    相关资源
    最近更新 更多