一、乱码的原因

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 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;
}
public static String getUTF8StringFromGBKString(String gbkStr) {  try {  return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");  } catch (UnsupportedEncodingException e) {  throw new InternalError();  }
}

参考于: Java 中文字符串编码之GBK转UTF-8

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

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

    转载自:https://www.cnblogs.com/yoyotl/p/5979200.html 一.乱码的原因 gbk的中文编码是一个汉字用[2]个字节表示,例如汉字"内部"的 ...

  2. Java简易转码工具(一个字符串编码是GBK的文本文件,内容转成UTF-8编码)

    import java.io.*; import java.nio.charset.StandardCharsets;/*** 当前项目目录下有一个文本文件note.txt,字符串编码* 是GBK的, ...

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

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

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

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

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

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

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

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

  7. Java笔记-字符串编码与解码以及编码表原理

    编码表 编码表:是一张由字符及其对应编码的表 计算机只能识别二进制数据,早期由电信号演化而来. 为了方便使用计算机,让它可以识别各个国家的文字,就将各个国家的文字用数字来表示,并一一对应,形成一张编码 ...

  8. Java 中文 Unicode 编码转换

    Java作为支持多平台的高级程序设计语言自然要支持多种编码方式才能满足程序设计的需要.但是在处理中文&其他编码之间的转换问题时往往出现各种问题,另程序员大伤脑筋.本文着重阐述了Java中文与U ...

  9. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

最新文章

  1. Round Robin 算法
  2. python学费多少-python培训学费是多少?
  3. SpringBoot中使用@Mapper注解需要哪个包
  4. 阿里云混合云Apsara Stack 2.0发布,加速政企数智创新
  5. chkconfig的用法
  6. 在Linux系统下, 可以用一个命令很容易批量删除.svn的文件夹
  7. 从关系型数据库到非关系数据库
  8. 计算机操作系统的图示,电脑操作系统位数的多种查看方法【图文教程】
  9. FreeSWITCH(二) - 安装部署、试用
  10. BC26 OpenCPU RTC/PSM_EINT API接口
  11. 如何将CAD转换成黑白的PDF文档?
  12. abb机器人goto指令用法_ABB机器人程序指令解读,建议收藏
  13. 7-15 QQ帐户的申请与登陆 (25 分)(Python版)
  14. 7步走!做出高质量的数据分析项目
  15. Python安全攻防-3渗透测试框架
  16. 使用Prometheus+Grafana监控MySQL
  17. Node.js的线程和进程*2014年4月的文章
  18. Mac安装brew 及安装报错的解决办法【已解决】
  19. 编写代码的软件用什么编写的_编写出色的代码
  20. feign调用的重试机制,如何关闭

热门文章

  1. 【云原生之Docker实战】使用Docker部署Rap2开源接口管理工具
  2. struts的中文问题
  3. cs231n作业-assignment1
  4. SQL Server、Oracle 如何清除指定SQL的执行计划
  5. GIT 详细命令介绍
  6. 0402封装尺寸_电子元器件专题:③电容的封装有哪些种类?如何对这些封装选型
  7. 企业物联卡如何充值,几百张卡能同时充值吗?【物联卡中心】
  8. offsetHeight, clientHeight与scrollHeight的区别
  9. 面试常问集锦——分布式系列
  10. 高通平台msm8916修改开机logo【原创】