`

getBytes("UTF-16")长度多2的原因

 
阅读更多
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开头要指定是大尾格式,还是小尾格式  。。
0
1
分享到:
评论

相关推荐

    JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)

    本文实例讲述了JS实现对中文字符串...String encodeStr = new String(Base64.encode(sql.getBytes(UTF-8))); // 编码 System.out.println(encodeStr); 得到: c2VsZWN0IOeUqOaIt+WQjSBmcm9tIOeUqOaItw== 在Java中

    DownLoadUtil.java

    " + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";*/ //java9 版本使用如下base64方式进行编码 filename = "=?utf-8?B?" + Base64.getEncoder().encodeToString(filename.getBytes("utf-8...

    一个完整可用的证书签名(验签),加密(解密)java源码

    String sign = CertificateUtils.signToBase64(data.getBytes("utf-8"), keyStorePath, alias, password); System.out.println("私钥签名:" + sign); boolean status = CertificateUtils.verifySign(data....

    struts之中文乱码问题

    struts的中文乱码问题。。我想这对大多数朋友会有用的

    Java中的String类getBytes()方法详解与实例

    通过实例和代码演示了使用平台默认字符编码和指定UTF-8、ISO-8859-1字符编码的情况。getBytes()方法在处理字符串和字节数据之间的转换时非常有用,特别是在跨平台和处理不同字符集的情况下。记得在使用指定字符编码...

    c# MD5-UTF8加密解密类

    MD5加密类 c# MD5-UTF8加密解密类c# MD5-UTF8加密解密类

    C#(.net)中按字节数截取字符串最后出现乱码问题的解决

    Encoding.UTF8.GetBytes采用的是utf-8编码。这样当然是乱码。尤其出现中文时候。 对这类数据处理当然要用统一的编码来处理。下面话不多说了,来一起看看详细的介绍吧 例子:1 string msg= Encoding.UTF8....

    struts2上传插件(中文编码冲突解决)

    解决Struts2上传时候使用UTF-8的冲突问题: * 重新包装了JakartaMultiPartRequest提供Chartset的设置方法。 * 可以通过配置方式对MultiPartRequest中的内容进行编码设定,请在Struts.xml中配置添加struts.multipart...

    vb2010 开发的读取指定字符串的文本

    bttext = System.Text.Encoding.UTF8.GetBytes(TextBox2.Text) For i = 0 To bttext.Length - 1 strBin = strBin & Convert.ToString(Int32.Parse(bttext(i)), 2).PadLeft(8, "0") Next i TextBox3.Text = ...

    史上最全的java基础总结大全

    byte[] buf2 = str2.getBytes("UTF-8");//指定解码:UTF-8,六个字节 //编码解码3:编码正确解码错误 String str3 = "你好"; byte[] buf3 = str3.getBytes("GBK");//指定编码:GBK,四个字节 String str3 = ...

    day019-io笔记和代码.rar

    * 2、因为字节流读取汉字的时候,字节数组长度不够,将一个汉字拆开了 * 解决: * 1. 用字符流用统一的字符集(最常用) * * 浏览器 : UTF-8 * 前台: * HTML :UTF-8 ...

    JavaScript 字符编码规则

    [escape] ISO Latin字符集对指定的字符串进行编码,不会被编码的字符[ @ * / +] [encodeURI] UTF-8字符集对指定的字符串进行编码 [encodeURIComponent] UTF-8字符集对指定的字符串进行编码,[支持更多的字符] 当源与...

    什么是软件测试ppt

    介绍软件测试培训的PPT private void collect(String stu,String val,HttpServletResponse response) throws IOException{ ... out.write(buffer.toString().getBytes("UTF-8")); out.close(); }

    jforum-2.5.0修正版

    安装方法: ...2.启动tomcat, 访问如:http://172.18.20.164:8080/install.jsp,设置相关参数,此是在WEB-INF/config下会... this.addParameter(name, new String(values[i].getBytes(containerEncoding), encoding)); } }

    AESUtil AES的加密和解密java工具类

    AESUtil AES的加密和解密java工具类 aes解密 aes加密 KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); Cipher cipher = Cipher.... return cipher.doFinal(content.getBytes("utf-8"));

    智能识别收货地址Java.pdf

    Key sKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm()); mac.init(sKey); byte[] hash = mac.doFinal(signStr.getBytes("UTF-8")); String sig = new BASE64Encoder().encode(hash); ...

    tts_java_demo (1).zip

    String paramBase64 = new String(Base64.encodeBase64(param.getBytes("UTF-8"))); String checkSum = DigestUtils.md5Hex(API_KEY + curTime + paramBase64); Map, String> header = new HashMap, String>(); ...

    commons-codec

    包含Base64转码使用AES 256的时候可能用到,例如new Base64().decode(ciphertext.getBytes("UTF-8"))

    2020年SpringMVC面试题,看这篇就足够了

    1. 什么是SpringMVC? SpringMVC是一种基于 Java 的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个...String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"u

    Struts Updownload 源码

    this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8"); } public String getContentDisposition() { return contentDisposition; } public void setContentDisposition(String ...

Global site tag (gtag.js) - Google Analytics