Project

General

Profile

Bug #6698

MacOSXではDir.globが返すファイル名の内容はUTF8-MACですがencodingがUTF-8になっている

Added by Mario Freitas almost 4 years ago. Updated almost 4 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
ruby -v:
ruby 1.9.3dev (2011-08-02 revision 32803) [x86_64-darwin10.8.0]
[ruby-dev:45913]

Description

=begin
MacOSXでは、「だ」など濁点が含まれているファイル名をDir.globで調べると返ってくるencodingが間違っているようです。

Dir.glob('*.{jpg,png}') do |filename|
puts "#{filename} #{filename.encoding}"
end

「だ」というファイル名はUTF-8というencodingを使った"\u305F\u3099"と返ってきます。

表示的に"\u305F\u3099"を"\u3060"と比較すれば同じものなんですが、それぞれ違うencodingになっているため当然比較は失敗します。

Dir.globが返したfilenameを下記のようにすると正常に比較が出来るようになります。

filename = filename.force_encoding("UTF8-MAC").encode("UTF-8")

これって、Dir.globの不具合ですかそれとも正しい動きですか?
=end

utf8_mac_for_filesystem_encoding_on_osx.diff Magnifier (862 Bytes) sorah Shota Fukumori, 07/04/2012 11:53 PM

utf8_mac_for_filesystem_encoding_on_osx2.diff Magnifier (783 Bytes) sorah Shota Fukumori, 07/05/2012 03:44 PM

History

#1 [ruby-dev:45914] Updated by Mario Freitas almost 4 years ago

redmineのcode blockを使ってみましたが、表示おかしくなりましたT_T

#2 [ruby-dev:45915] Updated by sorah Shota Fukumori almost 4 years ago

  • Description updated (diff)

#3 [ruby-dev:45916] Updated by sorah Shota Fukumori almost 4 years ago

imkira (Mario Freitas) wrote:

redmineのcode blockを使ってみましたが、表示おかしくなりましたT_T

直しておきました。RD のフォーマットを有効にするには =begin, =end で囲う必要があります (RDボタンを押すとそれで全体が囲われるはずです)

#4 [ruby-dev:45917] Updated by Mario Freitas almost 4 years ago

ありがとうございました。
こちらの良く使うredmineのバージョンでは、Updateリンクを推してMoreというリンクが出てそこで編集できます。
このredmineのバージョンではMoreというリンクが存在しないので編集しませんでしたT_T

#5 [ruby-dev:45918] Updated by sorah Shota Fukumori almost 4 years ago

仮に不具合として、OS X 環境では UTF8-MAC にするパッチを添付します。

imkira (Mario Freitas) wrote:

このredmineのバージョンではMoreというリンクが存在しないので編集しませんでしたT_T

more は適切な権限がないと見えないみたいですね。

#6 [ruby-dev:45919] Updated by Nobuyoshi Nakada almost 4 years ago

=begin
(({NO_LOCALE_CHARMAP}))は(({miniruby}))用に必須なので、その外に条件を追加するのはダメです。
=end

#7 [ruby-dev:45920] Updated by Motohiro KOSAKI almost 4 years ago

OS X じゃないMacはもうサポートしてないしサポートを復活させるのも技術難易度的に不可能だと思うので

#if defined(APPLE) && ( defined(MACH) || defined(DARWIN) )

APPLE だけでいいと思います。いま grepした感じだと現在のリポジトリで7割ぐらいはAPPLEだけ、残り3割がMACHとのAND条件、process.c に1つだけ旧Macの考慮が残っている感じっぽい

#9 Updated by Yui NARUSE almost 4 years ago

  • Status changed from Open to Rejected

imkira (Mario Freitas) wrote:

MacOSXでは、「だ」など濁点が含まれているファイル名をDir.globで調べると返ってくるencodingが間違っているようです。

Dir.glob('*.{jpg,png}') do |filename|
puts "#{filename} #{filename.encoding}"
end

「だ」というファイル名はUTF-8というencodingを使った"\u305F\u3099"と返ってきます。

これって、Dir.globの不具合ですかそれとも正しい動きですか?

正しい動きです。

Ruby 1.9 当初はまさに imkira さんの期待なさっている通り UTF8-MAC で返していたのですが、
それだと今回の濁点やアクセント記号を含んでいない場合に UTF-8 と異なるせいで色々不便なので、
r23308 にて UTF-8 で返すように変更しました。

ので、これは意図的なので、後述の通り変換してください。

表示的に"\u305F\u3099"を"\u3060"と比較すれば同じものなんですが、それぞれ違うencodingになっているため当然比較は失敗します。

同じエンコーディングでも普通に比較すれば違うものなので失敗するので、どちらにしろ変換しないとダメなのです。

Dir.globが返したfilenameを下記のようにすると正常に比較が出来るようになります。

filename = filename.force_encoding("UTF8-MAC").encode("UTF-8")

ちなみにこれは
filename.encode!("UTF-8", "UTF8-MAC")
と書けます。

Also available in: Atom PDF