簡體   English   中英

如何讓 C++ wfstream 使用 Unicode 文件路徑?

[英]How can I get C++ wfstream to work with Unicode filepath?

我有一個使用 utf-8 編碼寬字符串處理文件 I/O 的應用程序。

工作代碼:

const wchar_t* wc = L"C:\Documents\TestPath\TestFile.txt";
std::wfstream wf(wc);
wf.imbue(std::locale(wf.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>()));
return wf.is_open();
...
wf << L"測試文件夾" << L"\n";

但是,一旦在文件路徑中引入了 unicode 字符,文件就無法正常打開。 IE。 以下代碼不起作用並返回false:

const wchar_t* wc = L"C:\Documents\測試文件夾\TestFile.txt";
std::wfstream wf(wc);
return wf.is_open();

我在這里做錯了什么? 似乎應該有一種簡單的方法可以讓 wfstream 使用 unicode 文件路徑,但我已經在互聯網上搜索了所有內容,但找不到。

謝謝

謝謝大家的幫助。

我發現了如何讓代碼與一個不尋常的解決方案一起工作,這可能會對處於相同情況的其他人有所幫助:

  1. 使用 C 風格的 _wfopen 創建文件
FILE * fp = _wfopen(cpFullPath, L"w"); 
fclose(fp); 
  1. 使用 ::GetShortPathW 函數獲取新創建文件的 UTF8 路徑的簡短 ASCII 表示
wchar_t short_path[511] {} ;                                                
::GetShortPathNameW( cpFullPath, short_path, 511 ) ;
// cpFullPath is L"C:\\Desktop\\測試文件夾\\те \x81това \x8f папка\\file.txt" 
// short_path becomes L"C:\\Desktop\\12BE~3\\81C2~6\\file.txt"      
  1. 使用 wfstream 打開文件並為 UTF8 I/O 注入流
std::wfstream textFileStream;
textFileStream.open(short_path, ios::in | ios::out);
textFileStream.imbue(std::locale(textFileStream.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>())); 

您的字符串文字需要轉義\\字符,例如:

const wchar_t* wc = L"C:\\Documents\\TestPath\\TestFile.txt";
const wchar_t* wc = L"C:\\Documents\\測試文件夾\\TestFile.txt";

否則,請改用原始字符串文字:

const wchar_t* wc = LR"(C:\Documents\TestPath\TestFile.txt)";
const wchar_t* wc = LR"(C:\Documents\測試文件夾\TestFile.txt)";

話雖如此,請仔細檢查用於保存 cpp 文件的字符集是否與編譯器用於解析文件的字符集匹配,否則像測試文件夾這樣的非 ASCII 字符將無法在字符串文字中正確工作。

否則,請改用 Unicode 轉義序列:

const wchar_t* wc = L"C:\\Documents\\\u6e2c\u8a66\u6587\u4ef6\u593e\\TestFile.txt";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM