我有一个控制台应用程序,它打印菜单并获取一些输入等。菜单系统的标题我加了下划线:
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);
}
还有一个问题是,并非所有文本(例如公司或产品名称)都会被翻译。
[更新]
仔细查看输出后,各个日文字符似乎为每个英文字符占据了两个位置。是否有一个函数可以根据每个字符确定这一点?
[更新]
有什么想法吗?
西蒙
最佳答案
终端通常使用两个槽而不是一个槽来显示 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。这些数据与 block 或脚本的字符分配之间可能有很多重叠;例如,我猜大多数 HAN 字符都很宽。
关于java计算控制台上打印的字符数以加下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19045949/