Java获取字符的十进制字节表示形式
我有下面的代码,它从字符串Java获取字符的十进制字节表示形式,java,unicode,encoding,character-encoding,ascii,Java,Unicode,Encoding,Character Encoding,Ascii,我有下面的代码,它从字符串s0和s1打印字节;输出结果如下所示: public static void main(String[] args) throws UnsupportedEncodingException { String s0="H\u00ebllo"; String s1="Hëllo"; byte[] bytes=s0.getBytes("ISO8859_1"); //72 -21 108 108 111 //byte[] bytes=s1.ge
s0
和s1
打印字节;输出结果如下所示:
public static void main(String[] args) throws UnsupportedEncodingException {
String s0="H\u00ebllo";
String s1="Hëllo";
byte[] bytes=s0.getBytes("ISO8859_1"); //72 -21 108 108 111
//byte[] bytes=s1.getBytes("ISO8859_1"); //72 -61 -85 108 108 111
//byte[] bytes=s0.getBytes("UTF-8"); //72 -61 -85 108 108 111
//byte[] bytes=s1.getBytes("UTF-8"); //72 -61 -125 -62 -85 108 108 111
for (int i=0, i<bytes.length; i++) {
System.out.println(bytes[i]);
}
}
两者都给出了
UTF-8
。源文件位于Java中的UTF-8
中,字节
原语类型为有符号
,这意味着范围从-128到+127(第一位被认为是数字的符号)
在扩展ASCII和其他8位编码(如ISO-8859-1)中,存在字节值大于127的字符。当作为标准Java字节打印时,这些将显示为负数
如果使用UTF-8(或另一种Unicode UTF编码),非ASCII字符由2-4个字节表示,并且它们中的每一个都可能“大于127”,因此当您简单地将它们打印为字节值时,它们也会显示为负数。在Java中,字节基本类型是有符号的,这意味着范围从-128到+127(第一位被认为是数字的符号)
在扩展ASCII和其他8位编码(如ISO-8859-1)中,存在字节值大于127的字符。当作为标准Java字节打印时,这些将显示为负数
如果您使用UTF-8(或另一种Unicode UTF编码),非ASCII字符由2-4个字节表示,并且它们中的每一个都可能“大于127”,因此当您简单地将它们打印为字节值时,它们也将显示为负数。字节在Java中是有符号的数字,范围为-128到127。第二种情况下有6个数字,因为源文件使用UTF-8编码,并且Java编译器假定平台特定的编码可能不是UTF-8。使用IDE时,请查找与源代码和/或编译器编码对应的设置。使用javac
进行编译时,请尝试指定-encoding UTF-8
字节在Java中是有符号的数字,范围在-128到127之间。第二种情况下有6个数字,因为源文件使用UTF-8编码,并且Java编译器假定平台特定的编码可能不是UTF-8。使用IDE时,请查找与源代码和/或编译器编码对应的设置。使用javac
进行编译时,请尝试在java中指定-encoding UTF-8
,所有数字类型都是有符号的(而不是无符号的)。请注意,char
不是数字类型,即使它可以在算术上使用(滥用)
您的编码提供了一个-21
,它只是Java的字节
表示0b11101011
或0xEB
在Java中,所有数字类型都是有符号的(与无符号相反)。请注意,char
不是数字类型,即使它可以在算术上使用(滥用)
您的编码提供了一个-21
,它只是Java的字节
表示0b11101011
或0xEB
,k的目的是什么?@Andreas,它是一个更大程序的一部分,出于个人原因需要k
。还是编辑了帖子。同样,您的源文件存储在UTF-8中,因此ë
存储为两个字节。您的编译器采用不同的编码,并将UTF-8误读为ë
,因此当执行代码时,它不知道有关Hëllo
的任何信息,而只知道Hëllo
。内存中的字符串被编码为UTF-16,而不是UTF-8。文件编码和内存编码之间存在转换。通过将字符串
视为字节序列,无法可靠地获得正确的结果。您必须将其视为char
序列@Markus Benko,但是这个想法说我的源文件是用UTF-8运行的(-Dfile.encoding=UTF-8
),编译器使用不同的编码吗?k
的目的是什么?@Andreas,它是更大程序的一部分,出于个人原因需要k
。还是编辑了帖子。同样,您的源文件存储在UTF-8中,因此ë
存储为两个字节。您的编译器采用不同的编码,并将UTF-8误读为ë
,因此当执行代码时,它不知道有关Hëllo
的任何信息,而只知道Hëllo
。内存中的字符串被编码为UTF-16,而不是UTF-8。文件编码和内存编码之间存在转换。通过将字符串
视为字节序列,无法可靠地获得正确的结果。您必须将其视为char
序列@Markus Benko,但是这个想法说我的源文件是以UTF-8运行的(-Dfile.encoding=UTF-8
),编译器使用不同的编码吗?为什么235变成了-21?毕竟,第一位是零,这意味着它是一个正数。完成了235->0111011的转换并在此处反转,-21从未出现…这是因为您指定了9位,因为网站向您显示了一个错误,因为235超出了范围。我编辑了这个问题,请解释一下s0
和s1
案例之间的区别?char
是数字类型。我将坚持使用Java语言规范,而不是您对此的看法。为什么235变成了-21?毕竟,第一位是零,这意味着它是一个正数。完成了235->0111011的转换并在此处反转,-21从未出现…这是因为您指定了9位,因为网站向您显示了一个错误,因为235超出了范围。我编辑了这个问题,请解释一下s0
和s1
案例之间的区别?char
是数字类型。我将坚持Java语言规范,而不是你对这一点的看法。但是ë
是Unicode的U+00EB
,是0xeb
中的
System.out.println(System.getProperty("file.encoding"));
System.out.println(java.nio.charset.Charset.defaultCharset());