记一次UTF8中文编码的乱码

1.问题描述

业务需求  1.将某个包含中文的string转换成utf-8对应的byte[]。count作为参数一起传输

2.经网络传递

3.接收传来的byte[]与其他信息

4.解码byte[]

在用utf-8解码byte[]成string时出现了尾部缺失与乱码

2.原因分析

在使用英文与数字的时候,string类型length往往与编码之后的byte[]的length一致。

但utf-8是不定长的,utf-8存储中文时占2~4个字节。

utf-8是根据左侧位1的个数来决定占用了几个字节来决定其编码长度的:

utf-8可以根据字的第一个字节移位推出长度的

0xxxxxxx

110xxxxx 10xxxxxx

1110xxxx 10xxxxxx 10xxxxxx

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

由于本人在解码时直接使用string类型length作为解码时候的count,所以造成了解码时候的不完整与乱码

3.解决办法

将byte[]的length作为count传输即可。

记一次UTF8中文编码的乱码,布布扣,bubuko.com

时间: 2024-10-19 16:36:15

记一次UTF8中文编码的乱码的相关文章

VIM显示utf-8文档乱码解决方法

1.相关基础知识介绍 在Vim中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding和termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱码.因此,每一个Vim用户都应该明确这四个选项的含义.下面,我们详细介绍一下这四个选项的含义和作用. (1)encoding encoding是Vim内部使用的字符编码方式.当我们设置了encoding之后,Vim内部所有的buffer.寄存器.脚本中的字符串等,全都使用这个编码.Vi

Microsoft excel 打开utf-8编码csv乱码问题

<?php /* 其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了. 这次又遇到这个问题了, 在网上一番寻找, 在一篇java的文章里找到了原因, 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流

解決BufferedReader BufferedWrite 读写UTF-8文件中文乱码

解決BufferedReader读取UTF-8文件中文乱码         File rst01 = new File(context.getRealPath("/")+"zljb0.html");         File rst02 = new File(context.getRealPath("/")+"zljb.html"); InputStreamReader isr = new InputStreamReader(

为 Apache 配置 UTF-8 中文编码

为 Apache 配置 UTF-8 中文编码 cat /etc/httpd/conf/httpd.conf | grep -n utf -C2 30-# 31-ServerRoot "/etc/httpd" 32:AddDefaultCharset utf-8 33-IndexOptions +Charset=UTF-8 34:AddCharset UTF-8 .utf8 AddCharset UTF-8 .utf8 添加 UTF-8 编码 AddDefaultCharset utf-

##发送post时,设置了utf-8,中文还是乱码?

发送post时,设置了utf-8,中文还是乱码? 我们用HttpUrlConnection或HttpClient发送了post请求,其中有中文,虽然我们两边都设置了utf-8,但还是乱码? 我们在request和response端应该设置了如下 : request.setCharacterEncoding("utf-8"); post.setHeader("Content-type", "application/json; charset=utf-8&qu

解決BufferedReader读取UTF-8文件中文乱码(转)

读取txt文件乱码 Java代码 BufferedReader read = new BufferedReader(new FileReader(new File(filename))); 解决办法: Java代码 InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8"); BufferedReader read = new BufferedReader(isr); 因为Input

MSVC中C++ UTF8中文编码处理探究

字符编码的问题,上大学那会儿就遇到过,一直都是云里雾里,没太搞清楚.最近又遇到了问题,想在C++的控制台上输出Utf-8编码的汉字字节流.尝试了好多次都是乱码,后来花了些时间查查资料,又和同事交流了一下,算是把C++上对于UTF8编码的处理大概摸清楚了. 字符集 先说一个名词:字符集,没听过的先百度一下,其实就是一种将字符编码的格式,像我们常说的ASCII,UTF8,GBK都是常用的字符集. 首先要清楚,从你在编辑器里输入一个UTF8汉字开始,到最终在控制台上显示出来,整个流程涉及到三个概念,分

理解并解决GBK转UTF-8奇数中文乱码(转)

最近在做一个反馈功能,把数据反馈到对方公司网站,我公司是GBK编码,对方公司是UTF-8编码.因此,我需要将GBK编码数据转换成UTF-8编码数据,这样对方网站才不会乱码.最简单的方法是将HttpClient的ContentCharset设置为utf-8:如果ContentCharset是gbk并且又不想设置为utf-8,那么就需要将数据转换成UTF-8编码再发到对方网站. 问题出现:GBK转UTF-8时,奇数个中文会乱码,偶数个中文不会乱码.三个中文 Java代码   public stati

rapidxml读取utf-8 格式xml乱码问题(utf-8格式转GBK)

1.我是用rapidxml文件读取utf-8格式的xml,但是显示乱码.我们需要把读出来的内容转为GBK格式,则能正常显示. char * utf82gbk(char* strutf) { //utf-8转为Unicode int size = MultiByteToWideChar(CP_UTF8, 0, strutf, -1, NULL, 0); WCHAR   *strUnicode = new   WCHAR[size]; MultiByteToWideChar(CP_UTF8, 0,