将字符串转换为正确的字符集

时间:2013-07-15 09:44:15

标签: python django soap suds python-unicode

我试图将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  

我需要做什么才能正确保存数据?

2 个答案:

答案 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类型使用encodestr方法。 例如:

x = "this is a test" # ascii encode 
x = x.encode("utf-8") # utf-8 encoded
x = x.decode("utf-8") # ascii encoded