Windows上でのUTF-8利用について

66 views
Skip to first unread message

INADA Naoki

unread,
Jun 28, 2023, 6:02:01 AM6/28/23
to mercurial-ja
Pythonコア開発者の稲田です。

MecurialがPython 3に対応して、Windows上でのUTF-8パス利用に新しい方法ができました。
前提として、Python 3.6 から PEP 529 が有効になって、Windows上でbytesでパスを扱う時はUTF-8を使うようになっています。なので、そのままPythonを使っていたらMercurialもUTF-8を使うことになります。


もちろんそれでは後方互換性が壊れます。PEP 529は後方互換性のためにmbcsを使ってパスを扱うオプションを残していて、Mercurialは後方互換性のためにこのオプションを使っています。
具体的には pycompat.py モジュールで、_enablelegacywindowsfsencoding() を実行しています。


しかしこの関数にはバグがあり、 os.fsencode()/fsdecode() が utf-8 を使うままになってしまっています。
Mercurial はこのバグの回避のために pycompat.py で a.encode("mbcs", "ignore") を使って sys.argv をエンコードしています。
しかしそのほかの部分では fsencode/fsdecode を使ってるところがいくつかあり、その一部では Windowsでの非ASCIIパスの扱いのサポートが壊れているかもしれません。

このPython側のバグの対処として、 _enablelegacywindowsfsencoding() 自体を deprecate してしまって、Pythonの起動時からレガシーファイルシステムエンコーディングを有効にする方法 (pythonのコマンドライン引数、環境変数、Python/C API)に移行してもらおうと思っています。

* 環境変数を使うパッチ 

残念ながら私はMercurialもWindowsもほぼ使わないので、興味がある方はパッチを試してみてMercurialのissueにコメントをくれると嬉しいです。
パッチの中で、 hg.bat で set PYTHONLEGACYWINDOWSFSENCODING=1 しているところを消すと、UTF-8でパスを扱うようになるはずです。

Reply all
Reply to author
Forward
0 new messages