1

djangoでcsvファイルを作成しました。そこにエンコードされたデータを書き込みました。しかし、このファイルをExcelシートで開くと、Unicode文字が正しく表示されません。

この質問も参照してください DjangoはUnicodeを含み、Excelで直接開くことができるCSVファイルを作成します

しかし、正しい答えは得られませんでした。私はすべての答えを試しましたが、どれもうまくいきませんでした。

私は以下のようにコードを書きます。

    def exportcsv(request):
        import csv
        producer_list = Producer.objects.filter()
        response = HttpResponse(mimetype='text/csv')
        response['Content-Disposition'] = 'attachment; filename=producer.csv'
        writer = csv.writer(response, delimiter=",")
        writer.writerow(codecs.BOM_UTF16_LE)
        writer.writerow(['Produsenter','Type','Land','Region'])
        for cdst in producer_list:
            writer.writerow([cdst.title.encode("UTF-8"),
                            cdst.producer_type.encode("UTF-8"),
                            cdst.country.country.encode("UTF-8"),
                            cdst.region.region.encode("UTF-8")])
        return response

次に、csvファイルは正しく作成されましたが、その中の文字は正しくエンコードされていません。キャラクターは「TokajHétszölö」のように表示されます。

やってみると

writer.writerow([cdst.title.encode("iso-8859-1"),
                            cdst.producer_type.encode("iso-8859-1"),
                            cdst.country.country.encode("iso-8859-1"),
                            cdst.region.region.encode("iso-8859-1")])

次に、データを適切に追加し、Excelファイルを適切に開きます。ただし、文字列内の「æ」や「」などの一部の文字にはエラーが発生します。

エラー:'latin-1'コーデックは位置266の文字u'\ u2013'をエンコードできません:序数が範囲内にありません(256)

以下のコードも試してみます。

response['Content-Disposition'] = 'attachment; filename=producer.csv'
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=",")

また、試してみてください

writer.writerow(codecs.BOM_UTF16_LE)
writer.writerow(str.decode('utf8').encode('utf_16_le'))
4

2 に答える 2

0

unicodecsvを確認する必要があります。それは私にとって同様の問題を解決しました。

于 2012-10-19T08:28:36.573 に答える
0

上記の問題は解決しました。私は以下のようにコードを書きます。

writer.writerow([cdst.title.encode("iso-8859-1"),
                 cdst.producer_type.encode("iso-8859-1"),
                 cdst.country.country.encode("iso-8859-1"),
                 cdst.region.region.encode("iso-8859-1")])

上記のコードを使用すると、次のようなエラーが発生しました

Error: 'latin-1' codec can't encode character u'\u2013' in position 266: ordinal not in range(256)

しかし、このエラーは、空の文字列と、エンコーディングに渡すときの「-」文字が原因です。これは、文字列をエンコーディングに渡す前に条件を設定し、「-」文字を「_」に置き換えると解決できます。

于 2012-11-01T05:11:39.010 に答える