2016-03-25 6 views
1

PyQt4で2つのエントリを持つPython 2 GUIアプリケーションを作成しました。最初のファイル名はファイル名を取り、2番目のファイル名はファイルに書き込むためのテキストを取ります。アラビア語のテキストをPyQt4からUTF-8に変換する方法

私はそれらの両方でアラビア語のテキストを入力したいので、私は、この関数を書いた:

def makefile(self): 
    self.name_file=str(self.lineEdit.text()).decode("utf-8") 
    self.string=str(self.lineEdit_2.text()).decode("utf-8") 
    file=open(self.name_file,"w") 
    file.write(self.string) 
    file.close() 

私は英語の文字を入力すると、それが正常に動作しますが、私はアラビア語を入力したとき、私は次のエラーを取得する:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

+0

を書くべきですか?どのバージョンのPythonを使用していますか? 3を望むだろうが、すべての文字列がデフォルトでユニコードだったと思ったので、確信が持てません – konkked

+0

'str(self.lineEdit.text())。decode(" utf-8 ")'が間違っています。 'str()'は通常、デバッグ目的で何かを表現するためのものです。あなたがそれをデコードする必要があるのはなぜですか? – syntonym

答えて

1

ユニコードからUTF-8に変換するコードを書く代わりに、UTF-8からユニコードに変換するコードを書いています。それがエラーを起こす原因です。

decode("utf-8")encode("utf-8")は、あなたがUTF-8としてテキストをエンコードしようとしているので、あなたがUTF-であなたのファイルに書き込むことができますように見えます

take a unicode string and encode into a binary str using UTF-8.

を意味し、逆に

Take a UTF-8 encoded binary str and convert to a unicode string.

を意味し、 8エンコード。したがって、decode()の代わりにencode()を使用する必要があります。

また、ユニコードのQStringの値をとり、str()を呼び出しています。これはASCIIを使用してバイナリstrに変更しようとしますが、これはあなたのアラビア語のテキストでは機能せず、あなたが見ている例外が発生します。とにかく、ASCIIではなくUTF-8を使いたいと思っていました。したがって、バイナリstrに変換しないで、オブジェクトに変換します(unicode())。

ので、例えば、代わりに

str(self.lineEdit_2.text()).decode("utf-8") 

のあなたの代わりに

unicode(self.lineEdit_2.text()).encode("utf-8") 
あなたは `self.lineEdit`を初期化している
+0

私はあなたが言うことをしようとしましたが、 'str()'関数なしでそれを行うと次のエラーが出ました。 'AttributeError: 'QString'オブジェクトに 'encode'属性がありません。 – FRe34

+0

@ FRe34 strの代わりに関数 'unicode()'があります。私は私の答えを編集します。 –

+0

おかげでうまくいく:D – FRe34