2016-05-31 4 views
0

私はx='مصطفى'のような値を保持する変数を持っていて、それをu'مصطفى'の形式に変換したいと思っています。何とかしようとすると、u''+xエラーが表示されます:ユーザーにUnicodeアラビア文字列

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128) 

任意のヘルプ?

+0

「x」バイトテストのソースは何ですか? (ファイルから読み込みますか?ネットワークから受信しますか?)プログラムで取得するとすぐにUnicodeに変換する必要があります(値がどこにあるかに応じて適切な文字エンコーディングを使用します)。 – jfs

答えて

1

二つのものがあります行うことになります。

最初にx='مصطفى'の意味は正しく定義されておらず、ソースファイルを別のエンコードで保存すると変更されます。一方、x=u'مصطفى'.encode('utf-8')は、「UTF-8でそのテキストをエンコードすると得られるバイト」を明白に意味します。

第二に、いずれかの使用バイト'abc'またはb'abc'またはUnicode u'abc'が、はそれらを混在させないでください。それらをPython 2.xで混在させると、そのコードをどこで実行するかによって結果が異なります。 Python 3.xでは、エラーが発生します(理由があります)。

# bytes 
'' + x 

か::

だからバイト文字列 x、いずれかの与えられた

# unicode, so decode the byte string 
u'' + x.decode('utf-8') 
1

おかげで、私はそれを解決:)

ソリューションはそう

u''.encode('utf-8')+x 
+1

いいえ、これは悪いです。 Unicodeの使い方を読む:https://docs.python.org/2/howto/unicode.html – roeland

+0

また、 'u 'に注意してください。encode(' utf-8 ')' == '' '' – roeland

2

あなたはそれらのバイトがしているエンコーディング何を知っている必要があり、およびそれらは.decode(encoding)それらはUnicode文字列を取得します。いくつかのAPIからそれらを受け取った場合、utf8は良い推測です。 Windowsメモ帳で入力されたファイルからバイトを読み取ると、アラビア語(?)コードページが表示される可能性が高くなります。

PythonWin 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32. 
>>> x='مصطفى' # "Just bytes" in whatever encoding my console uses 
>>> x   # Looks like UTF-8. 
'\xd9\x85\xd8\xb5\xd8\xb7\xd9\x81\xd9\x89' 
>>> x.decode('utf8') # Success 
u'\u0645\u0635\u0637\u0641\u0649' 
>>> print(x.decode('utf8')) 
مصطفى 
関連する問題