zoukankan      html  css  js  c++  java
  • String.getBytes()和new String()(string与byte[]的转换)

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

    byte[] b_gbk = "中".getBytes("GBK");
    byte[] b_utf8 = "中".getBytes("UTF-8");
    byte[] b_iso88591 = "中".getBytes("ISO8859-1");

    将分别返回“中”这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1。

    而与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")来得到正确的中文汉字“中”。这样就既保证了遵守协 议规定、也支持中文。

    1.string 转 byte[]

    byte[] midbytes=isoString.getBytes("UTF8");
    //为UTF8编码
    byte[] isoret = srt2.getBytes("ISO-8859-1");
    //为ISO-8859-1编码
    其中ISO-8859-1为单字节的编码
    2.byte[]转string
    String isoString = new String(bytes,"ISO-8859-1");
    String srt2=new String(midbytes,"UTF-8");
     
    说明:
    在网络传输或其它应用中常常有同一的中间件,假设为String类型。因此需要把其它类型的数据转换为中间件的类型。
    将字符串进行网络传输时,如socket,需要将其在转换为byte[]类型。这中间如果采用用不同的编码可能会出现未成预料的问题,如乱码。
    下面举个例子:
    我们用socket传输String类型的数据时,常常用UTF-8进行编码,这样比较可以避免一个“中文乱码”的问题。
    发送端:
    String sendString="发送数据";
    byte[] sendBytes= sendString .getBytes("UTF8");
    .......socket发送
    接受端:
    String recString=new String( sendBytes ,"UTF-8");
     
    但是,这里往往又会出现这样一个问题。就是想要发送的数据本身就是byte[]类型的。
    如果将其通过UTF-8编码转换为中间件String类型就会出现问题
    如:
    byte[] bytes = new byte[] { 50, 0, -1, 28, -24 };
    String sendString=new String(  bytes ,"UTF-8");
    byte[] sendBytes= sendString .getBytes("UTF8");
    然后再发送
    接受时进行逆向转换
    String recString=new String( sendBytes ,"UTF-8");
    byte[] Mybytes=isoString.getBytes("UTF8");
    这时Mybytes中的数据将是[50, 0, -17, -65, -67, 28, -17, -65, -67]
     
    因此,需要采用单字节的编码方式进行转换
    String sendString=new String(  bytes ,"UTF-8");   改为       String sendString=new String(  bytes ,"ISO-8859-1" );
    byte[] Mybytes=isoString.getBytes("UTF8");  改为   byte[] Mybytes=isoString.getBytes(  "ISO-8859-1" );
    这样所需要的字节就有恢复了。
  • 相关阅读:
    log4net编译后命名空间找不到的问题
    网络流建模汇总
    零散知识点收集
    CentOS7中“ONBOOT”已设置为“yes”但开机后ens33不会自启动解决方案
    Hanoi塔问题
    Mosquitto用户名密码配置
    Activiti5 数据库表结构
    皮尔森相关系数(Pearson correlation coefficient)
    如何用研发流程搞垮一个团队?
    Java 编程规范
  • 原文地址:https://www.cnblogs.com/jingyunyb/p/3785166.html
Copyright © 2011-2022 走看看