今天工作中又一次遇到了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);

}

}

仅为今天个人学习所得,若有不足,敬请交流

转载于:https://www.cnblogs.com/asher/p/3307334.html

Java getBytes字符集问题相关推荐

  1. JAVA中字符集详解

    java虚拟机默认的编码是unicode指的是内存中的编码是unicode,而进行io(包括网络和硬盘)传输时另外编码,通过 System.getProperty("file.encodin ...

  2. java 默认字符集 iso_第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及......

    1.函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为: 1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetNam ...

  3. Java正则表达式--字符集范围:并集、交集和差集

    Java正则表达式教程: http://www.java3z.com/cwbwebhome/article/article8/Regex/Java.Regex.Tutorial.html 其中第三章中 ...

  4. java getbytes 长度_JAVA中的getBytes()方法

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

  5. java转换字符集_Java字符集转换解释

    Iso8859-1是西方国家频繁使用的字符编码格式.用iso8859-1编码unicode码中的东方字库部分的字符时统统编码成??,也就是说:用iso8859-1编码unicode码时信息会有损失.但 ...

  6. 6.JAVA NIO 字符集

    第六章 字符集 我们生活在一个变化莫测的世界中.甚至在这个我们称之为地球的平凡的 M 级行星 上,我们也使用数百种不同的语言.在<The Hitchhikers Guide to the Gal ...

  7. java 默认字符集 iso_当服务器的默认字符集是UTF-8时,Perl并使用ISO-8859-1字符集...

    我的网络服务器是Apache,它的默认字符集是UTF-8 . 我有一个简单的HTML页面(没有与charset相关的元标记),它有一个超链接 . Ällä 我还有一个CGI / Perl脚本 . 我想 ...

  8. Java面试宝典,java指定字符集

    第一个:Alibaba[搜索推荐] 一面:算法题:长度为n的数组里放了n+1个大小在[1,n]的数,必然至少有一个重复的数,找出来 二面:概率题:求一根绳子被切两刀能组成一个三角形的概率. 三面主管面 ...

  9. Java字符串:getBytes() 方法

    Java getBytes() 方法 getBytes() 方法有两种形式: getBytes(String charsetName): 使用指定的字符集将字符串编码为 byte 序列,并将结果存储到 ...

最新文章

  1. linux 别名管理,Linux 的 15 个命令行别名, 帮系统管理员提升工作效率!
  2. 如何优化Spring Cloud微服务注册中心架构?
  3. sample,batch和epoch都是啥意思??
  4. Hadoop文件系统常用命令
  5. Boosted Tree:一篇很有见识的文章
  6. hazelcast集群配置_使用HazelCast进行Hibernate缓存:基本配置
  7. mipi 调试经验【转】
  8. 创新高!韩国反垄断部门重罚高通8.54亿美元
  9. 仓储“云服务”初创公司 Clutter获得 6500 万美元 C 轮融资
  10. 软硬负载之间的对比及优缺点
  11. 目标检测的模型集成方法及实验
  12. JAVA前后端分离项目脚手架
  13. 漫漫人生录 | 小圈子 | 别让自己“墙”了自己
  14. 数字验证码识别完成自动化登录
  15. 六种c++计时器函数(秒级到微妙级)
  16. JavaScript编程实用方法参考
  17. 基于SOCAT工具的UDP消息通信
  18. R语言|冗余分析(RDA)到底如何应用?如何在R语言中实现?
  19. 如何用企业微信、飞书等扫码登录 Office 365
  20. mybatis逆向工程使用的建议

热门文章

  1. ActiveMQ(li)
  2. [置顶]一步步构建大型网站架构
  3. 转:Flash 插件面板 DragonBonesDesignPanel 的绿色安装方法
  4. 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(一)
  5. C#Winform+WindowsAPI做个剪贴板无缝自动保存器(视频截图利器)
  6. 编程珠玑:对DAO层的一点修改
  7. ThinkPad -- Intel 无线网卡网络连接方法限制及无法用 Fn + F5 控制的问题
  8. 如何使用Create-React-App和自定义服务人员构建PWA
  9. 干货,Wireshark使用技巧-过滤规则
  10. redis最大储存512m_redis系列篇01