`
y806839048
  • 浏览: 1117442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

String与byte[]字节数组中文转换乱码问题

阅读更多

 Sunshine的 String.getBytes()和new String() 

在Java中,String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,

byte[] b_gbk = "中".getBytes("GBK");

byte[] b_utf8 = "中".getBytes("UTF-8"); 

byte[] b_iso88591 = "中".getBytes("ISO8859-1");

byte[] b_unicode = "中".getBytes("unicode");

将分别返回“中”这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1,b_unicode 的长度为4(系统的的unicode采用的是big-endian就是前面是两个字节来表示这个的,unicode采用的都是两个字节编码,所以后面是4个字节 )。

而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“中”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。

String s_gbk = new String(b_gbk,"GBK");

String s_utf8 = new String(b_utf8,"UTF-8"); 

String s_iso88591 = new String(b_iso88591,"ISO8859-1");

 通过打印s_gbk、s_utf8和s_iso88591,会发现,s_gbk和s_utf8都是“中”,而只有s_iso88591是一个不认识的字符,为什么使用ISO8859-1编码再组合之后,无法还原“中”字呢,其实原因很简单,因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"中".getBytes("ISO8859-1");来得到正确的“中”字在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。

因此,通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。

有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1 编码),可能会通过将中文字符按照字节方式来编码的情况,如  String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1"),这样得到的s_iso8859-1字符串实际是三个在ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式String s_utf8 = new  String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正确的中文汉字“中”。这样就既保证了遵守协议规定、也支持中文。

String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现在一个平台上运行.    良好的系统,放到另外一台机器后会产生意想不到的问题。

分享到:
评论

相关推荐

    C#_string_byte数组转换解析

    在C#编程语言中,字符串(string)与字节数组(byte array)之间的转换是常见的操作,尤其在处理二进制数据、网络传输或文件读写时。本篇文章将详细解析C#中如何进行这两种数据类型的转换,并讨论转换过程中需要注意...

    vb6.0 字节数组和字符串的相互转换.rar

    将字节数组转换回字符串,同样使用`StrConv`函数,但这次将`Conversion`设置为`vbUnicode`(对于非ASCII字符)或`vbFromUnicode`(对于ASCII字符)。由于VB6.0默认使用Unicode编码,因此通常使用`vbUnicode`。 示例...

    Android byte[] 和 String互相转换

    在Java和Android中,将字节数组转换为字符串最常用的方法是使用`new String(byte[])`构造函数。此方法会使用平台默认的字符编码,这可能会导致在不同系统上显示不同的结果。为了避免这个问题,我们通常指定一个明确...

    winform 字符串和字节数组转换源码

    在Windows Forms(Winform)开发中,经常需要处理字符串与字节数组之间的转换,这是因为字符串在内存中是Unicode格式,而字节数组则可以用于数据传输、存储或者序列化。本文将深入探讨如何在C# Winform环境中进行...

    C# 将中文乱码转换成中文

    通过调用`GetBytes()`方法将字符串转换为字节数组,以及`GetString()`方法将字节数组转换回字符串,可以实现编码转换。 ### 示例代码解析 ```csharp string str = "?D?a???12o1;Լı"; // 假设这是乱码的字符串 ...

    java中String_十六进制String_byte[]之间相互转换

    将字节数组转换回字符串时,同样需要考虑字符集的设置问题。 **代码示例:** ```java public static String bytesToString(byte[] bytes) { return new String(bytes, StandardCharsets.UTF_8); } ``` 这里使用...

    简单说说JAVA的String和byte[]的关系

    // 从UTF-8编码的字节数组转换回String String str2 = new String(bytes, "UTF-8"); ``` 如果在解码时不正确地指定了字符集(例如使用了"GBK"而不是"UTF-8"),那么将会导致乱码问题。 #### 五、应用场景 1. **...

    Netty进制转换乱码问题

    在使用Netty进行TCP/IP通信时,我们可能会遇到数据进制转换导致的乱码问题。这个问题通常是由于数据编码不一致或者处理方式不当所引起的。在本文中,我们将深入探讨Netty中的进制转换和字符编码,并提供解决方案。 ...

    java代码-例子4-6 用字节数组初始化String对象

    在实际开发中,我们可能会遇到需要从字节数组初始化String对象的情况。这个例子4-6就是为了展示这种操作的具体实现。让我们详细探讨一下这个话题。 首先,我们要理解String类的基本构造函数之一,它接受一个字节...

    Java中字符串与byte数组之间的相互转换

    在Java编程中,字符串(String)与字节数组(byte[])之间的转换是常见的操作,尤其是在处理数据传输、文件存储或网络通信等场景。本文将深入探讨如何在Java中进行这种转换,并提供两种不同的方法。 首先,了解基本...

    java 中文字符串,utf-8编码为byte数组的计算过程

    在Java编程语言中,处理中文字符串时,理解字符与字节之间的转换是非常关键的。本文将深入探讨如何将中文字符串转换成UTF-8编码的字节数组,并解析这一过程中的计算步骤。UTF-8是一种广泛使用的Unicode字符编码,它...

    C#中Byte[]和String之间转换的方法

    在提供的代码示例中,`StrToByte`函数使用`Encoding.GetBytes`将字符串转换为字节数组,而`ByteToStr`函数使用`Encoding.GetString`将字节数组转换回字符串。这两个函数都接受一个`Encoding`对象作为参数,以便指定...

    关于java中的编码转换问题(解决乱码问题)

    在Java中,String类提供了`getBytes()`方法,用于将字符串转换为字节数组,使用默认的平台编码。若需指定编码,可使用`getBytes(String charsetName)`,如`getBytes("UTF-8")`。 三、文件编码转换 Java的`...

    中文乱码问题分析 自己总结的

    在 Java 程序与存储媒介交互时,字符(char)与字节(byte)之间的转换是乱码问题的主要原因。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致。 在 JSP 与页面参数之间的乱码问题中...

    Android字符串和十六进制相互转化出现的中文乱码问题

    这些方法同样适用于处理包含中文字符的情况,但需要注意的是,它们没有处理中文乱码问题,因为它们不涉及字符串与字节之间的转换。 总结起来,处理Android中的中文字符串与十六进制转换时,务必注意字符编码的使用...

    详谈C# 图片与byte[]之间以及byte[]与string之间的转换

    - **byte[]到string的转换**:最常见的方式是将字节数组转换为Base64编码的字符串。Base64是一种用于将二进制数据编码为ASCII字符串的编码方式,适用于在电子邮件等文本环境中传输二进制数据。C#提供了Convert.To...

    java Socket与C#通信中中文乱码问题的解决方案

    总结起来,解决Java Socket与C#通信中中文乱码问题的关键在于: 1. **客户端**:确保使用`getBytes("UTF-8")`将字符串编码为UTF-8字节数组,然后通过Socket发送。 2. **服务器端**:在接收到数据后,使用`Encoding....

    java String 与各种进制字符之间的转换

    - `ByteBuffer`类提供了将字节数组与各种类型(包括整数和字符串)之间转换的功能。例如,`ByteBuffer.wrap(byte[])`可以创建一个缓冲区,然后使用`get()`和`put()`方法读写整数。 6. **HickeyTest.java**: 这个...

    java c++ 通信之间的乱码解决方法

    由于C++可能使用GBK编码,因此在读取数据后,需要将接收到的字节数组转换为`String`时指定GBK编码: ```java DataInputStream in = new DataInputStream(clientSocket.getInputStream()); byte[] buffer = new byte...

Global site tag (gtag.js) - Google Analytics