Project

General

Profile

Actions

Bug #10704

closed

Normalization of path names on OSX

Added by nobu (Nobuyoshi Nakada) over 7 years ago. Updated over 7 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Target version:
-
[ruby-core:67381]

Description

OSXでのファイル名のUnicode normalizationは、今までHFS上の場合だけ行ってきましたが、HFS以外でも必要そうです。

実験

(1) Windows上でNFCとNFDのファイルを作る。

> cmd /c ver
Microsoft Windows [Version 6.1.7601]

> ruby -e '%W[\u{304c} \u{304b 3099}].each{|n| File.write(n, "\n")}'

(2) そのディレクトリをOSXからsmbでマウント。

(3) Dir.entriesで確認。

$ ruby -v -e 'puts Dir.entries(ARGV[0]).grep(/^[^.]/).map(&:dump)' $g
ruby 2.3.0dev (2015-01-06 trunk 49163) [universal.x86_64-darwin14]
"\u{304b}\u{3099}"
"\u{304b}\u{3099}"

どちらもNFDになってしまいます。

trunkでは r49166 で修正しました。

Updated by naruse (Yui NARUSE) over 7 years ago

  • Status changed from Closed to Assigned

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/38356 によると、

正確にはVFSドライバのレイヤーですね。
そこで、上位レイヤーからのパスはファイルシステムに適した形に、
ファイルシステムからのパスはdecomposed UTF-8に、基本的には変換します。

「ファイルシステムに適した形」というのは、必ずしもdecomposed Unicodeには
ならないという意味です。
例えば、HFS+ではdecomposed UTF-16になります。
しかし、smb経由でWindowsのファイルサーバーにアクセスする場合、
Mac OS Xはファイル名を合成済み形式にしてアクセスを行います。
そして、分解済みのファイル名を持つファイルにはアクセスすることができません。

例外がUFSとNFSで、この2つでは上記の処理が行われません。

とのことなので、仰る解釈は誤りです。
思うにFSごとに判別が必要でしょう。

Updated by nobu (Nobuyoshi Nakada) over 7 years ago

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

Applied in changeset r49168.


dir.c: normalize CIFS too

  • dir.c (need_normalization): not only HFS+, CIFS (SMB) is also
    decomposed. [Bug #10704]
Actions

Also available in: Atom PDF