2

我有一个控制台应用程序,它打印一个菜单并获得一些输入等。菜单系统有我下划线的标题:

 Main Menu
 =========

标题可以有不同的大小,所以我的第一次尝试是获取字符串长度并打印许多指定的下划线字符。不幸的是,这在我们的日语语言环境中不起作用。标题存储在 .properties 文件中,并使用 ResourceBundle 类获取。

我在 StackOverflow 中看到了一些可能的解决方案,它们似乎主要与 GUI 相关,所以没有帮助:

public static int getGraphemeCount(String text) {
   int graphemeCount = 0;
   BreakIterator graphemeCounter = BreakIterator.getCharacterInstance();
   graphemeCounter.setText(text);
   while (graphemeCounter.next() != BreakIterator.DONE) 
      graphemeCount++;
      return graphemeCount;
}
public static void outputTitle(String title,char underChar) {
   String underline = repeats(underChar,getGraphemeCount(title));
   System.out.printf("\n\t%s\n\t%s\n",title,underline);
}

还有一个额外的问题是不是所有的文本都会被翻译(例如公司或产品名称)。

[更新]

仔细查看输出后,单个日文字符似乎占每个英文字符的两个位置。是否有一个函数可以根据每个字符来确定这一点?

[更新]

有什么想法吗?

西蒙

4

1 回答 1

1

终端通常使用两个槽而不是一个槽来显示 CJK 字符,因此您必须将它们中的每一个都算作两个字符。还有“半角字符”占据一个插槽。获得视觉字符串长度的唯一方法是遍历字符,将全宽字符计为两个。

字符的宽度可以通过 Unicode 字符属性EAST_ASIAN_WIDTH来查找。不幸的是,标准 API 没有提供任何查找此属性的方法,但ICU4J 库提供:

char c = ...;
int width;
switch (UCharacter.getIntPropertyValue(c, UProperty.EAST_ASIAN_WIDTH)) {
    case UCharacter.EastAsianWidth.WIDE:
    case UCharacter.EastAsianWidth.FULLWIDTH:
        width = 2; break;
    default:
        width = 1;
}

如果你不能使用 ICU4J,这里是字符数据。这些数据与将字符分配给块或脚本之间可能有很多重叠;例如,我猜想大多数 HAN 字符都很宽。

于 2013-09-27T08:20:41.257 回答