【问题标题】:Java Character literals value with getNumericValue()带有 getNumericValue() 的 Java 字符文字值
【发布时间】:2012-12-05 06:59:27
【问题描述】:

为什么我的大写和小写文字的结果都相同?例如:

char ch1 = 'A';
char ch2 = 'a';
char ch3 = 'Z';
char ch4 = 'z';

print("ch1 -- > " + Integer.toBinaryString(Character.getNumericValue(ch1)));
print("ch2 -- > " + Integer.toBinaryString(Character.getNumericValue(ch2)));
print("ch3 -- > " + Integer.toBinaryString(Character.getNumericValue(ch3)));
print("ch4 -- > " + Integer.toBinaryString(Character.getNumericValue(ch4)));

我得到的结果:

ch1 -- > 1010
ch2 -- > 1010
ch3 -- > 100011
ch4 -- > 100011

并没有真正看到“A”和“a”之间的区别。即使我使用 UTF 格式的字符文字(\u0041 表示“A”,\u0061 表示“a”),我也会得到相同的结果。

【问题讨论】:

    标签: java character literals


    【解决方案1】:

    它的行为与documented

    大写字母 A-Z('\u0041' 到 '\u005A')、小写字母('\u0061' 到 '\u007A')和全角变体('\uFF21' 到 '\uFF3A' 和 ' \uFF41' 到 '\uFF5A') 形式的数值从 10 到 35。

    基本上这意味着在解析十六进制(比如)0xfa == 0xFA 时,正如您所期望的那样。

    我只希望在使用 base64 之类的东西时大小写很重要。

    【讨论】:

    • 让我们删除该评论并忘记它的发生;)
    • 哇,谢谢,我错过了文档中的这个有趣的点。相当“奇怪”的行为,恕我直言。我所期待的——只是为了得到“字符文字的整数表示”。
    • 听起来可能很奇怪,但我预计 'A' 为 0x0041,'a' 为 0x0061。
    • @DmitriyUgnichenko:一点也不奇怪——这是有据可查的行为。它试图找出字符的含义,例如'0' => 0。正如 Dolda2000 所说,如果你只想要 Unicode 值,你可以使用int value = 'A';
    • 并将 Unicode 值作为二进制字符串获取:Integer.toBinaryString('a')
    【解决方案2】:

    从评论来看,您实际上是在寻找字符的代码点,而不是它们的数值,因此我将其隔离为答案。 getNumericValue() 函数在解释其字形时返回字符作为数字的含义,它不返回字符的代码点。例如,getNumericValue('5') 返回 5 作为 int,而不是 5 的代码点。

    要使用代码点,只需按原样使用您的变量或 char 文字。 char 是数字数据类型。例如,System.out.println((int)'a'); 将打印 65,非常简单。

    【讨论】:

    • 好的,谢谢。这就是我想要的(甚至不知道为什么我决定使用这个 getNumericValue() 方法)。一切都变得容易得多。
    猜你喜欢
    • 2014-11-28
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2013-02-26
    相关资源
    最近更新 更多