パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

「Python 3.0」リリース、仕様変更多数」記事へのコメント

  • 2to3.py(非互換チェックツール)を使って少しずつスクリプトを修正しているのですが、少々トラブルに出くわしました。
    zipファイル形式の圧縮/伸張ライブラリzipfile.ZipFileで、ファイル名エンコーディングがUTF-8決めうちになってしまったようです。

    従来のzipfile.ZipFile.writeは、zipに格納されるファイル名に8ビット文字列をそのまま使っていたため、エンコーディングを自分で選ぶことができました。
    (とゆーか、ライブラリ側が関知するところではなかった(^^;))
    しかし、Python3.0からはUNICODE文字列で与える形式となり、かつ今のところエンコーディングを変更することはできないみたい。

    impor

    • by Anonymous Coward
      リファレンス [python.org]には

      Note
      There is no official file name encoding for ZIP files. If you have unicode file names, you must convert them to byte strings in your desired encoding before passing them to write(). WinZip interprets all file names as encoded in CP437, also known as DOS Latin.

      って書いてあるけど、これってファイルネームを自分でエンコードしたbytesで渡せってことだよね。
      未確認だけどこれでできないの?
      • Re: (スコア:2, 参考になる)

        #1468217さんがおっしゃるとおり、2.6以前のときの使い方ですね。

        3.0の zipfile.py を参照すると、圧縮時はまず 'ascii' でエンコードしてみて、例外が出るようなら 'utf-8' で再度エンコードします。(zipfile.py:335)

        # このときフラグ(0x800)を立てているようですが、Vistaエクスプローラ/Lhplus/+Lhaca等の解凍ツールはチェックしてないみたいで、いずれもUTF-8は文字化けしちゃいます。

        解凍時はフラグを見て、0x800が立っていたら 'utf-8'、そうでなければ 'cp437' でファイル名をデコードします。(zipfile.py:759)
        つまり、cp437(DOS-US)だけは正常に解凍できるという極悪仕様(^^;)
        • by Anonymous Coward on 2008年12月06日 22時01分 (#1468820)

          解凍時はフラグを見て、0x800が立っていたら 'utf-8'、そうでなければ 'cp437' でファイル名をデコードします。(zipfile.py:759)
          つまり、cp437(DOS-US)だけは正常に解凍できるという極悪仕様(^^;)

          appnote [pkware.com]のAPPENDIX D - Language Encoding (EFS)に従っただけですね。確かに cp437 だけってのは互換性に対する配慮が足りないという気はしますが、Java の java.util.zip みたいにフラグも立てずに utf-8 で出力するよりはマシだと思います。
          親コメント

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

処理中...