java计算控制台上下划线的打印字符数

时间:2013-09-27 08:15:21

标签: java string localization

我有一个控制台应用程序,可以打印菜单并获得一些输入等。菜单系统有我强调的标题:

 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);
}

有一个额外的皱纹,并非所有文本都将被翻译(例如公司或产品名称)。

[更新]

仔细观察输出后,每个英文字符的个别日文字符占两个位置。是否有一个函数来确定每个字符?

[更新]

有什么想法吗?

西蒙

1 个答案:

答案 0 :(得分:1)

终端通常使用两个插槽而不是一个插槽显示CJK字符,因此您必须将每个插槽计为两个字符。还有“半角字符”占据一个插槽。获取可视字符串长度的唯一方法是循环遍历字符,将全角字符计为两个。

可以将字符的宽度查找为Unicode字符属性EAST_ASIAN_WIDTH。遗憾的是,标准API没有提供查找此属性的任何方法,但the ICU4J library确实:

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;
}

Here's the character data如果你不能使用ICU4J。这些数据与字符到块或脚本的分配之间可能存在很多重叠;我猜大多数HAN字符都很宽。例如。