POST数据中的土耳其字符问题

1 投票
3 回答
3529 浏览
提问于 2025-04-16 12:48

我有两个应用程序,它们分别运行在不同的服务器上,使用不同的数据库。我需要把一些数据从一个应用程序发送到另一个,所以我使用了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

所以İĞ造成了问题,紧接着的首字母RL也解码错误。

我尝试了不同的土耳其编码参数,也尝试直接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))

这样就解决了问题

撰写回答