Javaweb返回给Android客户端json中文字符乱码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javaweb返回给Android客户端json中文字符乱码相关的知识,希望对你有一定的参考价值。
hiphotos.baidu.baidu.com/zhidao/wh%3D600%2C800/sign=3ca618c47cf0f736d8ab44073a659f21/fc1f4134970a304eb2dd8e41d5c8a786c8175c89.jpg" esrc="http.com/zhidao/wh%3D450%2C600/sign=0ac82499b71bb0518f71bb2c034af682/9e3df8dcd100baa16eae6f004310b912c9fc2e8e.com/zhidao/wh%3D600%2C800/sign=293da48a4e90f60304e5944109229f23/9e3df8dcd100baa16eae6f004310b912c9fc2e8e.hiphotos://d://h.baidu,android端还是输出乱码.com/zhidao/wh%3D450%2C600/sign=eef311deb719ebc4c02d7e9db716e3ca/fc1f4134970a304eb2dd8e41d5c8a786c8175c89.hiphotos.hiphotos.baidu.jpg" esrc="http.com/zhidao/wh%3D600%2C800/sign=86a55e2cdd33c895a62b907de1235fc8/b2de9c82d158ccbfe5009c811dd8bc3eb03541c8: Android端: 我已经这样设置了.com/zhidao/wh%3D450%2C600/sign=24cacd9877f082022dc7993b7ecbd7db/b2de9c82d158ccbfe5009c811dd8bc3eb03541c8.com/zhidao/pic/item/fc1f4134970a304eb2dd8e41d5c8a786c8175c89://h://h.hiphotos://b.hiphotos.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"> 巴拉拉进化
参考技术A JavaWeb的各种中文乱码终极解决方法:一、Servlet输出乱码
1.
用servlet.getOutStream字节流输出中文,假设要输出的是String
str
="测试中文"。
1.1
若是本地服务器与本地客户端这种就不用说了,直接可以out.write(str.getBytes())可以输出没有问题。因为服务器中用str.getBytes()是采用默认本地的编码,比如GBK。而浏览器也解析时也用本地默认编码,两者是统一的,所以没有问题。
1.1
若服务器输出时用了,
out.write(str.getBytes("utf-8"))。而本地默认编码是GBK时(比例在中国),那么用浏览器打开时就会乱码。因为服务器发送过来的是utf-8的1010数据,而客户端浏览器用了gbk来解码,两者编码不统一,肯定是乱码。当然,你也可以自己将客户端浏览器的编码手工调用下(IE菜单是:查询View->编码encoding->utf-8),但是这种操作很烂,最好由服务器输出响应头告诉,浏览器用哪种编码来解码。所以要在服务器的servlet中,增加response.setHeader("content-type","text/html;charset=utf-8"),当然也可直接用简单的response.setContentType("text/hmtl;charset=utf-8")。两种的操作是一样一样的。
2.
用servlet.getWirter字符流输出中文,假设要输出的是String
str
="测试中文乱码"。
2.1
若写成out.print(str)输出时,客户端浏览器显示的将全是多个?????的字符,代表在编码表中肯定就找不到相应的字符来显示。原因是:servlet.getWriter()得到的字符输出流,默认对字符的输出是采用ISO-8859-1,而ISO-8859-1肯定是不支持中文的。所以肯定要首先要做的第一件事:是要将服务器对象输出字符能支持中文的。其次服务器向客户端写回的响应头要告诉客户端是用了哪种编码表进行编码的。而实现这两个需求,只需要response.setContentType("text/hmtl;charset=utf-8")。就搞定了。特别注意:response.setContentType("text/html;charset=utf-8")要放在PrintOut
out
=
response.getWriter()代码的前面,否则只是有告诉客户端用什么码表编码的功能,而服务器端还是用ISO-8859-1编码了。再特别提示下:在同一Servlet中的doGet或doPost方法中,不能既用response.getOutputStream又用response.getWriter,因为这两种response的响应输出字节流与字符流是冲突的,只能用其一。
二、Servlet文件下载,中文乱码情况。
关键是下载时响应头
content-disposition中attachment;filename=文件名。这个文件名filename不能是含有中文字符串的,要用URLEncoding编码进行编码,才能进行进行http的传输。
三、Servlet的response增加addCookie,cookie中value的中文码问题解决方法。若想将cookie中存放中文的值,必须用Base64编码后,发给客户浏览器端进入存储。而下次客户端浏览访问是带回来的cookie中的值,是经过Base64编码的,所以需要用Base64解码即可。
Base64编码主要是解决将特殊字符进行重新编码,编码成a-b、A-B、0-9、+与/,字符52,10个数字与一个+,一个/
共64个字符。它的原理是将原来3个字节的内容编码成4个字节。主要是取字节的6位后,在前面补00组成一个新的字节。所以这样原来的3个字节共24,被编码成4个字节32位了。
四、获取请求参数乱码
GET方式的乱码:
如<a
href=”/demo5/servlet/RD2?name=中国”>CN</a>,直接用request.getParameter得到的字符串strCN将会乱码,这也是因为GET方式是用http的url传过来的默认用iso-8859-1编码的,所以首先得到的strCn要再用iso-8859-1编码得到原文后,再进行用utf-8(看具体页面的charset是什么utf-8或gbk)进行解码即可。new
String(strCn.getBytes(“ISO-8859-1”),“UTF-8”);
如何从Django数据库中的不同表中获取选定的数据并将json返回给Web客户端
我在view.py中有公司,产品,客户表,而product.id,customer.id是公司类中的forighen键,如何获取所选数据。
比如sql(select * from Company,customer,product where Company.customer_id = customer.id and company.product_id = product.id)并让它返回json,这样在客户端可以得到json数据?
以及如何在Web客户端中使用json数据?
我是Django的新手,你可以帮我解决这个问题吗?
class Company(models.Model):
id = models.IntegerField(blank=True, primary_key=True)
customer_id = models.IntegerField(blank=True, null=True)
product_id = models.IntegerField(blank=True, null=True)
class product(models.Model):
id = models.IntegerField(blank=True, primary_key=True)
name = models.TextField(blank=True, null=True)
class customer(models.Model):
id = models.IntegerField(blank=True, primary_key=True)
name = models.TextField(blank=True, null=True)
首先,您的模型应该在您的django应用程序的models.py文件中。在Django中,使用models.ForeignKey
引用外键字段,https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey在此处记录
您还需要确定哪个模型将引用哪个外键。像公司一样可以拥有许多客户和产品,因此公司将成为产品和客户模型的外键。
在您获取客户详细信息后的视图中,您将使用这样的代码
company = Company.objects.filter(id=1).select_related('customer')
选择相关的文档在这里给出https://docs.djangoproject.com/en/1.11/ref/models/querysets/#select-related
然后,下一步是将company
查询集序列化为json https://docs.djangoproject.com/en/dev/topics/serialization/#serialization-formats-json
以上是关于Javaweb返回给Android客户端json中文字符乱码的主要内容,如果未能解决你的问题,请参考以下文章