`

String.getBytes()和new String()

    博客分类:
  • Java
阅读更多


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

分享到:
评论

相关推荐

    C#加密JAVA解密

    public static string Encode(string data) { byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); ...

    C#中char[]与string之间的转换 string 转换成 Char[]

    C#中char[]与string之间的转换可以通过使用ToCharArray()方法、string类的构造函数、StringBuilder的Append方法和string.Concat方法等方式来实现。同时,我们也可以使用Encoding类来将byte[]转换成string。

    C# string byte数组转换解析.pdf

    newString = newString.Substring(0, newString.Length - 1); } int byteLength = newString.Length / 2; byte[] bytes = new byte[byteLength]; for (int i = 0; i ; i++) { string hex = new String(new ...

    C# char[]与string byte[]与string之间的转换详解

    string str1 = new string(arr); 2、byte[]与string之间的转化 string str = 你好,hello; byte[] bytes; //byte[] 转换成 string bytes = Encoding.UTF8.GetBytes(str); //string 转换成 byte[] (字符串是用哪种...

    C#_string_byte数组转换解析

    newString = newString.Substring(0, newString.Length - 1); } int byteLength = newString.Length / 2; byte[] bytes = new byte[byteLength]; string hex; int j = 0; for (int i = 0; i < newString....

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

    String str3 = new String(buf3,"ISO8859-1");//错误解码 //编码解码4:错误编码正确解码 String str4 = "你好"; byte[] buf4 = str4.getBytes("ISO8859-1");//错误编码 String str4 = new String(buf4,"GBK")...

    IO流的使用,自己的心得

    byte writeStringToBytes[] = writeString.getBytes(); byte temp[] = new byte[tempLength]; //需要几次写入 if(writeStringToBytes.length%tempLength==0) each = writeStringToBytes.length/...

    加密解密类DESEncrypt.cs

    public static string Encrypt(string Text,string sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray; inputByteArray=Encoding.Default.GetBytes...

    Des加密解密C#源码

    Des加密解密C#源码,很实用 byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); byte[] rgbIV = Encoding.ASCII.GetBytes(kesVector);... return Convert.ToBase64String(mStream.ToArray());

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

    byte[] returnBytes = new byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } ``` ###...

    java 小程序 课程设计 java

    String(request.getParameter("subject").getBytes("ISO-8859-1")); String str_content=new String(request.getParameter("content").getBytes("ISO-8859-1")); Properties props=new Properties(); props.put(...

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

    String plainText = new String(decodedBytes); // 将解码后的字节转换回字符串 System.out.println("明文: " + plainText); } } ``` 接下来,我们讨论Base64加密成Java密文的过程。这里的“加密”可能指的是...

    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 = ...

    C#加密解密的函数参考

    if (string.IsNullOrEmpty(targetValue)) { return string.Empty; } var returnValue = new StringBuilder(); var des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.Default....

    Struts Updownload 源码

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

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

    ByteArrayOutputStream baos = new ByteArrayOutputStream(hexString.length() / 2); for (int i = 0; i < hexString.length(); i += 2) { baos.write((hexString.indexOf(hexString.charAt(i)) | hexString....

    AES加密工具类

    IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes()); SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); ...

    string-encrypt.zip_EncryptString_string encrypt

    string hashString = BitConverter.ToString(hashBytes).Replace("-", ""); ``` 在实际应用中,我们通常会结合这些加密技术,如使用RSA加密AES的密钥,再用AES加密大量数据,以提高安全性。此外,还需要注意密钥...

    c#和java通用DES加密.docx

    return new String(decryptedBytes, "UTF8"); } } ``` 这个Java类同样包含两个静态方法:`encrypt`用于加密,`decrypt`用于解密。与C#版本类似,我们使用ASCII编码获取前8个字节作为密钥和IV,并且使用Base64编码...

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

    System.err.println("私钥签名——公钥验证签名"); // 产生签名 String sign = CertificateUtils.signToBase... String outputStr = new String(decrypt,"utf-8"); System.out.println("解密后:" + outputStr);

Global site tag (gtag.js) - Google Analytics