[samba-jp:22939] Re: 末尾に空白があるファイルのファイル名が化ける

HAT hat @ fa2.so-net.ne.jp
2019年 2月 25日 (月) 21:07:11 JST


HATです。

>> 末尾に空白があるファイル名が文字化けするという現象が出ています。
> 
>> cat aaa >"A B" とするとWindows 10(1803)からはちゃんと、"A B"というファイルが
>> 見えますが、
>> cat aaa >"A B " とすると、"A27CYP~G" というファイル名になってしまいます。
> 
> Windows 的にありえないファイル名だから smbd が mangle
> しているだけかと。

これの他にもWindowsが予約しているファイル名、con, com1, lpt1あたりでも
mangleが発生しますね。


Windows的にありえないファイル名については、かつてMicrosoft自身が
SFM (Service for Macintosh)を実装するときに問題になっていて...

Q117258: SFM Converts Macintosh HFS Filenames to NTFS Unicode
https://jeffpar.github.io/kbarchive/kb/117/Q117258/

禁止文字をUnicode私用領域に置換する実装を行なっています。
最後の文字がSpace(0x20)のケースも、これに含まれます。

WindowsのAPIを使って、末尾がスペースになるファイル名を指定すると、
まず間違いなくスペースが削られます。
GUIに限らず、Visual Studioで書いたアプリは大抵削られます。

ただし、抜け道があって、Cygwinのコマンドを使うと、

$ touch "abc "

末尾がスペースのファイル名をあっさり作れます。

現在のmacOSがNTFSやSMBを扱う場合も、SFMと同様の方法でファイル名置換を
行なっています。

http://www.opensource.apple.com/source/xnu/xnu-1504.7.4/bsd/vfs/vfs_utfconv.c


> 余談。8.3 形式でない名前に変換する mangling method って
> 実装可能なのだろうか?

可能かもしれませんが、実装する意味をあんまり感じない...

-- 
HAT


samba-jp メーリングリストの案内