我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将一个包含6个字符的字符串转换为字节时,我得到了6个字节,如下所示,我期望它是12。我是不是漏掉了什么概念?
package learn.java;
public class CharacterTest {
public static void main(String[] args) {
String str = "Hadoop";
byte bt[] = str.getBytes();
System.out.println("the length of character array is " + bt.length);
}
}
O/p:字符数组的长度为6
按照@Darshan的说法,当尝试使用UTF-16编码获取字节时,结果也不是预期的。
package learn.java;
public class CharacterTest {
public static void main(String[] args) {
String str = "Hadoop";
try{
byte bt[] = str.getBytes("UTF-16");
System.out.println("the length of character array is " + bt.length);
}
catch(Exception e)
{
}
}
}
o/p: the length of character array is 14
我认为这将有所帮助:每个软件开发人员绝对、肯定必须了解Unicode和字符集(没有借口!)乔尔·斯波尔斯基
这也将有所帮助:“UTF-16(16 位 Unicode 转换格式)是一种字符编码 [...]编码是一种可变长度的编码,因为代码点使用一个或两个 16 位代码单元进行编码。(来自维基百科)
根据<code>字符串。getBytes()方法的文档中,使用平台的默认字符集将字符串编码为字节序列。
我假设您的平台默认字符集是ISO-8859-1(或者类似的每字符一字节字符集)。这些字符集将一个字符编码成一个字节。
如果要指定编码,请使用< code > String . getbytes(Charset)或< code > String . getbytes(String)方法。
关于 16 位存储:这是 Java 内部存储字符的方式,字符串也是如此。它基于原始的 Unicode 规范。
在UTF-16版本中,由于插入了一个标记来区分Big Endian(默认值)和Little Endian,因此可以得到14个字节。如果指定UTF-16LE,则将获得12个字节(小端,不添加字节顺序标记)。
参见http://www.unicode.org/faq/utf_bom.html#gen7
编辑 - 使用此程序查看不同编码生成的实际字节:
public class Test {
public static void main(String args[]) throws Exception {
// bytes in the first argument, encoded using second argument
byte[] bs = args[0].getBytes(args[1]);
System.err.println(bs.length + " bytes:");
// print hex values of bytes and (if printable), the char itself
char[] hex = "0123456789ABCDEF".toCharArray();
for (int i=0; i<bs.length; i++) {
int b = (bs[i] < 0) ? bs[i] + 256 : bs[i];
System.err.print(hex[b>>4] + "" + hex[b&0xf]
+ ( ! Character.isISOControl((char)b) ? ""+(char)b : ".")
+ ( (i%4 == 3) ? "\n" : " "));
}
System.err.println();
}
}
例如,在 UTF-8 下运行时(在其他 JVM 默认编码下,FE 和 FF 的字符将显示不同),输出为:
$ javac Test.java && java -cp . Test hello UTF-16
12 bytes:
FEþ FFÿ 00. 68h
00. 65e 00. 6Cl
00. 6Cl 00. 6Fo
和
$ javac Test.java && java -cp . Test hello UTF-16LE
10 bytes:
68h 00. 65e 00.
6Cl 00. 6Cl 00.
6Fo 00.
和
$ javac Test.java && java -cp . Test hello UTF-16BE
10 bytes:
00. 68h 00. 65e
00. 6Cl 00. 6Cl
00. 6Fo
问题内容: 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将包含6个字符的字符串转换为字节时,我将得到如下所示的6个字节,但我希望它是12。是否缺少任何概念? O / p:字符数组的长度为6 根据@Darshan尝试使用UTF-16编码获取字节时,结果也不期望。 问题答案: 在UTF-16版本中,由于插入了一个标记来区分Big Endian(默认)和L
问题内容: 我遇到了这行遗留代码,我试图找出这些遗留代码: 据我了解,它是使用相同的charSet进行编码和解码。 这与以下内容有何不同? 在任何情况下,两条生产线的输出将不同? ps:只是要澄清一下,是的,我知道Joel Spolsky撰写的关于编码 的出色文章! 问题答案: 这可能是很复杂的方式 这缩短了String,而所使用的基础char []则更长。 但是,更具体地说,将检查每个字符是否都
问题内容: 该JSON RFC,第2.5节,说部分: 为了转义不在“基本多语言平面”中的扩展字符,该字符表示为十二个字符的序列,对UTF-16代理对进行编码。因此,例如,仅包含G谱号字符(U + 1D11E)的字符串可以表示为“ \ uD834 \ uDD1E”。 假设我有合理的理由将JSON编码为UTF-16BE(允许)。这样做时,是否仍然需要转义基本多语言平面中没有的字符?例如,代替此: 这是
问题内容: 根据Java SE 7规范 ,Java使用Unicode UTF-16标准表示字符。将a想象成一个 简单 的16位变量 数组 ,每个 数组 包含一个字符时,生活很简单。 不幸的是,对于某些代码点来说,仅16位是不够的(我相信这是所有Unicode字符的16/17)。因此在a中,这没有直接问题,因为当要使用 另外两个字节 存储〜1.048.576个字符之一时,只需使用其中的两个数组位置。
问题内容: 现在考虑下面给出的代码: 当我尝试调试上面代码中的行时,调试器将我带到String类的方法中,然后将我带到StringCoding类的方法中。在调试过程中,encode方法的第一行()返回“ UTF-8”作为默认编码。我希望它是“ UTF-16”。 该程序的输出为: 最= 6700的Unicode值UTF-8字符=最| 默认值:字节数= 3 对应的UTF-16字符= UTF-16:字节
问题内容: 我正在通过对象从轴Web服务接收字符串。因为我没有得到我期望的字符串,所以我通过将字符串转换为字节进行了检查,然后在hexa中得到了C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297,当我期望使用E4BDA0 E5A5BD E59097时,实际上在UTF- 8。 有什么想法会导致您好吗成为C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C