Feature #8657

Make Find.find respect the encodings of arguments

Added by Kazuki Tsujimoto 9 months ago. Updated 7 months ago.

[ruby-dev:47530]
Status:Closed
Priority:Normal
Assignee:-
Category:lib
Target version:next minor

Description

=begin
== 概要
Find.findが返すパス名は常にfilesystem encodingとなっていますが
任意のencodingを指定できるようにすることを提案します。

== ユースケース
日本語Windowsではfilesystem encodingはWindows-31Jとなっています。

このため、Windows-31Jに存在しない文字を含むファイル名があった場合に
正しいパス名を取得できないという問題が起きます。

D:>dir /s /b D:\t
D:\t\♠ (U+2660)
D:\t\♠\a.txt

D:>ruby -v -rfind -e "p Find.find('D:/t'.forceencoding('utf-8')).toa"
ruby 2.1.0dev (2013-07-19 trunk 42058) [i386-mingw32]
["D:/t", "D:/t/?"]

== API
パス名を扱う他のAPIにおけるencoding指定の方式には以下の2つがあるようです。
(にこの辺りの議論がありますが結論が見あたりませんでした)

  • encodingオプションを明示的に渡す(e.g. Dir.entries)、
  • 引数として与えた文字列のencodingを暗黙的に利用する(e.g. Dir.glob)

ファイルシステムごとにencodingが別々である可能性を考慮しなければならないこと(#2154)、
Find.findは引数として複数のパスをまとめて受け取れることから
後者の形にするのがよさそうに思います。

== 実装
lib/find.rbに対するパッチを添付します。
=end

find-respect-encodings.patch Magnifier (1.77 KB) Kazuki Tsujimoto, 07/19/2013 07:53 PM

Associated revisions

Revision 42866
Added by Kazuki Tsujimoto 7 months ago

  • lib/find.rb (Find.find): respect the encodings of arguments.
    [Feature #8657]

  • test/test_find.rb: add tests.

History

#1 Updated by Kazuki Tsujimoto 8 months ago

現在findのメンテナがいないようなのであわせて立候補します。

#2 Updated by Kazuki Tsujimoto 7 months ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r42866.
Kazuki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/find.rb (Find.find): respect the encodings of arguments.
    [Feature #8657]

  • test/test_find.rb: add tests.

#3 Updated by Kazuki Tsujimoto 7 months ago

=begin
DevelopersMeeting20130831Japanでacceptされたのでコミットしました。
=end

Also available in: Atom PDF