2016-01-18 21 views
1

我有一個包含非ascii字符的unicode對象userId。我想引用這個字符串使用從xml.sax.saxutils的功能,使用它作爲一個XML屬性:無法在Python中引用unicode字符串

quoteattr(userId) 

這給了我這個錯誤:

'ascii' codec can't encode character u'\xa0' 

我想我已閱讀全部在網絡上的python unicode信息,包括https://docs.python.org/2/howto/unicode.html#the-unicode-type

但我仍然不明白問題是什麼。我已經有一個unicode對象。我不關心編碼。編碼是當我想從unicode轉換爲字節數組時,反之亦然。從來沒有在我的代碼中,我正在處理原始字節數組。

基本上最大的問題是爲什麼要quoteattr使用ASCII編碼來的東西,如果我給它一個的unicode對象,並期望統一對象回來?

我通過做userId.encode('ascii', 'ignore')解決了這個問題,但這顯然拋棄了任何非ascii字符。

我怎樣才能得到我的unicode字符串引用?

使用Google App Engine爲變量分配userId = ndb.StringProperty()

+0

「適合我」 - 我無法重現您的問題。你使用的是什麼Python版本?有沒有機會你的userId不是內置的unicode對象(假設你在Python2.x中),而不是一些帶有自定義__unicode__方法的類? – jsbueno

+1

@jsbueno這是可能的 - 我正在使用谷歌App Engine和userId分配如下:userId = ndb.StringProperty(),但是當我調用類型(userId)它說 kaalus

回答

2

一旦你所提到的谷歌應用程序引擎我打了使用它的例子:

from xml.sax.saxutils import quoteattr 
from google.appengine.ext import ndb 
from google.appengine.ext.ndb.model import Model 


class Foo(Model): 
    bar=ndb.StringProperty() 


foo=Foo(bar='''barç"á<&' > 


''') 

print type(foo.bar) 

print quoteattr(foo.bar) 

這裏的問題是,foo.bar是一個海峽,那麼你將有編碼的問題。 Thera解決它的兩種方法:

1)使用u前綴。所以

foo=Foo(bar='''barç"á<&' > 


    ''') 

變爲

foo=Foo(bar=u'''barç"á<&' > 


    ''') 

2)添加你的腳本的開頭兩行:

# -*- coding: utf-8 -*- 
from __future__ import absolute_import, unicode_literals 

我更喜歡第二種方法。我將Pycharm配置爲在每個新創建的py文件中添加這些行。

請注意,只有在使用文字設置模型屬性時纔會出現此問題。 Webapp2和GAE中使用的大多數框架將請求數據轉換爲unicode,因此您不必擔心編碼/解碼。

相關問題