我试图将unicode数据保存到外部Web服务。
当我尝试保存æ-ø-å
时,它会在外部系统中保存为æ-ø-Ã¥
。
(我的名字值是Jørn
)(来自django J\\xf8rn
的值)
firstname.value=user_firstname
= Jørn
如果我尝试使用encode:
,这是我的结果 firstname.value=user_firstname.encode('ascii', 'replace')
= J?rn
firstname.value=user_firstname.encode('ascii', 'xmlcharrefreplace')
= Jørn
firstname.value=user_firstname.encode('ascii', 'backslashreplace')
= J\xf8rn
firstname.value=user_firstname.encode('ascii', 'ignore')
=我使用ignore收到unicode错误。
我的更新用户表单:
def show_userform(request):
if request.method == 'POST':
form = UserForm(request.POST, request.user)
if form.is_valid():
u = UserProfile.objects.get(username = request.user)
firstname = form.cleaned_data['first_name']
lastname = form.cleaned_data['last_name']
tasks.update_webservice.delay(user_firstname=firstname, user_lastname=lastname)
return HttpResponseRedirect('/thank-you/')
else:
form = UserForm(instance=request.user) # An unbound form
return render(request, 'myapp/form.html', {
'form': form,
})
这是我的任务:
from suds.client import Client
@task()
def update_webservice(user_firstname, user_lastname):
membermap = client.factory.create('ns2:Map')
firstname = client.factory.create('ns2:mapItem')
firstname.key="Firstname"
firstname.value=user_firstname
lastname = client.factory.create('ns2:mapItem')
lastname.key="Lastname"
lastname.value=user_lastname
membermap.item.append(firstname)
membermap.item.append(lastname)
d = dict(CustomerId='xxx', Password='xxx', PersonId='xxx', ContactData=membermap)
try:
#Send updates to SetPerson function
result = client.service.SetPerson(**d)
except WebFault, e:
print e
我需要做什么才能正确保存数据?
答案 0 :(得分:0)
您的外部系统正在将您的UTF-8解释为拉丁语-1或Windows-1252。那很糟糕。
编码或解码ASCII无济于事。你的字符串绝对不是普通的ASCII。
如果你很幸运,那只是你在网络服务的API中遗漏了一些选项,你可以告诉它你发送的是UTF-8。
如果没有,你的手上会有很多维护问题,但你仍然可以修复你得到的东西。 Web服务将您编码的字符串作为UTF-8并将其解码为Latin-1,因此您只需要完全相反:
user_firstname = user_firstname.encode('latin-1').decode('utf-8')
答案 1 :(得分:-1)
对decode
类型使用encode
和str
方法。
例如:
x = "this is a test" # ascii encode
x = x.encode("utf-8") # utf-8 encoded
x = x.decode("utf-8") # ascii encoded