转载自:https://www.cnblogs.com/yoyotl/p/5979200.html

一、乱码的原因

gbk的中文编码是一个汉字用【2】个字节表示,例如汉字“内部”的gbk编码16进制的显示为c4 da b2 bf

utf-8的中文编码是一个汉字用【3】个字节表示,例如汉字“内部”的utf-8编码16进制的显示为e5 86 85 e9 83 a8

很显然,gbk是无法直接转换成utf-8,少字节变为多字节,谁知道缺少的字节是什么啊?!

转换的办法

有办法实现“有损”转换吗?答案是肯定的。

1.首先将gbk字符串getBytes()得到两个原始字节,转换成二进制字符流,共16位。

2.根据UTF-8的汉字编码规则,首字节以1110开头,次字节以10开头,第3字节以10开头。在原始的2进制字符串中插入标志位。最终的长度从16--->16+4+2+2=24。

3.转换完成,实际情况需要考虑更多因素,例如字符串是汉字和数字的混合体,需要识别处理数字。

public void entityTest(){    try {        byte[] str = "支持™".getBytes("gbk");        String gbkStr = new String(str, "gbk");        System.out.println(new String(getUTF8BytesFromGBKString(gbkStr),"UTF-8"));    } catch (UnsupportedEncodingException e) {        e.printStackTrace();    }}

public static byte[] getUTF8BytesFromGBKString(String gbkStr) {    int n = gbkStr.length();    byte[] utfBytes = new byte[3 * n];    int k = 0;    for (int i = 0; i < n; i++) {        int m = gbkStr.charAt(i);        if (m < 128 && m >= 0) {            utfBytes[k++] = (byte) m;            continue;        }        utfBytes[k++] = (byte) (0xe0 | (m >> 12));        utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));        utfBytes[k++] = (byte) (0x80 | (m & 0x3f));    }    if (k < utfBytes.length) {        byte[] tmp = new byte[k];        System.arraycopy(utfBytes, 0, tmp, 0, k);        return tmp;    }    return utfBytes;}

但在这里还是有个问题是"支持™"字符串中"™"的字符由于在GBK中不存在,那么在byte[] str = "支持™".getBytes("gbk");的时候"™"字符就已经乱码了,最后导致转码也乱码。GBK还有很多不支持的特殊字符。

GBK字符编码表:https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php

转载于:https://www.cnblogs.com/EmilZs/p/10985792.html

JAVA中文字符串编码--GBK转UTF-8相关推荐

  1. Java 中文字符串编码之GBK转UTF-8

    一.乱码的原因 gbk的中文编码是一个汉字用[2]个字节表示,例如汉字"内部"的gbk编码16进制的显示为c4 da b2 bf utf-8的中文编码是一个汉字用[3]个字节表示, ...

  2. (best!)JAVA中文字符编码问题详解

    转载自:http://blog.csdn.net/youyue/article/details/4580402 JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应 ...

  3. java “错误:编码GBK 的不可映射字符”

    目录 前言 一.透过现象看本质,发现问题找原因 1.查看cmd的默认编码格式: 2.查看代码文件的保存格式: 二.分析问题原因,寻找解决方案 1.指定DOS命令的编码格式: 2.修改代码文件的编码格式 ...

  4. JAVA中文字符编码问题详解

    JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用中.网上的分析文章和解决方案都很多,但总是针对某些特定情况的.很多次遇到乱码问题后,经过极为辛苦的调试和搜索资 ...

  5. 【已解决】Java “错误:编码GBK 的不可映射字符”

    [已解决]Java "错误:编码GBK 的不可映射字符" 正文 import java.awt.*; import java.awt.datatransfer.Clipboard; ...

  6. java命令行编译运行遇到java:5: 错误: 编码GBK的不可映射字符 (涓変釜鏋勯?犲嚱鏁?)解决方法

    java命令行编译运行遇到java:5: 错误: 编码GBK的不可映射字符 (涓変釜鏋勯?犲嚱鏁?)解决方法 错误原因:使用简单javac 命令编译java文件,如果代码中存在中文,就算是注释有中文的 ...

  7. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 javadoc 命令 , 生成 Java 文档 , 报错 ; javadoc Student.java D:\develop\javadoc& ...

  8. java 中文 音序,java 中文字符串数组按照音序排列

    java 中文字符串数组按照音序排列 复制代码 代码如下: public class SortComparator implements Comparator{ public int compare( ...

  9. Java中文字符串截取,不能返回半个汉字

    转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/62215914,建议读者阅读原文,确保获得完整的信息 1. ...

最新文章

  1. php复制mysql文件路径_与php 有关的问题 如何将上传的文件路径 保存到数据库中...
  2. [Java]jdbc[转]
  3. C#,silverlight中 将颜色字符串的RRGGBB转换成为颜色
  4. [HTML] Google IE-x.js 解决IEx与W3C标准的冲突
  5. linux内核驱动开发 培训,嵌入式Linux驱动开发培训 - 华清远见教育集团官网
  6. 如何在 Blazor WebAssembly中 使用 功能开关
  7. Full_of_Boys训练6总结
  8. JavaFX官方教程(六)之带有JavaFX CSS的花式表单
  9. JavaScript函数—JavaScript闭包
  10. Selenium3笔记-WebDriver源码初探
  11. 左链接和右链接及内链接详解
  12. Win10驱动数字签名的解决办法
  13. ipad能不能编写python_【已解决】用ipad编写python代码
  14. [教程]教你如何制作彩色的3D打印Groot
  15. 浅析RTB和RTA(一)
  16. 爱学术,让论文写作不再难!
  17. 中国联通沃云----弹性云主机使用说明
  18. 工作处境不好的时候,学会三思(三种思考)
  19. vue中文本超出省略号
  20. 充电电流用软件测试准吗,充电设备 篇一:一次不严谨的测试,但估计iPhone用户看了都会买...

热门文章

  1. SecureCRT的上传下载小技巧(Linux)
  2. Servlet——简单用户登录实例+http协议解析
  3. ElasticSearch 2 (21) - 语言处理系列之单词识别
  4. 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然
  5. Orange Business Services中国:如何保证实施最佳安全运营中心
  6. git提交时支持文件名大小写的修改
  7. 相关Linux命令的学习
  8. 阿里云华北3超大规模数据中心开服 ECS全系列降价20%
  9. leetcode 144. Binary Tree Preorder Traversal
  10. 理科的至尊思想:进制之间的转换