POST数据中的土耳其字符问题
我有两个应用程序,它们分别运行在不同的服务器上,使用不同的数据库。我需要把一些数据从一个应用程序发送到另一个,所以我使用了POST方法。我把相关的信息拼接成一个字符串,然后进行POST操作……
26AU223/AHMET DEMİROĞLU/18439586958/0//2000-07-31/2000-06-11/42.00/0
对于土耳其字符,我尝试使用
var1 = '26AU223/AHMET DEMİROĞLU/18439586958/0//2000-07-31/2000-06-11/42.00/0'
var1.encode('iso8859_9')
但是当我在第二个应用程序接收到这些数据并进行解码时,我发现土耳其字符无法正确解码,所以我的结果是:
26AU223/AHMET DEM�O�U/18439586958/0//2011-07-31/2008-06-11/42.00/0
所以İ和Ğ造成了问题,紧接着的首字母R和L也解码错误。
我尝试了不同的土耳其编码参数,也尝试直接POST数据而不进行编码/解码(两个应用程序都使用UTF-8),但我仍然遇到了类似的编码错误,出现了奇怪的�,而不是İR和ĞL。
3 个回答
1
你在远程那边收到了一个Unicode字符串对象吗?如果是这样的话,你的问题在于读取HTTP消息内容的代码假设了错误的字符集。你需要把HTTP请求的Content-Type头设置为'text/plain;charset=ISO-8859-9'。
1
在Python 2.x中,这显然是错误的:
var1 = '26AU223/AHMET DEMİROĞLU/18439586958/0//2000-07-31/2000-06-11/42.00/0'
var1.encode('iso8859_9')
Python 2有一个设计上的缺陷,它允许你对字节字符串(str
类型)使用.encode()
。你必须先有一个Unicode字符串,然后再对它进行编码,才能发送POST请求。而且,使用UTF-8以外的编码方式是不合理的。
var1 = u'26AU223/AHMET DEMİROĞLU/18439586958/0//2000-07-31/2000-06-11/42.00/0'
buf = var1.encode('utf-8')
# ...send buf over the network...
assert buf.decode('utf-8') == var1
如果你自己构建POST数据,别忘了进行URL编码。
1
我用最简单的方法解决了这个问题(:
在引用我的文本之前,我先把它转换成字符串:
quote(str(var1))
然后在另一边,以类似的方式取消引用:
unquote(str(var1))
这样就解决了问题