如何在java中进行编码格式转换:

下面这行代码的含义是: 获取目标字符串str的gbk编码格式的二进制码,然后将二进制码按照utf8编码格式重新编码成字符串,当然,下面这种写法百分百会乱码,因为编码格式不一致.

new String(str.getBytes("gbk"),"utf8")

首先什么情况会乱码:

如果要传输一个字符串,首先要按照一定的编码格式将字符串转换成字节流,当字节流传输到接收方的时候再将字节流按照某种编码格式转换成字符串.乱码也正是产生在重新转换成字符串的过程中.以下是我对中文乱码的测试:

  String str="彩虹";String [] a=new String[] {"gbk","unicode","utf8","gb2312"};for (int i=0;i<a.length;i++){for (int j=0;j<a.length;j++){System.out.println("二进制格式:   "+a[i]+"编码格式:  "+a[j]);System.out.println("编码后的字符串:  "+new String(str.getBytes(a[i]),a[j]));}}
二进制格式:   gbk编码格式:  gbk
编码后的字符串:  彩虹
二进制格式:   gbk编码格式:  unicode
编码后的字符串:  닊뫧
二进制格式:   gbk编码格式:  utf8
编码后的字符串:  �ʺ�
二进制格式:   gbk编码格式:  gb2312
编码后的字符串:  彩虹
二进制格式:   unicode编码格式:  gbk
编码后的字符串:  �_i唝
二进制格式:   unicode编码格式:  unicode
编码后的字符串:  彩虹
二进制格式:   unicode编码格式:  utf8
编码后的字符串:  ��_i�y
二进制格式:   unicode编码格式:  gb2312
编码后的字符串:  ��_i�y
二进制格式:   utf8编码格式:  gbk
编码后的字符串:  褰╄櫣
二进制格式:   utf8编码格式:  unicode
编码后的字符串:  ꧨ馹
二进制格式:   utf8编码格式:  utf8
编码后的字符串:  彩虹
二进制格式:   utf8编码格式:  gb2312
编码后的字符串:  褰╄��
二进制格式:   gb2312编码格式:  gbk
编码后的字符串:  彩虹
二进制格式:   gb2312编码格式:  unicode
编码后的字符串:  닊뫧
二进制格式:   gb2312编码格式:  utf8
编码后的字符串:  �ʺ�
二进制格式:   gb2312编码格式:  gb2312
编码后的字符串:  彩虹

可以看出,如果二进制编码格式和字符串的编码格式不同就会引起乱码.

为什么gbk,gb2312转换没有乱码?

gbk和gb2312之间的转换没有乱码是因为gbk是gb2312的增强版本,支持更多的汉字编码,所以如果二进制编码格式是gbk而解码格式是gb2312,这种情况是有可能出现部分汉字乱码的.

乱码的数据可以转变回来吗?

上述结果中的乱码其实可以大致分为两种,一种是复杂的汉字和图形组合,一种是"?".

如果希望恢复的乱码数据中有问号,那么这条数据恢复的可能性就不大了.因为除了"?"的其他乱码其实都是有自己的编码规则的,只要逆向的解码并按照正确的编码格式重新编码就可以恢复.但是"?"除外,因为当字节流按照某种编码格式重新编译的时候,字节数据中无法按照该编码格式转换成有意义字符的字节都会转换成"?",所以就算逆向的编码成字节流,所有的"?"都会转换成同一字节,也就失去了他本身的意义.

如果乱码中不包含"?",那么还是有希望转换回去的,我以上述乱码中的 "褰╄櫣" 为例重新进行了一次转换,代码如下:

       String str="褰╄櫣";String [] charset=new String[] {"gbk","unicode","utf8","gb2312"};for (int i=0;i<charset.length;i++){for (int j=0;j<charset.length;j++){System.out.println("二进制格式:   "+charset[i]+"编码格式:  "+charset[j]);System.out.println("编码后的字符串:  "+new String(str.getBytes(charset[i]),charset[j]));}}
二进制格式:   gbk编码格式:  gbk
编码后的字符串:  褰╄櫣
二进制格式:   gbk编码格式:  unicode
编码后的字符串:  ꧨ馹
二进制格式:   gbk编码格式:  utf8
编码后的字符串:  彩虹
二进制格式:   gbk编码格式:  gb2312
编码后的字符串:  褰╄��
二进制格式:   unicode编码格式:  gbk
编码后的字符串:  ��0%Dj�
二进制格式:   unicode编码格式:  unicode
编码后的字符串:  褰╄櫣
二进制格式:   unicode编码格式:  utf8
编码后的字符串:  ���0%Dj�
二进制格式:   unicode编码格式:  gb2312
编码后的字符串:  ���0%Dj�
二进制格式:   utf8编码格式:  gbk
编码后的字符串:  瑜扳晞娅�
二进制格式:   utf8编码格式:  unicode
编码后的字符串:  냢閄�
二进制格式:   utf8编码格式:  utf8
编码后的字符串:  褰╄櫣
二进制格式:   utf8编码格式:  gb2312
编码后的字符串:  瑜扳��娅�
二进制格式:   gb2312编码格式:  gbk
编码后的字符串:  褰╄?
二进制格式:   gb2312编码格式:  unicode
编码后的字符串:  ꧨ�
二进制格式:   gb2312编码格式:  utf8
编码后的字符串:  彩�?
二进制格式:   gb2312编码格式:  gb2312
编码后的字符串:  褰╄?

可以看到 其中一种转换方式成功的将乱码转变回了正常的中文汉字

二进制格式:   gbk编码格式:  utf8
编码后的字符串:  彩虹

java编码格式的转换以及乱码恢复相关推荐

  1. 编码转换以及乱码恢复

    ASCII编码 128个字符用7个位表示,计算机最小存储单位是byte,即8位.ASCII最高位是0,剩余7位表示字符.7位刚好表示0-127. 具体表示如下: Ascii 码对美国是够用了,但对别的 ...

  2. Java 字符的 编码 与 乱码 和恢复

    这里写目录标题 常见非Unicode编码 1.ASCII 2.ISO 8859-1 3.Windows-1252 4.GB2312 5.GBK 6.GB18030 7.Big5 8.编码汇总 2.3. ...

  3. java 转换gbk编码,java中GBK转UTF-8乱码的解决方法

    java中GBK转UTF-8乱码的解决方法 如果自己采用的是GBK编码,对方采用得到是UTF-8编码,发送数据时需要将GBK编码数据转换成UTF-8编码数据,这样对方才不会乱码. 问题出现:GBK转U ...

  4. Java视频格式转换---avi转MP4(h264编码格式)

    Java视频格式转换---avi转MP4(h264编码格式的MP4视频在网页播放兼容性更好--试过其它的编码格式,没找到能在网页上直接播放的) 资源借鉴处 需要添加到pom.xml的包 java代码 ...

  5. Linux-Windows主机目录和文件名中文乱码恢复

    目录 Linux->Windows主机目录和文件名中文乱码恢复 声明 一. 乱码问题 二. 调试环境 三. 目录和文件名乱码恢复 3.1 可选方案 3.1.1 通过合适的编解码转换 3.1.2 ...

  6. Linux-Windows主机目录和文件名中文乱码恢复 - clover_toeic - 博客园

    Linux->Windows主机目录和文件名中文乱码恢复 - clover_toeic - 博客园 https://www.cnblogs.com/clover-toeic/p/5235316. ...

  7. 计算机编码基础知识及Java中编码转换

    一.前言 最近项目中用到招商银行的企业直连功能,通过接口的方式直接调用招商银行的前置机(http://www.cmbchina.com/corporate/firmbank/FirmbankInfo. ...

  8. java线程切换 notify_浅谈 Java线程状态转换及控制

    作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...

  9. java http请求 乱码_怎么解决java中的http请求乱码

    怎么解决java中的http请求乱码 发布时间:2020-06-23 20:00:11 来源:亿速云 阅读:90 作者:元一 怎么解决java中的http请求乱码?针对这个问题,今天小编总结了这篇文章 ...

最新文章

  1. 动态检测内存错误利器ASan
  2. 常见的web漏洞及其防范(转)
  3. Cloud Foundry平台中国唯一云供应商,阿里云持续链接Cloud Foundry/Kubernetes生态
  4. 完成了WF工作流持久化和对持久化介质数据的加载, 但是仅仅用持久化,不能够保存工作流当前的执行状态,需要跟踪服务支持,怎样使用Tracing 服务呢?...
  5. SAP 业务常用表的收集
  6. Spring @Autowired 注释
  7. Java怎么避免重复订单_javaEE高并发之如何产生唯一不重复订单号
  8. 网络IO之阻塞、非阻塞、同步、异步总结
  9. java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能
  10. 每日算法系列【LeetCode 1004】最大连续1的个数 III
  11. 190318每日一句
  12. 雷林鹏分享Node.js Buffer(缓冲区)
  13. 刷机-升级到3.80M33的方法
  14. 【CVPR2022】论文阅读:Revisiting Skeleton-based Action Recognition
  15. 快速批量导出excel超链接
  16. LocalDate 获取英文星期
  17. 字体变形html,SVG文字变形动画特效
  18. Elasticsearch之中文分词器插件es-ik的自定义热更新词库
  19. office2016的word打开程序之后显示需要修复问题解决解决
  20. 窗口全屏化得方法大全(5种方法,你都知道吗?)

热门文章

  1. oracle数据库取前几行,Oracle数据库实现获取前几条数据的方法
  2. 入营人数线性增长,录取人数保持稳定,复旦工研院有点抢手
  3. 行列式的计算(c++)——公式法(5阶)和递推法(n阶)
  4. js打开页面自动复制文本到剪贴板_word基本编辑的方法?word基本知识文件操作和文本编辑?...
  5. 东北林业大学计算机考研资料汇总
  6. 华为USB网卡驱动linux,以usb-modeswitch配华为LTE上网卡EC5373在Linux下试图上网的尝试...
  7. 上海大学计算机专业考研好不好考,上海大学计算机考研难不难
  8. TKO 2-2需要考虑周全的贪心问题--田忌赛马
  9. java pdf 转word源码_Java 实现word模板转为pdf
  10. 打开计算机文件夹找不到桌面文件,软件已启动电脑找不到文件怎么办