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

Java getBytes方法详解(字符集问题)

阅读更多
今天工作中又一次遇到了java字符集问题,这次是由getBytes方法导致的。 
   以前的时候,曾经很多次的解决过java字符集以及乱码的问题,以为对这块很了解了,至到今天的又一次深入的学习,才发现以前的认识当中存在的问题,下次就getBytes方法在应用级别进行比较实际的解释。
   1、Unicode是一种编码规范,是为解决全球字符通用编码而设计的,而rUTF-8,UTF-16等是这种规范的一种实现。
   2、java内部采用Unicode编码规范,也就是支持多语言的,具体采用的UTF-16编码方式。
   3、不管程序过程中用到了gbk,iso8859-1等格式,在存储与传递的过程中实际传递的都是Unicode编码的数据,要想接收到的值不出现乱码,就要保证传过去的时候用的是A编码,接收的时候也用A编码来转换接收。
   4、如果双方的file.encoding确保都相同,那就省事了,都默认转了,但往往在不同项目交互时很多时候是不一致的,这个时候是必须要进行编码转换的。
    5、无论如论转换,java程序的数据都是要先和Unicode做转换,这样也就是能处理多语言字符集的原因了。底层保持了一致,只要在传值和接值的时候也一致就肯定不会出现乱码了。

    6、在看懂以上5点之后,请参考demo示例如下:
         //Demo.java   该java文件编码方式为UTF-8
        
package test;

public class Demo {
public static void main(String args[])throws Exception {
String str = "中文字符";
System.out.println("original string---" + str);// 会正常输出原始串
/**
* str.getBytes();//如果括号中不写charset,则采用的是Sytem.getProperty("file.encoding"),即当前文件的编码方式,
* 很多人写的是系统的默认编码,通过代码测试并非如此,实际得到的是文件的编码方式*

* str.getBytes("charset");//指定charset,即将底层存储的Unicode码解析为charset编码格式的字节数组方式

* String new_str=new String(str.getBytes("utf-8"),"gbk"));
* //将已经解析出来的字节数据转化为gbk编码格式的字符串,在内存中即为gbk格式的字节数组转为Unicode去交互传递
*/
String new_str = new String(str.getBytes("utf-8"), "gbk");
    /**
     * 此时的输出是乱码,在UTF-8的file.encoding下输出gbk格式的数据肯定是乱码,但是new_str的确是gbk编码式的
     * 此时的乱码源于encoding不符,但gbk格式的new_str本身数据并没有问题,通过下面的转换也可以看得出来
     */
System.out.println("new string----" + new_str);
String final_str = new String(new_str.getBytes("gbk"), "utf-8");//此处的含意与最上边的注释是一致的参数含意
/**
*输出是正常的,此时将gbk编码格式的new_str字符串,用gbk这个charset去解析它,然后用utf-8再转码一次,
    因为new_str确实是gbk格式的,才能经过utf-8编码得到正常的数据显示。
*/
System.out.println("final string---"+final_str);
}
}

仅为今天个人学习所得,若有不足,敬请交流
分享到:
评论

相关推荐

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

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

    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中文乱码解决问题

    这是因为在编译 Servlet 类或者 JSP 文件时,如果没有使用 -encoding 参数指定 Java 源程序的编码格式,javac 会获取本地操作系统默认采用的字符集,以该字符集将 Java 源程序转换为 Unicode 编码保存到内存中,然后...

    JAVA中的字符编码操作

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

    Java算法之对字符串的各种处理(二)

    核心思路:输入一个字符串和字节数,输出按字节数截取字符串, 其中要保证汉字不能被截半个字节,设计思路就是判断汉字占几个字节,通过string.valueof.getBytes()方法获取字符的字节数,之后遍历判断不要超过指定的...

    Unicode.java

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

    java解决中文乱码问题

    Java 中文乱码问题的解决方法 1. 使用 UTF-8 编码 在 Java 中,默认的编码方式是 UNICODE,所以用中文也易出问题。常见的解决方法是使用 UTF-8 编码。例如,在 JSP 中,可以加入以下代码: `<%@ page language="...

    Java语言程序设计(第3版)第06章-字符串.pptx

    6.1.1 字符串基本操作 Java语言程序设计(第3版) 问题描述 编写一个方法判断字符串是否是回文串。 public static boolean isPalindrome(String s) 思路:取出字符串的第一个和最后一个比较,若不相同,程序结束,...

    智能识别收货地址Java.pdf

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

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

    同理,DotNET的unicode字节数组转换到JAVA字符串前,要调换高地位字节,之后带Unicode参数转为String,如new String(调换后的字节数组,"Unicode") Java小白琢磨了两天,总算搞出来了,下载的朋友有不懂的可以私信我...

    Java 面试题 word文档

    - 可以使用 Java 的 String 类的 getBytes() 方法和 new String() 构造方法来实现编码转换。 9. Java 中访问数据库的步骤,Statement 和 PreparedStatement 之间的区别。 - 使用 JDBC 访问数据库的步骤包括:加载...

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

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

    Java中文字符所占的字节数

    我们可以通过String类的getBytes(String charsetName)方法来获取到字符串以指定编码方式编码后所得到的字节数组,然后字节数组的长度是该字符串在指定编码方式下所占的字节数。下面为一个测试示例:   ...

    java使用ldap修改ad域用户密码

    mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("userPassword", newPassword.getBytes())); ctx.modifyAttributes(userName, mods); // ... } ``` 在上面的代码中,我们...

    java网络编程示例

    Java 网络编程 说明: 网络编程,分为两种一种是TCP、另一种是UDP方式。我们分别写一下TCP、UDP端的Server和Client简单演示代码。 TCP: Sever import java.io.DataInputStream; import java.io.IOException; ...

    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 面试题 总结

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    国密算法SM4纯java代码实现

    国密算法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...

    解决java中文乱码全集

    解决所有JAVA所出现的乱码问题 1.String fullname=new String(request.getParameter("fullname").getBytes("ISO8859_1"),"gb2312"); 这是对于直接用参数传到下个页面上的java接收

Global site tag (gtag.js) - Google Analytics