为什么这样做......
System.out.println("\u30A3"); output -> ィ
什么时候不起作用?
System.out.println("\u" + "30A0"); output -> invalid unicode
关于我还能做什么的任何想法?
那是因为我在下面有这个代码,自动生成片假名Unicode编号,这样我就可以快速抓取片假名语言中的任何一个字符,但似乎无论如何都无法工作。
ArrayList<String> symbols = new ArrayList<>();
for (int i = 0; i < 6; i++) {
for (int k = 0; k < 16; k++) {
if (k < 10) {
symbols.add("\u30" + (char) (i + 65) + k);
} else {
symbols.add("\u30" + (char) (i + 65) + (char) (k - 10 + 65));
}
}
}
答案 0 :(得分:2)
这不起作用,因为\u
转义序列is done very early during the compilation process的处理。这意味着您不能像第二个示例中那样尝试连接转义序列的位。
要将整数代码点(例如0x30A0
)转换为char
,您可以使用Character.toChars()。
答案 1 :(得分:1)
for (int i = 0; i < 6; i++) {
for (int k = 0; k < 16; k++) {
if (k < 10) {
symbols.add("\u30" + (char) (i + 65) + k);
} else {
symbols.add("\u30" + (char) (i + 65) + (char) (k - 10 + 65));
}
}
}
要创建一个由您的程序计算其值的Unicode字符,您真正需要做的就是计算代码点,然后将其转换为(char)
,只要它在{{1}范围内即可到0
。 (代码点FFFF
及更高版本需要不同的内容,我认为U+10000
。)在您的示例中,您尝试计算new String(new int[]{codePoint}, 0, 1)
,所以
0x3000 + [16 times some letter value A-F] + [some digit or letter value]
for (int i = 0; i < 6; i++) {
for (int k = 0; k < 16; k++) {
char charValue = (char) (0x3000 + ((10 + i) << 4) + k);
symbols.add(Character.toString(charValue));
}
}
为您提供(10 + i) << 4
,00a0
,...,我认为这就是您想要的。
P.S。你甚至不需要双循环。只有一个从00b0
到0x00a0
的整数变量将为您提供我认为您需要的内容。
答案 2 :(得分:0)
由于编译器处理字符串的方式,它不起作用。当字符串 literal (即源代码中的"
+ text + "
)包含魔术序列\u
时,您告诉编译器我想在这里有一个Unicode字符。接下来的几个(十六进制)数字定义了哪一个。
但是现在你把它拆开了:当编译器看到字符串文字"\u"
时,它会看到\u
,然后想要在同一个字面中找到一些数字 。但是没有。这就是您收到错误消息的原因。
答案 3 :(得分:0)
我终于找到了一个可以使用的方法,请查看:
public class Txt {
private ArrayList<String> katakana = new ArrayList<>();
public Txt() {
for (int i = 0x30A0; i <= 0x30FF; i++) {
katakana.add(String.valueOf(Character.toChars(i)));
}
}
public ArrayList<String> getKatakana() {
return new ArrayList<>(katakana);
}
}