使用Java博士,为什么♂;在交互窗格中与编程时不同的内容

使用Java博士,为什么♂;在交互窗格中与编程时不同的内容,java,unicode,symbols,Java,Unicode,Symbols,当使用下面的代码时 int count = 0; while(count != '♂'){ count++; } System.out.print(count); 在dr java的interactions窗格中,它等于正确的unicode数字(9794),但在programming窗格中完成时,它返回63,使用完全相同的代码 为什么呢 事情变得越来越复杂 在“交互”窗格中使用此代码时 输入是♂ while(count != letter.charAt(0)){ count++

当使用下面的代码时

int count = 0;
while(count != '♂'){
    count++;
}
System.out.print(count);
在dr java的interactions窗格中,它等于正确的unicode数字(9794),但在programming窗格中完成时,它返回63,使用完全相同的代码

为什么呢

事情变得越来越复杂

在“交互”窗格中使用此代码时 输入是♂

while(count != letter.charAt(0)){
    count++;
}

它返回66,在编程窗格中也是如此,

字符编码取决于系统。根据您的方框,它可能会打印UTF-16编码的16位(9794)、高8位(38)或低8位(66)

  • 9794/256=38
  • 9794%256=66

您正在使用的工具似乎有问题,这可能是停止使用它们的一个很好的理由:-)

男性符号
U+2642
(请参阅)的最后八位字节为0x42(来自
0x26 0x42
),十进制为
66
4 x 16+2

在编程窗格中完成后,返回63,使用完全相同的代码

字符63是问号
。当您正在写入的编码中无法写入您所使用的字符时,这将用作占位符

我假设“编程窗格”是指主源代码编辑器。此内容在编译之前会保存到文件中,因此必须使用特定的编码进行保存。不幸的是,除了系统默认代码页(可能是Windows代码页1252)之外,DrJava似乎没有为您提供将文件另存为任何内容的选项。此编码不包括字符
,因此它被
替换

因此,对于您当前的工作流,很遗憾,您将不得不坚持使用仅限ASCII的源代码,并因此说:

while (count != '\u2642') { ...

听起来像是DrJava编程窗格中的一个错误,没有正确处理Unicode。我不太明白你说的低8位和高8位是什么意思。java字符是16位,可以分成两个8位部分。您可以通过将“高”部分乘以256并添加低部分来重新组合这些部分。在你的例子中36*256+66=9794。刚刚意识到问题中的一个错误,当编程时它输出64,而不是66,那么低8是64吗?woops,我的意思是63,而不是64。那主要取决于你的工具的编码。我知道U+是unicode,但我不知道它来自哪里?你能解释一下吗?@David,
0xNN
是一种指定十六进制数的方法,尤其是像我这样的老顽固。我想说的是,您使用的工具似乎并不完全符合Unicode的思维方式,因为它只使用值的低八位(
0x42
或十进制
66
)进行比较。
while (count != '\u2642') { ...