3

Unicode 名 (漢字など) のファイルがあります。UnicodeEncodeError が発生します。私はutf8でpostgresデータベースを使用しており、ubuntu lucid 64でdjango開発サーバーを使用しています。何が欠けていますか? filename が models.py 内のファイルの Unicode 名である場合、次のようにします。

def get_upload_path(instance,filename):
    return filename # Unicode error if filename has non latin 1 characters

class Kind (models.Model):
    style = models.ForeignKey(Style)
    kind_file = models.FileField(upload_to=get_upload_path)

シェルから:

ここに画像の説明を入力

4

2 に答える 2

3

問題は文字列のフォーマットにあると思います。python2 では、strタイプ (一連のバイト) とunicode抽象的な一連の Unicode コードポイントを表すタイプとの間で自動的に変換されます。

あなたfilenameのタイプはunicode.

"tmp/%s/%s"はバイト文字列なので、python は一致するように自動的にエンコードunicodeしようとしますstr。問題は、asciiエンコーディングを使用してデータを保持できないことです。

適切な型を一緒に使用しているため、代わりにreturn使用するようにステートメントを変更するとうまくいくはずです。temp2filename


将来的には、コメントでリンクしたプレゼンテーションを見ることもお勧めします。このクラスの問題を回避するためのいくつかの戦略が示されているからです。主なものは、プログラムの外部にデータを送信するときはバイトのみを使用する必要があるということです。外界からバイトを受信するとすぐに、decodeそれらをユニコードにencode変換します。これは、プログラムからデータを送信する場合のみです。また、Unicode 文字列リテラルを内部的に (u""の代わりに"") 使用する必要があります。

また、より意味のある変数名をお勧めしますtempN

于 2012-05-22T00:49:50.880 に答える
0

Djangoには、ここで使用できる便利な関数がいくつか付属しています:https ://docs.djangoproject.com/en/dev/ref/unicode/#conversion-functions

smart_strはあなたが必要なものだと思います。

別の方法は、ユーザーがアップロードしているファイルの名前を変更することです。

于 2012-05-22T01:19:29.737 に答える