簡體   English   中英

使用 std::filesystem::path 將 UTF8 轉換為 UTF16

[英]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.

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