[英]UTF8 to UTF16 conversion using std::filesystem::path
從 C++11 開始,可以使用std::codecvt_utf8_utf16
將 UTF8 轉換為 UTF16 wchar_t
(至少在 Windows,其中wchar_t
為 16 位寬):
std::wstring utf8ToWide( const char* utf8 )
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes( utf8 );
}
不幸的是,在 C++17 中, std::codecvt_utf8_utf16
已被棄用。 但是有std::filesystem::path
里面有所有可能的轉換,例如它有成員
std::string string() const;
std::wstring wstring() const;
std::u8string u8string() const;
std::u16string u16string() const;
std::u32string u32string() const;
所以上面的function可以改寫如下:
std::wstring utf8ToWide( const char* utf8 )
{
return std::filesystem::path( (const char8_t*) utf8 ).wstring();
}
與std::codecvt_utf8_utf16
不同,它不會使用任何已棄用的 C++。
這種轉換器可以預期什么樣的缺點? 例如,路徑不能超過一定長度,或者某些 Unicode 符號在那里被禁止?
這種轉換器可以預期什么樣的缺點?
好吧,讓我們解決最明顯的缺點。 對於一個不知道你在做什么的用戶來說,這是沒有意義的。 使用路徑類型進行 UTF-8 到 16 的轉換是很糟糕的,應該立即被視為代碼異味。 當您不必要地反對只下載一個可以正確執行此操作的簡單庫時,您會做這種可怕的黑客攻擊。
此外,它不必工作。 path
用於存儲...路徑。 由此得名。 具體來說,它們旨在以一種易於被相關文件系統使用的方式存儲路徑。 因此,存儲在path
中的字符串可以具有文件系統想要對其施加的任何限制,除了 C++ 標准要求它做的大量事情之外。
例如,如果文件系統不區分大小寫(甚至只是不區分 ASCII 大小寫),那么當所有字符串存儲在path
中時,將其大小寫轉換為小寫是一種合法的實現。 或者從path
中提取它們時對它們進行大小寫轉換。 或類似的東西。
path
可以將你所有的\
s轉換成/
s。 或者你的:
s 變成/
s。 或者它想要做的任何其他依賴於實現的技巧。
如果您害怕使用已棄用的工具,只需下載一個簡單的 UTF-8/16 轉換庫。 或者自己寫一個; 這並不難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.