2010-06-01 37 views
8

我怎樣才能從一個Unicode路徑名(LPWSTR)轉換爲ASCII等效?被調用的庫只能理解c字符串。如何將Unicode路徑轉換爲c字符串?

編輯: 好吧,我把GetShortPathName和調用WideCharToMultiByte建議,並創建了一段代碼,我用含路徑Unicode字符的一些文件夾,測試,它完美地工作:

wlength = GetShortPathNameW(cpy,0,0); 
LPWSTR shortp = (LPWSTR)calloc(wlength,sizeof(WCHAR)); 
GetShortPathNameW(cpy,shortp,wlength); 
clength = WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, shortp, wlength, 0, 0, 0, 0); 
LPSTR cpath = (LPSTR)calloc(clength,sizeof(CHAR)); 
WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, shortp, wlength, cpath, clength, 0, 0); 

回答

5

GetShortPathName()功能

http://msdn.microsoft.com/en-us/library/aa364989%28VS.85%29.aspx

會給你一個相當於8.3名,指向同一個文件,對於遺留代碼使用。

這可能是你可以做的最好的,雖然理論上8.3文件名可能包含非ascii字符,這取決於註冊表設置。在這種情況下,你沒有簡單的方法來獲取正確的char *,並且GetShortPathNameA()也不會這樣做,或者在文件創建期間的代碼頁設置與當前設置不匹配。

有關設置請參閱http://technet.microsoft.com/en-us/library/cc781607%28WS.10%29.aspx。這裏有一個共識(見下文),這種情況是合理的忽視。

感謝Moron,All,對本文的貢獻。

+0

但是不是LPWSTR的短路嗎?也許OP正在尋找類似WideCharToMultiByte的東西? – 2010-06-01 17:22:57

+0

我實際上是在尋找這兩者的組合。 – metafex 2010-06-01 17:30:24

+0

@metafex:或許你應該編輯你的問題。這是被接受的答案似乎沒有道理,問題是目前的問題。 – 2010-06-01 17:34:32