`

getBytes()

    博客分类:
  • java
阅读更多
http://www.blogjava.net/pengpenglin/archive/2010/02/22/313647.html



getBytes()、getBytes(encoding)函数的作用是使用系统默认或者指定的字符集编码方式,将字符串编码成字节数组。

在中文平台下,默认的字符集编码是GBK,此时如果使用getBytes()或者getBytes("GBK"),则按照GBK的编码规则将每个中文字符用2个byte表示。所以我们看到"中文"最终GBK编码结果就是: -42 -48 -50 -60 。-42和-48代表了"中"字,而"-50"和"-60"则代表了"文"字。

在中文平台下,如果指定的字符集编码是UTF-8,那么按照UTF-8对中文的编码规则:每个中文用3个字节表示,那么"中文"这两个字符最终被编码成:-28 -72 -83、-26 -106 -121两组。每3个字节代表一个中文字符。

在中文平台下,如果指定的字符集编码是ISO-8859-1,由于此字符集是单字节编码,所以使用getBytes("ISO-8859-1")时,每个字符只取一个字节,每个汉字只取到了一半的字符。另外一半的字节丢失了。由于这一半的字符在字符集中找不到对应的字符,所以默认使用编码63代替,也就是?。

在英文平台下,默认的字符集编码是Cp1252(类似于ISO-8859-1),如果使用GBK、UTF-8进行编码,得到的字节数组依然是正确的(GBK4个字节,UTF-8是6个字节)。因为在JVM内部是以Unicode存储字符串的,使用getBytes(encoding)会让JVM进行一次Unicode到指定编码之间的转换。对于GBK,JVM依然会转换成4个字节,对于UTF-8,JVM依然会转换成6个字节。但是对于ISO-8859-1,则由于无法转换(2个字节--->1个字节,截取了一半的字节),所以转换后的结果是错误的。

相同的平台下,同一个中文字符,在不同的编码方式下,得到的是完全不同的字节数组。这些字节数组有可能是正确的(只要该字符集支持中文),也可能是完全错误的(该字符集不支持中文)。

记住:

不要轻易地使用或滥用String类的getBytes(encoding)方法,更要尽量避免使用getBytes()方法。因为这个方法是平台依赖的,在平台不可预知的情况下完全可能得到不同的结果。如果一定要进行字节编码,则用户要确保encoding的方法就是当初字符串输入时的encoding。
分享到:
评论

相关推荐

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

    ### Java中的String类getBytes()方法详解与实例 #### 简介 在Java编程语言中,`String`类是处理文本数据的核心类之一。它表示一个不可变的字符序列,这意味着一旦创建了一个`String`对象,其内容就不能被更改。在...

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

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

    C#加密JAVA解密

    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); DESCryptoServiceProvider cryptoProvider = new ...

    C#_MySQL_图片的存储与读取

    byte[] imageByte = new byte[dr.GetBytes(0, 0, null, 0, int.MaxValue)]; dr.GetBytes(0, 0, imageByte, 0, imageByte.Length); MemoryStream imageStream = new MemoryStream(imageByte); Image image = ...

    java 编码 UTF-8、ISO-8859-1、GBK

    例如,如果数据库是UTF-8,JSP是GBK,可以使用 `new String(rs.getBytes(1),"UTF-8")` 将数据库中的UTF-8字节流转换为GBK字符串。反之,如果JSP是UTF-8,数据库是GBK,需要先将GBK字符串转换为字节流,然后再次转换...

    NSData 与 NSString,Byte数组,UIImage 的相互转换

    - `NSData`本质上就是Byte数组,可以使用`getBytes:length:`方法将数据复制到预先分配好的字节数组中。 - 如果需要创建`NSData`实例,可以直接从字节数组构建,如`NSData *data = [NSData dataWithBytes:bytes ...

    用四个字节十六进制数表示单精度浮点数1

    同样,`BitConverter.GetBytes()`函数可以将浮点数转换回字节数组,便于通过串口进行通信。 在单片机(如STM32)或非.NET环境下,可能无法直接使用.NET框架提供的`BitConverter`类,因此需要编写自定义的转换函数,...

    base64转码解密成明文加密成Java密文

    SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); try { cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] ...

    C#16进制与字符串字节数组之间的转换代码

    byte[] bytes = chs.GetBytes(s); string str = ""; for (int i = 0; i ; i++) { str += string.Format("{0:X}", bytes[i]); // 转换为十六进制 if (fenge && (i != bytes.Length - 1)) { str += ","; // ...

    c#数据类型转换,BYTE,float,double,char类型间的转换方法.docx

    `ToCharArray()`方法可以将字符串转换为字符数组,而`Encoding`类如`Encoding.UTF8.GetBytes()`可以将字符串转换为字节数组,`Encoding.UTF8.GetString()`则用于反向转换。 **各种数值类型和字节数组之间的转换** ...

    c# MD5-UTF8加密解密类

    byte[] bytes = Encoding.UTF8.GetBytes(input); // 创建MD5对象 using (MD5 md5Hash = MD5.Create()) { // 计算哈希值 byte[] hashBytes = md5Hash.ComputeHash(bytes); // 将哈希值转换为字符串 ...

    JAVAAES对称加密工具类

    byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes()); ``` 对于文件流的加密,`EncryptUtil`可能会包含一个`encryptFile`方法,它接受输入流(源文件)、输出流(加密后文件)以及密钥。这个方法会读取...

    struts之中文乱码问题

    value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); // 其他业务逻辑... } } ``` 通过以上步骤,大部分情况下可以解决Struts框架下的中文乱码问题。然而,具体问题可能需要具体分析,有时还需要检查...

    国密算法SM4纯java代码实现

    SM4Enc_ECB(str.getBytes(), key.getBytes()); SM4Dec_ECB(bts,key.getBytes()); SM4Enc_CBC(str.getBytes(),iv.getBytes(), key.getBytes()); SM4Dec_CBC(bts,iv.getBytes(),key.getBytes()); SM4EncHex_ECB(strHex...

    C#聊天程序

    _clientSkt.Send(Encoding.Unicode.GetBytes(svrlog)); } Thread.CurrentThread.Abort(); break; } case "02": { byte[] onlineBuff = SerializeOnlineList(); //先发送响应信号,用于客户机的判断,"11...

    C#使用base64对字符串进行编码和解码的测试

    而在编码函数`ToBase64String`中,同样先检查输入的字符串是否为空,然后用`Encoding.UTF8.GetBytes`将字符串转换为字节数组,再调用`Convert.ToBase64String`将其编码为Base64字符串。 接下来,为了测试这两个函数...

    C#中一些字符串操作的常用用法

    - 使用`System.Text.Encoding.Default.GetBytes()`方法可以将汉字转换为字节数组,以获取其在默认编码(通常是GBK或GB2312)下的区位码。例如,`"啊"`在GBK编码下转换后的字节是它的区位码。 - 对于Unicode编码,...

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

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

    Jsp字符传递编码解释

    本篇文章将深入探讨`getBytes()`方法的用法以及在JSP中可能出现的编码错误原因。 首先,我们来了解`getBytes()`方法。这是Java String类的一个内置方法,用于将字符串转换为字节数组。默认情况下,`getBytes()`使用...

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

    SecretKeySpec skeySpec = new SecretKeySpec(encryptKey.getBytes(), "AES"); IvParameterSpec ivParam = new IvParameterSpec(iv.getBytes()); //使用CBC模式,需要一个向量iv,可增加加密算法的强度 ...

Global site tag (gtag.js) - Google Analytics