2010-04-28 74 views
2

有一個第三個lib只接受char *文件名,例如3rdlib_func_name(char* file_name)。當我用中文或日文提供文件名時,每件事都會出錯。如何在Windows上使用UNICODE文件名打開文件?

有沒有辦法讓這個lib打開UNICODE文件名?該程序運行在Windows

感謝您的回覆。

+0

回到第三方作者。 – 2010-04-28 13:34:35

+0

該庫可能支持UTF-8文件名,您只能通過查看函數定義('char *'可能是ASCII,或者它可能是UTF-8)無法立即得知。我假設庫在內部使用'fopen',它在* nix上支持UTF-8文件名,而在Windows上則不支持(您需要使用平臺特定的'_wfopen')。 – 2015-09-10 13:45:18

回答

4

我們也有類似的問題太多。幸運的是有一個解決方案,雖然它有點棘手。

如果文件/目錄已經存在 - 您可以使用GetShortPathName函數。生成的「短」路徑名保證不包含非拉丁字符。

  1. 請致電GetShortPathNameW(unicode版本)獲取「short」路徑字符串。
  2. 將短路徑轉換爲ANSI字符串(使用WideCharToMultiByte)。
  3. 將生成的ANSI字符串提供給愚蠢的第三方庫。

現在,如果文件/目錄尚不存在 - 您可能無法獲取其短路徑名。在這種情況下,您應該先創建它。

+0

謝謝,我已經試過這個解決方案。它不百分之百的工作:(我們今天下午稱lib庫供應商。 – zengkun100 2010-04-29 14:04:12

+0

我很喜歡在Windows7下使用PHP訪問GetShortPathName和unicode命名的文件... – 2012-05-06 13:58:30

1

不,除非您可以從修改過的源文件重新編譯它(一項主要工作)否則不會有。您可能有更好的運氣提供第三方庫短文件名,如AHDF76~4.DOC;這些文件名使用ASCII。見GetShortPathName

+0

謝謝! 我已經嘗試了這個真棒GetShortPathName。它有時會工作,但不是所有的時間:) – zengkun100 2010-04-29 02:25:32

0

你可以嘗試將字符串轉換爲本地代碼頁:

setlocale(LC_ALL,"Japanese_Japan.932"); 
std::string file_name = convert_to_codepage_932(utf16_file_name); 
3rdlib_func_name(file_name.c_str()); 

否則?

責備窗戶不支持UTF-8 ;-)

+0

感謝您的回覆。 我的計算機上使用的當前Windows ANSI代碼頁是1252(從GetACP中檢索)。我已經嘗試了3個代碼頁CP_ACP,CP_UTF8和936(簡體中文代碼頁)來調用WideCharToMultiByte將UNICODE中文文件名更改爲多字節文件名。 3rdlib_func_name返回所有這3個多字節文件名的「文件未找到」。 – zengkun100 2010-04-29 01:57:33

+0

注意。 CP_UTF8不支持作爲文件系統代碼頁。我建議只用fopen運行測試,然後用第三方庫運行測試。 如果不能停止使用Windows';-)'。 – Artyom 2010-04-29 04:20:54

+0

說實話,我的家用電腦在Ubuntu上運行,但我在Windows上工作:)我試過fopen,但它也不起作用。 – zengkun100 2010-04-29 14:06:30

相關問題