Android中文乱码的分析与解决
Android中文乱码解决方法:
在手机与PC之间进行socket或HTTP通讯时,常常会出现中文乱码问题,其主要原因在于手机端字符编码默认为UTF-8,而服务器PC端默认为gbk或gb2312。
手机到PC的信息编码传递、接收、解码显示的过程为:手机端以UTF-8编码信息(包括汉字),写入socket输出流。在写入输出流,或在socket中传递时,或在PC端读取来自手机的Socket流信息时,系统把信息编码进行了一次转换(经编程验证应该是转为GBK),这样在PC端默认以GBK方式解码显示来自手机的信息,出现中文乱码也就不足为奇了。
根据以上分析,要解决PC端显示中文乱码的问题,必须在PC端对接受的手机端信息进行转码,具体过程如下:
1、手机端:
手机端一般可保持默认操作方式即可。当然,执行下述操作也不会产生错误输出:
strSend = new String(strSend.getBytes(), "UTF-8");
该操作是按照(手机)当前操作系统的编码格式获取字符串strSend的编码字节(数组),再转换为UTF-8字符串,进行传递。由于手机端默认使用UTF-8编码,所以该操作实际上是多余的。当然,你也可以将操作中第二个参数改变,转换其它编码格式传递试一下。
2、PC端:
tempstr = new String(mStrMSG.getBytes("GBK"),"UTF-8");或者:
tempstr = new String(mStrMSG.getBytes(),"UTF-8");
PC端的操作就是以默认编码方式(这里为GBK)获取接收到字符串编码字节,再转换为UTF-8格式的字符串显示,以呼应手机端UTF-8的编码格式。
在本例所使用的设备环境下,只有转换为UTF-8才可以正确显示中文,转为其它格式都会出现乱码。其原因应该是手机端编码为UTF-8,PC端则须相应以UTF-8解码。
这里两行语句的不同之处仅在于getBytes()是否带参数,不带参数表示以当前默认编码格式获取字节数组,带参数表示以给出的特定编码格式获取字符串的字节数组。
另外,经实验,PC端所接收的手机端发送来的中文信息,再次传回手机模拟器时不需要转换编码,否则手机端可能会显示乱码。这就出现了下面有趣的操作:
mPrintWriter.println(mStrMSG + new String(" 测试".getBytes("UTF-8")));
其中mStrMSG为从手机端获取的包含汉字的信息,发回手机时不需要转换,而附加的汉字信息" 测试"则需要执行转码操作。而且只能以new String(" 测试".getBytes("UTF-8"))的方式获取UTF-8编码字节数组,并生成UTF-8字符串;如果换成new String(" 测试".getBytes(),"UTF-8")语句,则还是乱码。
以上解决方案的源码下载
从以上分析可以看出,UTF-8和GBK等之间的编码、解码、转换等操作,需要非常小心,否则会出现很多意想不到的错误。而且,上述解决方案也并非完善,如果汉字字数为奇数时,最后一个汉字还会是乱码,或"??"。
究其原因,主要是gbk的汉字编码为2字节;而UTF-8的汉字编码则为3字节。
为了解决奇数个汉字末尾的乱码问题,需要采用从socket输入流直接读取字节再转码的方式:
以下是PC端的部分代码:
......
private InputStream inputStream;
......
while (true) {
//inputStream.available()为输入流中的可读字符个数
while (inputStream.available() > 0) {
strBytes = new byte[inputStream.available()];
inputStream.read(strBytes);
mStrMSG = new String(strBytes,"utf-8");
if (mStrMSG.trim().equals("exit")) {
// 当一个客户端退出时
mClientList.remove(mSocket);
mPrintWriter.close();
mStrMSG = "user:" + this.mSocket.getInetAddress()
+ " exit(total:" + mClientList.size()+")";
mSocket.close();
sendMessage();
//退出当前线程的运行
return;
} else {
mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG;
sendMessage();
}
}
......
手机模拟器端与此类似。
完整代码下载
Android中文乱码的分析与解决相关推荐
- zhs16gbk对应mysql_NLS_LANG 数据库字符集中文乱码问题分析和解决
前言 已经有 3 年多没再关心或者遇到编码格式的问题了,一是离 Oracle 数据库操作远了,二是现在的 Terminal,IDE 和操作系统语言环境配置都很标准,比如清一色的 UTF-8 编码和 U ...
- 服务端返回中文乱码的分析和解决办法
一.介绍 本文介绍了Controller端,返回json的几个写法和遇到的坑,如遇见中文乱码可以按照下面详细情况介绍换一种方式解决你的问题. 二.前提背景 json格式:FastJson Contro ...
- Python3爬虫之中文乱码问题分析与解决方法
前言 分析 解决方法 前言: 今天简单爬取一个网页的源代码时,发现出现了乱码 python代码: import requestsreq = requests.get("http://www. ...
- mysql保存中文乱码的原因和解决办法
当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心. 也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类似 ...
- mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法
(3)MySQL的字符集设置. 这个是重点了,一般都是在这里搞错而出现了mysql乱码. mysql编码设置可以分为三种设置:数据库的编码.表的编码.和字段的编码. a.数据库的编码: 在sqlyog ...
- php 日文中文乱码,phpgd库中文乱码的产生与解决方法详解 || mao的博客
在php jpgraph安装教程之验证php环境是否支持jpgraph安装方法的php教程中我提到了gd库的验证,对于jpgraph中文使用者来说使用 jpgraph时不产生中文乱码是非常必要的,而g ...
- java http 中文乱码_关于java发送http请求时中文乱码的一种解决办法
在jsp中常见的乱码解决办法无外乎是关于get和post两种方式的,但只有切实地在实践中使用时才会注意或者说注重到其他方式.例如,在http请求头中传送中文参数,出现乱码,如何解决? 实际场景:使用S ...
- Fluent UDF 调试时中文乱码问题不优雅解决
Fluent UDF 调试时中文乱码问题不优雅解决 在Fluent 15 版本以上,进行UDF调试时,无论代码是否正确,都会显示有乱码问题.现提出一个较为笨拙的解决方法. Transcript可以将用 ...
- html里显示中文乱码的原因及解决办法
html里显示中文乱码的原因及解决办法 我试着写第一个html文件时候,发现打开保存的html文件后,中文显示的是乱码的.我知道这是字符编码的原因,发现要在开头统一规范下编码格式,通常charset的 ...
最新文章
- HDU1081:To The Max(最大子矩阵,线性DP)
- Away3D 的实体收集器Bug
- C++编译链接的那些小事
- cordova报错:Could not find an installed version of Gradle either in Android Studio, or on your system
- 如何使用Tasklist命令
- DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算
- 关于单利模式的几种实现方式
- .Net Core应用框架Util介绍(一)转
- SecureCRT的下载与使用
- java游戏怎么安装_新手入门--Java游戏与程序安装的两种方式
- 微星主板黑苹果_黑苹果安装教程:准备磁盘+主板BIOS设置——墨涩网
- 数据库索引怎么实现的
- 求最小公倍数的三种方法
- LabVIEW创建Web服务
- 有点厉害!用12万行代码堆出来个蔡徐坤,关键是能跑能跳!
- vue脚手架vue-cli的卸载与安装方式
- MacBook(m1) 通过brew安装PHP环境
- fit函数 model_tensorflow中model.fit()用法
- Katago围棋学习记录(三)
- 淘宝卖家数据分析体系