在url中使用中文其实是一个坏习惯,会带来一系列的转码问题, 我更喜欢英文译名或者id来标识某个uri。但是现实往往是残酷的, 特别是在我们调用别人服务时候,有时候被逼无奈使用中文URL。
Python中unicode转码一向是让人头疼的问题。数次碰壁之后,我也摸出了一些门道, 研读完Python字符串的encode与decode 之后,就自认为找到了万金油,谁知道这次又碰上这个老冤家。
01 |
Traceback (most recent call last): |
02 |
File "<stdin>", line 1, in <module> |
03 |
File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen |
04 |
return _opener.open(url, data, timeout) |
05 |
File "/usr/lib/python2.6/urllib2.py", line 391, in open |
06 |
response = self._open(req, data) |
07 |
File "/usr/lib/python2.6/urllib2.py", line 409, in _open |
09 |
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain |
11 |
File "/usr/lib/python2.6/urllib2.py", line 1170, in http_open |
12 |
return self.do_open(httplib.HTTPConnection, req) |
13 |
File "/usr/lib/python2.6/urllib2.py", line 1142, in do_open |
14 |
h.request(req.get_method(), req.get_selector(), req.data, headers) |
15 |
File "/usr/lib/python2.6/httplib.py", line 914, in request |
16 |
self._send_request(method, url, body, headers) |
17 |
File "/usr/lib/python2.6/httplib.py", line 951, in _send_request |
19 |
File "/usr/lib/python2.6/httplib.py", line 908, in endheaders |
21 |
File "/usr/lib/python2.6/httplib.py", line 780, in _send_output |
23 |
File "/usr/lib/python2.6/httplib.py", line 759, in send |
24 |
self.sock.sendall(str) |
25 |
File "<string>", line 1, in sendall |
26 |
UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-8: ordinal not in range(128) |
这次错误引发是在 urlopen() 引起的,很有特色,开始使用 url.encode('utf-8') 就可以解决了。 今天我做了一些测试。
1. ascii + unicode 测试
03 |
Traceback (most recent call last): |
04 |
File "<stdin>", line 1, in <module> |
05 |
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) |
09 |
Traceback (most recent call last): |
10 |
File "<stdin>", line 1, in <module> |
11 |
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) |
上面的测试说明ascii码和unicode码相连操作,结论是有中文记得带上u,就不会有问题。 Python默认解码器是ascii,无法解码unicode中的中文。
2. urllib2的测试
03 |
>>> urllib2.urlopen(h1) |
04 |
<addinfourl at 153439532 whose fp = <socket._fileobject object at 0xb74e51ac>> |
06 |
>>> urllib2.urlopen(h2) |
07 |
<addinfourl at 153440236 whose fp = <socket._fileobject object at 0x925912c>> |
09 |
>>> urllib2.urlopen(h3) |
10 |
<addinfourl at 153482348 whose fp = <socket._fileobject object at 0x92593ac>> |
12 |
>>> urllib2.urlopen(h4) |
13 |
Traceback (most recent call last): |
14 |
File "<stdin>", line 1, in <module> |
15 |
File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen |
16 |
return _opener.open(url, data, timeout) |
17 |
File "/usr/lib/python2.6/urllib2.py", line 391, in open |
18 |
response = self._open(req, data) |
19 |
File "/usr/lib/python2.6/urllib2.py", line 409, in _open |
21 |
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain |
23 |
File "/usr/lib/python2.6/urllib2.py", line 1170, in http_open |
24 |
return self.do_open(httplib.HTTPConnection, req) |
25 |
File "/usr/lib/python2.6/urllib2.py", line 1142, in do_open |
26 |
h.request(req.get_method(), req.get_selector(), req.data, headers) |
27 |
File "/usr/lib/python2.6/httplib.py", line 914, in request |
28 |
self._send_request(method, url, body, headers) |
29 |
File "/usr/lib/python2.6/httplib.py", line 951, in _send_request |
31 |
File "/usr/lib/python2.6/httplib.py", line 908, in endheaders |
33 |
File "/usr/lib/python2.6/httplib.py", line 780, in _send_output |
35 |
File "/usr/lib/python2.6/httplib.py", line 759, in send |
36 |
self.sock.sendall(str) |
37 |
File "<string>", line 1, in sendall |
38 |
UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-8: ordinal not in range(128) |
这个测试说明, urllib2.urlopen() 可以接受ascii/unicode的英文,也可以接受ascii的中文, 但是一旦是unicode的中文url,就会报转码错误。
so,请尽量英文url,非要用中文,请记得转码。
- Tomcat 中get请求中含有中文字符时乱码的处理
Tomcat 中get请求中含有中文字符时乱码的处理
- url中传递中文参数时的转码与解码
URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8" ...
- Java中读取txt文件中中文字符时,出现乱码的解决办法
这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...
- python匹配某个中文字符
python2.7对中文的支持不好是众所周知的,现在遇到这样一个需求,要匹配某个中文字符.查了一个资料,思路就是转化为unicode进行比较,记录如下: line = '参考答案: A' # gbk ...
- 【python】-- 字符串、字符编码与转码
字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可:访问子字符串,可以使用方括号来截取字符串: var1 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- ctrl c 中文字符到 vnc 里,中文字符已经被转码
为了测试程序对多语言字符的支持情况,我找来一段中文和北欧的文字,希望把这些文字上传到elasticsearch,并能正确显示. 首先测试了北欧文字,一切OK. 但是中文复制到 VNC 客户端(Linu ...
- 小白的Python之路 day2 字符编码和转码
字符编码和转码 详细文章: http://www.cnblogs.com/yuanchenqi/articles/5956943.html http://www.diveintopython3.net ...
- python开发基础之字符编码、文件处理和函数基础
字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...
随机推荐
- react 项目 mock数据
前言 我们都知道在实际的开发阶段,后端接口开发是和前端开发同步进行,甚至迟于前端的进度,这就直就导致前端需要等待后端接口的时间. 这种情况就严重导致前端开发缓慢,那这时候前端的开发人员只能写静态模拟数 ...
- 34.第一次只出现一次的字符(python)
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 两次遍历,第一次存放字 ...
- Python之hashlib模块的使用
hashlib模块主要的作用: 加密保护消息安全,常用的加密算法如MD5,SHA1等. 1.查看可用的算法有哪些 #!/usr/bin/env python # -*- coding: utf-8 - ...
- easyui datagrid 选中行效果
转:http://blog.csdn.net/hzw2312/article/details/27534065 jquery easyui datagrid 获取Checked选择行(勾选行)数据 g ...
- mysql的五大引擎跟优劣之分
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用: MERGE.MEMORY(HEAP).EXAMPLE.ARCHIVE.CSV. · MEMORY存储引擎提供“内存中”表.ME ...
- MessagePack Java Jackson 在不关闭输入流(input stream)的情况下反序列化多变量
com.fasterxml.jackson.databind.ObjectMapper 在读取输入流变量的时候默认的将会关闭输入流. 如果你不希望关闭输入流,你可以设置 JsonParser.Feat ...
- CUDA-F-2-0-CUDA编程模型概述1
Abstract: 本文介绍CUDA编程模型的简要结构,包括写一个简单的可执行的CUDA程序,一个正确的CUDA核函数,以及相应的调整设置内存,线程来正确的运行程序. Keywords: CUDA编程 ...
- bzoj4321
queue2 HYSBZ - 4321 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两 人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方 ...
- reactjs 项目使用 iconfont 小图标以及使用带颜色 inconfont 小图标
在 reactjs 项目中是所有小图标目前主要分为两类使用方式,第一类通过 CSS 引入的方式使用,第二类使用 JS 的方式引入使用. 注册-登录-建立项目-选中图标添加到购物车-添加至项目-下载到本 ...
- Python excel文件操作,编程练习题实例七十五
纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示: { "1":["张三",150,120,100], "2" ...