初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题。既然出现了乱码,那么原因自然是协议不通了。
我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认的布局文件编码标准则是utf-8,这样一来,我们双方通信的时候便难免出现乱码。要解决它,就要从二者转换方面着手。
首先我们知道,从安卓手机界面上获得的文字,其编码字符集是utf-8,所以,当我们的java文件获得它时,它是以utf-8形式编译的。所以这里,在得到EditText中的文字之后,用输出流将其输出,而服务器端再用一个字符串接收从输入缓冲流中获得的一行字符。
// 读取客户端信息
while (true) {
while (is.available() > 0) {
// 转码之前
String msg_client1 = brd.readLine();
System.out.println("转码之前:" + msg_client1);
// 转码
String msg_client = new String(msg_client1.getBytes("gbk"),
"utf-8");
String enter = new String("\r\n".getBytes("utf-8"));
// 转码之后打印出
System.out.println("客户端:" + msg_client);
String msg_server = msg_client1 + enter;
os.write(msg_server.getBytes());
os.flush();
Thread.sleep(1000);
}
}
不用猜,这时由于服务器端的编码标准是GBK,读出来的字符串必然是乱码。于是在下面,我们将得到的字节数组用utf-8的格式编译。于是,期盼已久的汉字终于出来了。
但是有没有发现,当输入偶数个汉字时,得到了正确的结果,而输入奇数个时,最后一个字变成了“??”?
这又是为什么?这里纠结了很久,于是去搜索字符集编码的标准,终于发现了原因。对于gbk这种编码而言,中文所对应的字节数是2byte;而在utf-8中,中文则是对应三个字节。于是在输入奇数个汉字时,最后一个字节在gbk中则无法编译。譬如说utf-8编码的3个字,编码是123|456|789 ,在传输到服务器中时,系统认为这9个字节是gbk编码,于是就变成了12|34|56|78|9。后面多出的一个字节不能够编译成汉字,此时常用“?”来代替。于是最后一个byte变成了“?”(ASCII码为63)。这时再将它转成utf-8时,则变成了123|456|78?。这个时候第三个字也不能正确地读取了,于是出现了上图的结果(两个问号)。
现在,要怎样解决呢?在尝试过各种编码的转换,徘徊于各种各样的乱码之间依然无法解决的时候,突然想到,之前的读取方式是通过bufferedreader一行一行的读取的,这样一来得到的输入流在字符缓冲区的时候,已经破坏了最后一个字节。那么,如果直接得到字节数组而不破坏它,是不是能解决呢?在这里改了一下代码,直接用得到的字节数组构成一个String,然后……
// 读取客户端信息
while (true) {
while (is.available() > 0) {
byte[] bb = new byte[is.available()];
is.read(bb);
// 转码之前
String msg_client1 = new String(bb);
System.out.println("转码之前:" + msg_client1);
// 转码
String enter = new String("\r\n".getBytes("utf-8"));
String msg_client = new String(bb, "utf-8");
System.out.println("客户端:" + msg_client);
//发送
String msg_server = msg_client1 + enter;
os.write(msg_server.getBytes());
os.flush();
Thread.sleep(1000);
}
可以看到,奇数个汉字也能读取啦!(耶!)虽然说这个小问题纠结了很久,但也让自己更了解了编码的奥义,收获还是很大的。
最后,解释一下new String(str.getBytes( "dd "), "cc ")的方法。简单来说,这种方法的用处是,当你的字符串的实际编码是“CC”,而被系统当成“DD”时,用这行代码可以得到正确的编码。
- 大小: 61.5 KB
- 大小: 48.3 KB
分享到:
相关推荐
Android 中文乱码解决,android文本框中读取中文会出现乱码,这里详细的给出了多种完备解决方案。
近正在做一个项目,其中遇到了一个问题是java与.NET之间的通信问题。具体的问题是这样的: 客户端使用java,服务器端使用的是C#。两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端...
android客户端上传数据中文乱码3中解决方案 一种HttpPost两种HTTPURLCONNECTION
Android读取中文文件乱码解决方法,读取本地文件的时候,读取网络资源的时候进行编码
串口通信中文乱码问题解决
ADB中文乱码分析解决
1.解决了在4.0版本上运行crash的问题 2.解决中文乱码问题,发送和接受指定相同的编码即可 Android可收发信息,具体看博客: Android手机通过socket与pc通信 - xiaobijia的专栏 - 博客频道 - CSDN.NET ...
Android客户端发送请求中文乱码问题完美解决 Android客户端发送请求中文乱码问题是指在Android客户端向服务器端提交请求时出现的中文乱码问题,这是由于在HTTP请求中,中文字符被编码为乱码字符所致。为了解决这个...
乱码解决 乱码解决 乱码解决 乱码解决 乱码解决 乱码解决 乱码解决
彻底解决android读取中文txt的乱码(自动判断文档类型并转码).doc
解决android 自带zip解压缩中文乱码的问题,导入zip.jar即可使用(与系统提供的用法相同),大小仅24k
1.zxing框架代码已简化,只保留了核心代码 2.包含zxing的核心包(中文乱码问题已处理) 3.有详细的使用方法 4.有详细的项目集成方法
针对FROM表单传递参数中的中文乱码问题进行分析并提出解决方法
JSP中汉字乱码现象分析与解决.pdf
ZXing 2.1版GBK中文乱码解决办法: zxing中扫瞄二维码图片,如果包含Gbk中文,乱码解决办法是修改DecodedBitStreamParser.h文件,在里面加入GBK的判断。 在2.1版本中,解码的定义不在这个类中了,挪到了...
中文乱码问题分析中文乱码问题分析中文乱码问题分析中文乱码问题分析中文乱码问题分析中文乱码问题分析
使用zxing扫描二维码时会出现中文乱码问题,找很久发现是zxing不支持gbk编码,所以把zxing.jar中的解码类做下修改,现在将修改后的java文件提供给大家。
AndroidThings中文乱码解决Demo,其实就是一个全局字体替换。
敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的...
sqlite数据库存取中文乱码的全部解决方案(包括其它数据库oracle+sqlserver+mysql) 数据库的连接方式、数据库里存放数据的字体编码、所选编程语言的缺省字体编码。如果在编程中遇到不能正确显示中文时、、、、