原理:

已unicode为中介
utf-8 ——》unicode——》gbk
gbk ——》unicode——》utf-8

知识点:

1、 unicode是一种“编码”,
所谓编码就是一个编号(数字)到字符的一种映射关系,
就仅仅是一种一对一的映射而已,
可以理解成一个很大的对应表格。
2、 GBK、UTF-8是一种“编码格式”,
是用来序列化或存储1中提到的那个“编号(数字)”的一种“格式”;
GBK和UTF-8都是用来序列化或存储unicode编码的数据的,
但是分别是2种不同的格式;
他们俩除了格式不一样之外,
他们所关心的unicode编码范围也不一样,
utf-8考虑了很多种不同国家的字符,
涵盖整个unicode码表,
所以其存储一个字符的编码的时候,
使用的字节长度也从1字节到4字节不等;
而GBK只考虑中文——在unicode中的一小部分——的字符的编码,
所以它算好了只要2个字节就能涵盖到绝大多数常用中文(2个字节能表示6w多种字符),
所以它存储一个字符的时候,
所用的字节长度是固定的;

链接:https://www.zhihu.com/question/20361462/answer/14899233

正确代码

方法1:

//utf-8转gbk
String clientStr = new String(str.getBytes("GBK"), "GBK");
//gbk转utf-8
String clientStr = new String(str.getBytes("UTF-8"), "UTF-8");

方法2:

/**
* gbk与utf-8互转
* 利用BASE64Encoder/BASE64Decoder实现互转
* @param str
* @return
*/
private String charsetConvert(String str, String charset) {try {str = new sun.misc.BASE64Encoder().encode(str.getBytes(charset));byte[] bytes = new sun.misc.BASE64Decoder().decodeBuffer(str);str = new String(bytes, charset);} catch(IOException e) {e.printStackTrace();}return str;
}

错误代码

    /*** gbk转utf-8* @param str* @return*/public static String gbkToUtf8(String str) {String utf8Str = "";try {String UnicodeStr = gbkToUnicode(str);utf8Str = unicodeToUtf8(UnicodeStr);} catch (Exception e) {LogUtil.info("gbk转utf-8 异常,原字符串返回!");utf8Str = str;}return utf8Str;}
/*** utf-8转gbk,实际测试中发现有部分汉字转换不了* @param str* @return*/public static String utf8ToGbk(String str) {String gbkStr = "";try {String UnicodeStr = utf8ToUnicode(str);gbkStr = unicodeToGbk(UnicodeStr);} catch (Exception e) {LogUtil.info("utf-8 转 gbk异常,原字符串返回!");gbkStr = str;}return gbkStr;}

上面utf-8转gbk,实际测试中发现有部分汉字转换不了

/*** gbk转unicode* @param str* @return*/public static String gbkToUnicode(String str) {StringBuffer result = new StringBuffer();for (int i = 0; i < str.length(); i++) {char chr1 = (char) str.charAt(i);if ((chr1 & (0x00FF)) == chr1) {result.append(chr1);continue;}result.append("\\u" + Integer.toHexString((int) chr1));}return result.toString();}
/*** unicode转gbk* @param dataStr* @return*/public static String unicodeToGbk(String dataStr) {int index = 0;StringBuffer buffer = new StringBuffer();int li_len = dataStr.length();while (index < li_len) {if (index >= li_len - 1|| !"\\u".equals(dataStr.substring(index, index + 2))) {buffer.append(dataStr.charAt(index));index++;continue;}String charStr = "";charStr = dataStr.substring(index + 2, index + 6);char letter = (char) Integer.parseInt(charStr, 16);buffer.append(letter);index += 6;}return buffer.toString();}
/*** utf-8转unicode* @param inStr* @return*/public static String utf8ToUnicode(String inStr) {char[] myBuffer = inStr.toCharArray();StringBuffer sb = new StringBuffer();for (int i = 0; i < inStr.length(); i++) {UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]);if (ub == UnicodeBlock.BASIC_LATIN) {sb.append(myBuffer[i]);} else if (ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {int j = (int) myBuffer[i] - 65248;sb.append((char) j);} else {short s = (short) myBuffer[i];String hexS = Integer.toHexString(s);String unicode = "\\u" + hexS;sb.append(unicode.toLowerCase());}}return sb.toString();}
/*** unicode转utf-8* @param theString* @return*/public static String unicodeToUtf8(String theString) {char aChar;int len = theString.length();StringBuffer outBuffer = new StringBuffer(len);for (int x = 0; x < len;) {aChar = theString.charAt(x++);if (aChar == '\\') {aChar = theString.charAt(x++);if (aChar == 'u') {int value = 0;for (int i = 0; i < 4; i++) {aChar = theString.charAt(x++);switch (aChar) {case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':value = (value << 4) + aChar - '0';break;case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value = (value << 4) + 10 + aChar - 'a';break;case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':value = (value << 4) + 10 + aChar - 'A';break;default:throw new IllegalArgumentException("Malformed   \\uxxxx   encoding.");}}outBuffer.append((char) value);} else {if (aChar == 't')aChar = '\t';else if (aChar == 'r')aChar = '\r';else if (aChar == 'n')aChar = '\n';else if (aChar == 'f')aChar = '\f';outBuffer.append(aChar);}} elseoutBuffer.append(aChar);}return outBuffer.toString();}

参照:原博客

java utf-8 转 gbk / gbk 转 utf-8相关推荐

  1. java编译报错提示编码gbk的不可映射字符啥意思_解决java编译错误:编码GBK的不可映射字符...

    [我的Android进阶之旅]解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符 1.问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责L ...

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

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

  3. Big5 = GBK GBK = Big5 GB2312 = GBK GBK = GB2312 互转

    本文将介绍四个转换函数分别实现如下的转换: Big5 => GBK GBK => Big5 GB2312 => GBK GBK => GB2312 有关 GB2312 =〉BI ...

  4. js实现gbk编码转utf字符串

    一.安卓iconv-lite npm i iconv-lite 二.使用 const iconv = require('iconv-lite'); let str = iconv.decode(gbk ...

  5. java unicode gbk_java unicode转GBK

    我们经常会遇到编码问题.Java号称国际化的语言,是因为它的class文件采用UTF-8,而JVM运行时使用UTF-16(至于为什么JVM中要采用UTF-16,我没看过 相关的资料,但我猜可能是因为J ...

  6. 【JAVA编码专题】UNICODE,GBK,UTF-8区别

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  7. JAVA错误日志(part1)--编码GBK的不可映射字符

    学习笔记,仅供参考 错误 当Java源代码中包含中文字符时,我们在用javac编译时可能出现错误: 错误: 编码GBK的不可映射字符 错误原因 由于JDK是国际版的,我们在用javac编译时,编译程序 ...

  8. java转码gbk_Java实现GBK转码到UTF-8(文件)

    packagecom.zjx.file;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;im ...

  9. 【Java】解决 java:错误:编码GBK的不可映射字符

    #错误描述: 1.Java代码: public class Main {public static void main(String[] args) {System.out.println(" ...

最新文章

  1. 教您如何查看MySQL用户权限
  2. C++中内存分配、函数调用和返回值问题
  3. 解决Mac上adb: command not found问题
  4. java加载并运行虚拟机_《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?...
  5. [你必须知道的.NET]第二十四回:认识元数据和IL(上)
  6. HTML5有哪些表单新特性
  7. linux启动找不到,pxe启动的时候找不到pxelinux.0的原因
  8. Windows 上好用的7款下载工具
  9. I-Deas TMG 培训资料 (7)
  10. 数据仓库系列文章二:浅谈企业数据仓库总线矩阵
  11. 2020-12-24《重学操作系统——上》林䭽 前阿里巴巴高级技术专家(P8)
  12. 转自一个计算机毕业生的求职经验
  13. 土壤微生物多样性分析
  14. 双重差分模型能做固定效应吗_Stata:双重差分的固定效应模型 (DID)
  15. 高数考研归纳 - 微分学 - 中值定理
  16. 汇编语言(王爽第三版) 实验5
  17. 浅析:OMS和ERP、WMS、TMS之间的关系?
  18. 精益之美甚于帕斯雀(摘自《代码之道》第2章)
  19. CSS 3D转换和动画
  20. 基于51单片机智能家居家电继电器开关插座定时WiFi无线proteus仿真原理图PCB

热门文章

  1. MongoDB之副本集配置
  2. 瞎想-电信IPTV如何做到真高清真4K直播
  3. 第三部分:成交动力学之成交激素(二)——2、独特
  4. python爬虫数据挖掘_Python网页爬虫文本处理科学计算机器学习数据挖掘兵器谱...
  5. 广告投放方案-精准广告投放方案应该怎么做?
  6. 分式化简结果要求_分式约分的结果是()
  7. 南京理工计算机硕士就业,南京理工大学好就业吗?附南京理工大学就业率最高的专业名单...
  8. 在ts文件中使用require报错解决
  9. 不用修改注册表和组策略也能在 Win11 报名教师资格证
  10. ZCMU 1411 喜闻乐见的a+b