解决GBK字符转UTF-8乱码问题
gbk转utf-8,奇数中文乱码。
一、乱码的原因
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+3+2+2=24。
3.转换完成
通过以下方法将GBK字符转成UTF-8编码格式的byte【】数组
package test;
import java.io.UnsupportedEncodingException;
public class TestEncoder {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String gbk = "iteye问答频道编码转换问题";
String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
System.out.println(iso);
String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(utf8);
System.out.println(getUTF8StringFromGBKString(gbk));
}
public static String getUTF8StringFromGBKString(String gbkStr) {
try {
return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new InternalError();
}
}
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 void gbk2Utf() throws UnsupportedEncodingException {
String gbk = "我来了";
char[] c = gbk.toCharArray();
byte[] fullByte = new byte[3*c.length];
for (int i=0; i<c.length; i++) {
String binary = Integer.toBinaryString(c[i]);
StringBuffer sb = new StringBuffer();
int len = 16 - binary.length();
//前面补零
for(int j=0; j<len; j++){
sb.append("0");
}
sb.append(binary);
//增加位,达到到24位3个字节
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");
fullByte[i*3] = Integer.valueOf(sb.substring(0, 8), 2).byteValue();//二进制字符串创建整型
fullByte[i*3+1] = Integer.valueOf(sb.substring(8, 16), 2).byteValue();
fullByte[i*3+2] = Integer.valueOf(sb.substring(16, 24), 2).byteValue();
}
//模拟UTF-8编码的网站显示
System.out.println(new String(fullByte,"UTF-8"));
}
文章浏览阅读892次,点赞8次,收藏13次。你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!!(备注:嵌入式)你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!_nb-iot
文章浏览阅读2.6k次。https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.htmlThe functions in this section use a so-called pinhole camera model. In this model, a scene view is formed..._camera calibration and 3d reconstruction
文章浏览阅读123次。Mysql数据库读写分离一、 Mysql数据库安装(此处略过)二、 Mysql主从复制,主服务器为A:192.168.5.31,从服务器为B:192.168.5.321、 主服务器A上操作登陆mysqlMysql –u root –p授权从服务器B同步数据用户mysql> GRANT REPLICATION SLAVE ON *.* to 'slavedb'@'192.16..._数据库 多个进程读写
文章浏览阅读5k次,点赞2次,收藏44次。云编排式物联APP开发平台可通过云端可视化编排开发,边端远程自动化部署,云边协同管理运维的方式,实现物联网APP快速开发,海量边端应用管理。_低代码可视化平台项目理念
文章浏览阅读1.3k次。数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。一般而言,数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的..._数据量级相差较大 归一化
文章浏览阅读335次。为什么写博客?目录为什么写博客?
文章浏览阅读336次。1. 控制台报错:Exception in thread "main" java.io.IOException…… Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(r..._current message type not match with topic accept message types
文章浏览阅读2w次,点赞16次,收藏81次。定义 设nnn阶矩阵AAA满足AAT=ATA=IAA^T=A^TA=IAAT=ATA=I,则称AAA为正交矩阵。定理1 设AAA,BBB是同阶正交矩阵,则:(1) det(A)=±1\det(A)=\pm1det(A)=±1;(2) AT,A−1,A∗A^T,A^{-1},A^*AT,A−1,A∗均为正交矩阵;(3) ABABAB为正交矩阵。定理2 实方阵AAA为正交矩阵⟺\Longleftrightarrow⟺AAA的列/行向量组为标准正交向量组。证明提要:将AAA按列分块,考察ATA=I_正交矩阵的性质
文章浏览阅读3.9k次,点赞8次,收藏7次。这里写自定义目录标题AndroidStudio Layout和Drawable默认打开代码加预览AndroidStudio Layout和Drawable默认打开代码加预览AndroidStudio 3.6之后打开Layout和Drawable默认显示的只有预览页面,而不是代码加预览;选择File | Settings | Editor | Layout Editor可以修改默认显示代码加预览;直接上图:将右边Other Resources改成Split既可以实现代码加预览。效果如下:._android studio layout预览设置
文章浏览阅读347次。其实就是普通的文件操作,不过还是有些地方需要注意。比如: 1.加入sdcard操作权限; 2.确认sdcard的存在; 3.不能直接在非sdcard的根目录创建文件,而是需要先创建目录,再创建文件; 在AndroidManifest.xml添加sdcard操作权限 复制代码
文章浏览阅读150次。3.在事务代码se91中输入对应消息类和消息编号。1.在事务代码st22的报错信息中下载本地文件。4.查看报错信息,根据报错信息取解决问题。2.打开本地文件查看报错信息。
文章浏览阅读1.1k次。我好苦啊,半夜还在打代码。还出bug,狗日的。问题是这样的:我在新建的项目里,建了两个Module: fiora-ec和fiora-core。项目的依赖顺序是这样的,App依赖fiora-ec,fiora-ec又依赖于fiora-core,因为这种依赖关系,所有可以在app和fiora-ec中删除一些不必要的引入,比如这个玩意儿:com.android.support:appcompat-v7:..._为什么as在一个包下建了多个module,缺无法打开了