为什么这不起作用字符串a =" \ u" +" 30A0&#34 ;;?

时间:2014-08-09 18:10:04

标签: java string unicode

为什么这样做......

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

4 个答案:

答案 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) << 400a0,...,我认为这就是您想要的。

P.S。你甚至不需要双循环。只有一个从00b00x00a0的整数变量将为您提供我认为您需要的内容。

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