JAVA中文字符串编码--GBK转UTF-8
转载自: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相关推荐
- Java 中文字符串编码之GBK转UTF-8
一.乱码的原因 gbk的中文编码是一个汉字用[2]个字节表示,例如汉字"内部"的gbk编码16进制的显示为c4 da b2 bf utf-8的中文编码是一个汉字用[3]个字节表示, ...
- (best!)JAVA中文字符编码问题详解
转载自:http://blog.csdn.net/youyue/article/details/4580402 JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应 ...
- java “错误:编码GBK 的不可映射字符”
目录 前言 一.透过现象看本质,发现问题找原因 1.查看cmd的默认编码格式: 2.查看代码文件的保存格式: 二.分析问题原因,寻找解决方案 1.指定DOS命令的编码格式: 2.修改代码文件的编码格式 ...
- JAVA中文字符编码问题详解
JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用中.网上的分析文章和解决方案都很多,但总是针对某些特定情况的.很多次遇到乱码问题后,经过极为辛苦的调试和搜索资 ...
- 【已解决】Java “错误:编码GBK 的不可映射字符”
[已解决]Java "错误:编码GBK 的不可映射字符" 正文 import java.awt.*; import java.awt.datatransfer.Clipboard; ...
- java命令行编译运行遇到java:5: 错误: 编码GBK的不可映射字符 (涓変釜鏋勯?犲嚱鏁?)解决方法
java命令行编译运行遇到java:5: 错误: 编码GBK的不可映射字符 (涓変釜鏋勯?犲嚱鏁?)解决方法 错误原因:使用简单javac 命令编译java文件,如果代码中存在中文,就算是注释有中文的 ...
- 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )
文章目录 一.报错信息 二.解决方案 一.报错信息 使用 javadoc 命令 , 生成 Java 文档 , 报错 ; javadoc Student.java D:\develop\javadoc& ...
- java 中文 音序,java 中文字符串数组按照音序排列
java 中文字符串数组按照音序排列 复制代码 代码如下: public class SortComparator implements Comparator{ public int compare( ...
- Java中文字符串截取,不能返回半个汉字
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/62215914,建议读者阅读原文,确保获得完整的信息 1. ...
最新文章
- php复制mysql文件路径_与php 有关的问题 如何将上传的文件路径 保存到数据库中...
- [Java]jdbc[转]
- C#,silverlight中 将颜色字符串的RRGGBB转换成为颜色
- [HTML] Google IE-x.js 解决IEx与W3C标准的冲突
- linux内核驱动开发 培训,嵌入式Linux驱动开发培训 - 华清远见教育集团官网
- 如何在 Blazor WebAssembly中 使用 功能开关
- Full_of_Boys训练6总结
- JavaFX官方教程(六)之带有JavaFX CSS的花式表单
- JavaScript函数—JavaScript闭包
- Selenium3笔记-WebDriver源码初探
- 左链接和右链接及内链接详解
- Win10驱动数字签名的解决办法
- ipad能不能编写python_【已解决】用ipad编写python代码
- [教程]教你如何制作彩色的3D打印Groot
- 浅析RTB和RTA(一)
- 爱学术,让论文写作不再难!
- 中国联通沃云----弹性云主机使用说明
- 工作处境不好的时候,学会三思(三种思考)
- vue中文本超出省略号
- 充电电流用软件测试准吗,充电设备 篇一:一次不严谨的测试,但估计iPhone用户看了都会买...
热门文章
- SecureCRT的上传下载小技巧(Linux)
- Servlet——简单用户登录实例+http协议解析
- ElasticSearch 2 (21) - 语言处理系列之单词识别
- 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然
- Orange Business Services中国:如何保证实施最佳安全运营中心
- git提交时支持文件名大小写的修改
- 相关Linux命令的学习
- 阿里云华北3超大规模数据中心开服 ECS全系列降价20%
- leetcode 144. Binary Tree Preorder Traversal
- 理科的至尊思想:进制之间的转换