public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
String a="a";
System.out.println(a.length());
byte[] bb= a.getBytes("UTF-16");
System.out.println(binary(bb,16));
System.out.println(bb.length);
}
public static String binary(byte[] bytes, int radix){
return new BigInteger(1, bytes).toString(radix);
}
}
结果是
1
feff0061
4
为什么getBytes("UTF-16")之后byte数组的长度是4呢?不应该是2吗
我们来具体看下 0061 就是a的二进制表示,那前面的feff是什么东西呢?
在wiki上我们可以看到:
UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintosh制作或存储的文字使用大尾序格式,以Microsoft或Linux制作或存储的文字使用小尾序格式。
为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark(UTF-16LE以FF FE代表,UTF-16BE以FE FF代表),以显示这个文本文件是以UTF-16编码,其中U+FEFF字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,顾名思义,它是个没有宽度也没有断字的空白。
原来FE FF代表 UTF-16BE ,就是大尾序格式,显示的是0061
可以看到我们换成
byte[] bb= a.getBytes("UTF-16BE"); 得到的结果就是0061了
反之
byte[] bb= a.getBytes("UTF-16LE"); 得到的结果就是6100了
结论:getBytes("UTF-16")的byte长度会比我们预期的多2,就是两个byte开头要指定是大尾格式,还是小尾格式 。。
分享到:
相关推荐
Unicode最常用的变体是UTF-8、UTF-16等。在Java中,字符串默认使用Unicode编码,每个字符通常占用两个字节。 ##### 2. ISO-8859-1 ISO-8859-1是一种单字节编码方案,主要用于西欧语言。每个字符由一个字节表示,...
2. UTF-32:这是一种固定长度的编码方式,每个Unicode字符都用4个字节表示。它的优点在于编码简单,因为每个字符都有一个固定的字节数,但在处理大量文本时可能会占用更多的存储空间。 接下来,我们将讨论如何在VB...
2. **UTF-16编码**:通过`name.getBytes("UTF-16")`获取到的byte数组长度为4,这是因为UTF-16使用了字节顺序标记(BOM),并且“你”这个汉字在UTF-16编码下占用了2个字节。 3. **UTF-16BE编码**:通过`name....
这意味着对于大多数常见字符,UTF-16编码只需要2个字节,而在处理一些特殊字符时,则需要4个字节。 ##### 示例:从字符串获取字符 ```java String name = "你好"; char c_name = name.charAt(0); // 获取第一个...
2. **汉字转UTF-16**:使用`Encoding.Unicode.GetBytes()`方法可以将汉字转换为UTF-16编码。 3. **UTF-8/UTF-16转汉字**:反向操作则需要用到`Encoding.UTF8.GetString()`或`Encoding.Unicode.GetString()`,将字节...
4. **UTF-16编码**:固定2字节编码,除了ASCII字符外,其他字符都需要2字节,且有大端和小端两种字节顺序。 5. **BOM的使用**:在文件开头添加BOM可以帮助解析器确定字节顺序,但在某些情况下可能会引起问题,比如在...
2. **错误的编码**:`getBytes("8859_1")` 应当使用 `"UTF-8"`,因为我们要转换的是 UTF-8 编码的字符串。 #### 六、正确实现 基于以上分析,正确的 UTF-8 转 GB2312 的代码应如下所示: ```java private String ...
Unicode标准定义了多种编码形式,其中最常用的是UTF-8、UTF-16和UTF-32。 2. UTF-8编码: UTF-8是一种变长的Unicode编码方式,它将不同范围的Unicode码点转换为不同长度的字节序列。基本拉丁字母(ASCII)用单字节...
Unicode有多种编码形式,如UTF-8、UTF-16等。 #### 4. **GB2312** GB2312是中国大陆制定的第一个汉字编码国家标准,用于中文字符的编码。它的编码范围涵盖了6763个汉字和682个非汉字图形符号。 #### 5. **UTF-7** ...
2. **16进制转汉字**:逆向操作涉及到解析16进制字符串回UTF-8字节,然后用这些字节构造汉字。这需要知道每个汉字的字节数,一般通过长度判断。对于UTF-8编码,如果16进制字符串长度为6,则是两个字节的汉字;若为9...
在ASCII编码中,一个字符占据一个字节,但在Unicode(如UTF-8或UTF-16)编码中,一个字符可能占用多个字节。因此,当处理非ASCII字符时,单纯基于字符数量的截取可能会导致字节长度超出预期。正则表达式在处理这类...
解决办法是手动使用ISO-8859-1重新编码接收到的参数,然后用UTF-8解码,例如`new String(name.getBytes("ISO8859-1"), "UTF-8")`。 对于响应消息的中文乱码,主要是响应体的编码设置。在Servlet中,可以使用...
- **定义**:UTF-16是一种固定或可变长度的字符编码格式,用于表示Unicode字符集。 - **特点**: - 分为UTF-16BE(大端模式)和UTF-16LE(小端模式)。 - 对于常用的字符(如拉丁字母、汉字等),使用两个字节编码...
- **UTF-8与UTF-16**: UTF-8是一种可变长度的编码方式,对于ASCII字符只需1字节存储空间,而对于其他字符则需要2到4字节。而UTF-16则是固定长度的编码方式,通常用于内部存储。 #### 六、Unicode的应用场景 - **...
1. **UTF-8**:一种可变长度的Unicode编码方式,广泛用于Web页面和文件存储。 2. **ISO-8859-1**:也称为Latin1,主要用于西欧语言的编码。 3. **GBK**:中文简体字符集编码标准之一,在中国大陆非常常用。 4. **GB...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的信息映射为固定长度的输出,通常为128位,通常以32位的十六进制数字表示。在C#中,MD5常用于数据的校验、密码存储以及生成唯一标识...
Unicode是一种旨在覆盖世界上所有书写系统的字符编码标准,它采用固定的编码长度,一般为2字节(UTF-16)或4字节(UTF-32)。Unicode编码解决了多语言环境中字符编码不统一的问题,使得各种语言的字符可以在同一环境...
1. **UTF-8**:是一种可变长度的字符编码,用于Unicode标准,支持世界上几乎所有国家的文字。它是互联网上最常用的编码方式之一。 2. **ISO-8859-1**:也称为Latin-1,是一种单字节编码方案,主要支持西欧语言。 3. ...
因为ISO-8859-1是单字节编码,转换为UTF-8后,单字节的字符长度不变,但多字节字符会变成多个字节,所以长度会有变化。 在Web应用开发中,如果客户端在请求头指定了编码,我们就不需要手动转换。例如,如果请求头...
- 对于包含大量英文字符的网页,UTF-8编码相比其他编码(如UTF-16)更节省空间。 #### 三、Java中的字符处理 ##### 3.1 `getBytes(charset)` - **功能**:将字符串转换成指定字符集的字节数组。 - **示例**: -...