解决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"));
}
文章浏览阅读5.3k次。先来看下gradle依赖的几种常见的关键词新配置 已弃用配置 行为 本Module 上层Module implementation compile 依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。 对于大型多项目构建,使用implementation而不是api/compile可以显著缩短构建时间,因为它可以减少构建系统需要重新..._安卓aar不能层层传递
文章浏览阅读7.2w次,点赞113次,收藏490次。深度学习中神经网络的几种权重初始化方法 在深度学习中,神经网络的权重初始化方法对(weight initialization)对模型的收敛速度和性能有着至关重要的影响。说白了,神经网络其实就是对权重参数w的不停迭代更新,以期达到较好的性能。在深度神经网络中,随着层数的增多,我们在梯度下降的过程中,极易出现梯度消失..._神经网络权重初始化方法
文章浏览阅读842次。1、设置字体:点击Option -> Document Option->Screen Font 然后进行设置 填上Yes;2、为Source Insight 添加Makefile,kconfig,汇编文件的支持:添加makefile:打开Source Insight,在新建工程之前,进入Options -> Document Options-> 点击Document Type的下拉_source insight 搜所变成蓝色
文章浏览阅读5.4k次。配置springmvc的时候总是报这个错误:Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.web.servlet.view.json.MappingJacksonJsonView] for bean with nam..._nested exception is java.lang.classnotfoundexception: org.springframework.we
文章浏览阅读53次。前言:一、为什么要用Rsync+sersync架构?1、sersync是基于Inotify开发的,类似于Inotify-tools的工具2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。二、Rsync+Inotify-tools与Rsync+sersy...
文章浏览阅读927次。BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer的预训练语言表示模型,通过在大量文本数据上进行预训练,可以捕捉到丰富的语言知识。BERT-base-chinese是BERT模型的一个变体,专门针对中文文本进行了预训练。_bert-base-chinese
文章浏览阅读4k次,点赞2次,收藏8次。定义了业务比特能噪比Eb/N0,用于在业务比特级进行接收性能(功率效率)的衡量。实际上因为业务比特级的能量是无法测量的,Eb/N0必须通过实测的S/N进行推算。以上各参量的参考点如下图所示。Ec就是导频专用,Eb就是业务信道专用1 各种符号1.1 信号符号1. C :载波功率2. Ec:码片的能量3. Eb:业务信道上的比特能量,在95与1x上与Ec的关系为Eb=Ec+W/_c/i和c/n
文章浏览阅读1.1k次,点赞2次,收藏3次。条件条件语句 - ifpublic class Test { public static void main(String[] args) { int a = 100; if(a==100) { System.out.println("a的值是 100"); } }}public class Test {
文章浏览阅读1.1w次,点赞15次,收藏21次。我们可以用if (event->button() == Qt::LeftButton){TODO:}来判断鼠标那个键按下,但是在mouseMoveEvent函数中,event->button()总是返回NoButton,这让这个判断完全失去了意义,经查找,发现大家都是用这个if (event->buttons() & Qt::LeftButton){TODO_if(event->button()&qt::leftbutton)
文章浏览阅读423次。package 机制package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。对于 package 机制的说明,其实官方文档已经有非常详尽的论述了,本文并不着眼于此。简单来说,一个目录下如果包含 __init__.py ,则被 Python 视作一个 Python p..._python中from utils啥意思
文章浏览阅读8.5k次,点赞3次,收藏12次。在开发外挂中,其实有很多厉害的插件可以供我们使用,不再自己再去额外的写复杂的代码,类似的插件很多,比如:天使插件、DD、大漠等,各个插件都有比较擅长的功能,有些小众的插件更是给力,因为可以过NP。1.准备大漠的Dll动态链接库(里面包含了类文件)名字为:dm(mat).dll,把dm(mat).dll复制到工程的代码目录和运行目录Debug 2.添加Lib类方法:对着解决方案名..._怎么看注册大漠成功
文章浏览阅读1.9k次。作者:王勐链接:https://www.zhihu.com/question/23995189/answer/35429905来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。动态规划的本质不在于是递推或是递归,也不需要纠结是不是内存换时间。理解动态规划并不需要数学公式介入,只是完全解释清楚需要点篇幅…首先需要明白哪些问题不是动态规划可以解决_动态规划研究意义