就我所知:至少從Windows 8.1開始,「Explorer.exe」似乎在查找文件之前刪除所有組合字符。您可以在c#或控制檯中進行測試(首先進行chcp 65001
以獲取unicode模式)。如果您嘗試打開一個名爲ปtarget的目標(泰語爲「螃蟹」),它將無法工作,但如果您刪除下面的元音標記以使您剛剛出現,它就會起作用。此外,如果您有一個名爲「ป」的文件夾,並且您打開ปู,它將打開「ป」文件夾!
這解釋了爲什麼一些其他開發者沒有問題;該問題不是非ascii:相反,它是具有可組合字符的文件名。並非所有的語言都使用它們,即使是在使用它們的語言中,也不是所有的語言都有它們。
好消息是,有一種不同的方式可以打開這些沒有這個問題的方法,這是由@ bert-huijben在this answer中描述的。
爲了完整起見,這裏的相似,我結束了使用的版本:
[DllImport("shell32.dll", ExactSpelling = true)]
public static extern void ILFree(IntPtr pidlList);
[DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
public static extern IntPtr ILCreateFromPathW(string pszPath);
[DllImport("shell32.dll", ExactSpelling = true)]
public static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);
public void SelectItemInExplorer(string path)
{
var pidlList = ILCreateFromPathW(path);
if(pidlList == IntPtr.Zero)
throw new Exception(string.Format("ILCreateFromPathW({0}) failed",path));
try
{
Marshal.ThrowExceptionForHR(SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0));
}
finally
{
ILFree(pidlList);
}
}
我已經確定問題是與由與輔音文字泰國元音的話。例如。 ภาษาไทย(「泰語」)正常工作,但ป((螃蟹)失敗。 unicode規範化形式明顯不同;我的理解是Windows NFC和NFD格式的文件名不相等。但我還沒有弄清楚如何解決這個問題。只是在參數上調用''''mystring.Normalize(...)''''沒有幫助。 –