`

JAVA的getBytes()方法

阅读更多

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同OS下,返回的东西不一样! 

    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和unicode编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1,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"); 
    String s_unicode = new String(b_unicode, "unicode");

     通过打印s_gbk、s_utf8、s_iso88591和unicode,会发现,s_gbk、s_utf8和unicode都是“深”,而只有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.length()方法判断,而需采用String.getBytes().length;而本方法将返回该操作系统默认的编码格式的字节数组。如字符串“Hello!你好!”,在一个中文WindowsXP系统下,结果为12,而在英文的UNIX环境下,结果将为9。因为该方法和平台(编码)相关的。在中文操作系统中,getBytes方法返回的是一个GBK或者GB2312的中文编码的字节数组,其中中文字符,各占两个字节,而在英文平台中,一般的默认编码是"ISO-8859-1",每个字符都只取一个字节(而不管是否非拉丁字符)。所以在这种情况下,应该给其传入字符编码字符串,即String.getBytes("GBK").length。

    附:如下语句在Eclipse中,能正确读取当前JAVA文件的字符编码。

    java.security.PrivilegedAction pa = new GetPropertyAction("file.encoding");
    String csn = (String)AccessController.doPrivileged(pa);   
    System.out.println(csn);

 

分享到:
评论

相关推荐

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

    在本文中,我们学习了Java String类的getBytes()方法,它允许将字符串转换为字节数组,并且可以指定字符编码方式。通过实例和代码演示了使用平台默认字符编码和指定UTF-8、ISO-8859-1字符编码的情况。getBytes()方法...

    Unicode.java

    java 中文转成unicode!!! java unicode转成中文!!!

    智能识别收货地址Java.pdf

    智能识别收货地址Java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; ...

    JAVA中的字符编码操作

    在JAVA源文件–>JAVAC编译–>Class–>Java运行–>getBytes()–>newString()–>显示的过程中,  每一步都有编码的转换过程,这个过程总是存在的,只是有的时候用默认的参数进行。  在编写JAVA源文件的时候要指定...

    java 小程序 课程设计 java

    java坦克大战 课程设计 String str_to=request.getParameter("to"); String str_subject=new String(request.getParameter("subject").getBytes("ISO-8859-1")); String str_content=new String(request....

    java网络编程示例

    buffer = new String("hello").getBytes(); DatagramPacket packet=null; try { packet = new DatagramPacket(buffer, buffer.length,new InetSocketAddress("127.0.0.1", 4444)); DatagramSocket ...

    兼容C# VB.net的TripleDES加解密的java源码

    坑3:Java的字符串转字节数组,getBytes函数无参时默认为utf-8,汉字占三字节,英文字符占1字节;若指定参数为unicode,则转换后前二字节为-2,-1,后两字节为一个字符(高位在前,低位在后);而DotNET转换后,无前...

    C#加密JAVA解密

    C# 加密 JAVA 解密源码 using System; using System.IO; using System.Security.Cryptography; namespace WindowsApplication1 { /// /// Security 的摘要说明。 /// public class Security { const string...

    java实现二维码生成

    import java.awt.Color;  import java.awt.Graphics2D;  import java.awt.image.BufferedImage;  import java.io.File;  import javax.imageio.ImageIO;  import com.swetake.util.Qrcode;  public class ...

    MQTT推送简单例子服务端java代码实现

    2 服务端的publish方法是用来发送的,第一个参数是客户端id clientId,要改成自己在手机客户端设定的名字,前面还有个域,比如mqttClient.publish("tokudu/"+clientId, message.getBytes(), 0, false); 我的clientId...

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

    本文实例讲述了JS实现对中文字符串进行utf-8的Base64编码的方法。分享给大家供大家参考,具体如下: 要进行编码的字符串:“select 用户名 from 用户” 使用JAVA进行编码,Java程序: String sql = select 用户名 ...

    JAVA调用SAP ODATA服务

    String encodeAuth = "Basic " + new String(Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8))); connection.setRequestProperty("Authorization", encodeAuth); 2、POST方法地址; 解决方法...

    java licence生成例子

    java中使用公钥加密私钥解密原理. KeyGenerater类: public class KeyGenerater { private byte[] priKey; private byte[] pubKey; public void generater() { try { KeyPairGenerator keygen = KeyPairGenerator ...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    java URL中文参数乱码处理

    js 中乱码处理法方式 encodeURIComponent(encodeURIComponent(customerAddress...js到java encodeURI(url) String qijuType= new String(request.getParameter( ("qijuType")).getBytes("ISO-8859-1"), "utf-8");

    Java加密和数字签名编程快速入门

    和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法: import java....

    import java.net.*;import java.io.*;

    DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(), InetAddress.getByName("Localhost"),6000); ds.send(dp); ds.close(); } catch(Exception e){} } public static void main(String[] ...

    java语言实现3des加密

    使用java实现了des 和 3des * @param strKey 密钥 * @param result 要解密的数据 * @throws Exception */ public String desDecrypt(String strKey,byte[] result) throws Exception { if(strKey....

    java字符串操作大全

    JAVA字符串的方法 String a = "53c015"; //Integer.parseInt(s, radix) radix设置为10,表示10进制,16表示16进制啦 int i = Integer.parseInt(a, 16); 1、length() 字符串的长度  例:char chars[]={'a','b'.'...

    Java get 提交乱码处理方法

    解决办法  1、在后台获取时采用  String b = new String(request.getParameter("name").getBytes("iso-8859...  在前台处理汉字 java.net.URLEncoder.ecode("中文","GBK");//前面是要处理的中文字符  eg: win

Global site tag (gtag.js) - Google Analytics