2015-12-27 82 views
2

我已将具有外部字符的字符串 - 昼夜转换为字节数组。 字节数组可以存储-128到127之间的值,所以对应的值已经被存储为3个字节---> -26,-103,-99。字符串Bytearray

这里的转换代码:

String str = "晝"; 
byte[] b = str.getBytes(); 

for(byte bt : b) 
    System.out.println(bt); 

String str1 = new String(b); 
System.out.println(str1); 

能否请你澄清这3个字节是如何被计算为外来字符

+1

你是如何转换你的字符串的? [这](https://docs.oracle.com/javase/tutorial/i18n/text/string.html)将帮助 – SMA

+0

{String str =“昼”; byte [] b = str.getBytes(); for(byte bt:b)System.out.println(bt); String str1 = new String(b); System.out.println(str1);} – Senthil

+0

[UTF-8“可变宽度编码”如何工作?](http://stackoverflow.com/questions/1543613/how-does-utf-8-可变宽度编码工作) – Joe

回答

3

昼是U + 665D。它看起来像转换它时,将其转换为UTF-8。 UTF-8是Unicode字符的可变长度编码。 [U + 0800,U + FFFF]中的字符被转换为3个字节。

根据this converter,U + 665D是UTF-8中的E6 99 9D(十六进制,230 153 157,十进制,需要一点)。因为一个字节是-128到127,所以大于127的值显示为少于256的数字,所以字节,230 153 157是230-256 153-256 157-256或-26 -103 -99,这是什么你看到了。

+0

感谢您澄清 – Senthil

1

从字符到字节的所有转换都使用一些字符集来完成编码。

你不会说,但我假设你使用String.getBytes()进行了转换。这只是String.getBytes(Charset.defaultCharset())的快捷方式,默认的Charset取决于您的特定Java环境。您报告的三个值(十六进制)为0xE6 0x99 0x9D。这是U + 665D(Unicode汉字'白天,日光')的UTF-8编码。由于这是您开始使用的角色,因此您的环境的默认字符集可能是UTF-8(这不是一个惊喜,但不是您可以指望的任何地方)。

+0

感谢您澄清 – Senthil

+0

这里是我使用的代码{String str =“昼”; \t \t byte [] b = str.getBytes(); \t \t \t为(字节BT:B) \t \t \t \t的System.out.println(BT); \t \t \t String str1 = new String(b); \t \t \t System.out.println(str1);}我没有在代码中指定编码。 Eclipse显示默认的cp1252编码。我正在执行Widows服务器的代码。 UTF-8从哪里被拿起...你能帮助理解吗? – Senthil

+0

@Senthil - 这几乎是我以为你在做什么。它为你的环境使用了默认的字符集,这很可能是UTF-8(或者至少对于那个特定的字符与UTF-8一致)。你可以使用'System.out.println(Charset.defaultCharset()。toString());' –

相关问题