私はx='مصطفى'
のような値を保持する変数を持っていて、それをu'مصطفى'
の形式に変換したいと思っています。何とかしようとすると、u''+x
エラーが表示されます:ユーザーにUnicodeアラビア文字列
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128)
任意のヘルプ?
私はx='مصطفى'
のような値を保持する変数を持っていて、それをu'مصطفى'
の形式に変換したいと思っています。何とかしようとすると、u''+x
エラーが表示されます:ユーザーにUnicodeアラビア文字列
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128)
任意のヘルプ?
二つのものがあります行うことになります。
最初に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')
あなたはそれらのバイトがしているエンコーディング何を知っている必要があり、およびそれらは.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'))
مصطفى
「x」バイトテストのソースは何ですか? (ファイルから読み込みますか?ネットワークから受信しますか?)プログラムで取得するとすぐにUnicodeに変換する必要があります(値がどこにあるかに応じて適切な文字エンコーディングを使用します)。 – jfs