在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". 一个文件用什么编码方式存储 ...
		 
		
	
随机推荐
	
									- 3 触发器报警-->远程执行命令
			
0.需求 上节课我们讲了,触发器报警,发送邮件,这节课主要讲下远程执行命令 流程图如下 item--> triggers-->action--->Email     |——>远 ...
			 
						- keras中常用的初始化器
			
keras中常用的初始化器有恒值初始化器.正态分布初始化器.均匀分布初始化器 恒值初始化器: keras.initializers.Zeros() keras.initializers.Ones()  ...
			 
						- PHP:函数和语言结构(转)
			
转自:https://www.cnblogs.com/fanqiechaodan/articles/5222366.html 什么是语言结构呢?它和函数有什么不同吗? 1.  什么是语言结构和函数 语 ...
			 
						- jquery blur()函数 语法
			
jquery blur()函数 语法 作用:当元素失去焦点时发生 blur 事件.blur() 函数触发 blur 事件,或者如果设置了 function 参数,该函数也可规定当发生 blur 事件时 ...
			 
						- 灰度图像--图像分割 Sobel算子,Prewitt算子和Scharr算子平滑能力比较
			
学习DIP第47天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://g ...
			 
						- vue 项目安装
			
安装stylus npm install stylus stylus-loader --save-dev
			 
						- php " ",0,'0',false ==判断
			
今天项目中遇到的一个问题,举个栗子: if($_GET['is_has_idcard']==0 || $_GET['is_has_idcard']==1){ echo '这次我要上传身份证'; } i ...
			 
						- JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上
			
JavaWeb-RESTful(一)_RESTful初认识 传送门 JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上 传送门 JavaWeb-RESTful(三)_使 ...
			 
						- 安装指定版本的Ionic或Cordova
			
安装ionic 及 cordova npm install -g cordova ionic更新命令 npm update -g cordova ionic安装特定版本 npm install -g  ...
			 
						- 转 Golang 入门 : 切片(slice)
			
https://www.jianshu.com/p/354fce23b4f0 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概 ...