簡體   English   中英

如何在C ++ 20中安全地將const char *轉換為const char8_t *?

[英]How to safely convert const char* to const char8_t* in C++20?

這個答案中我了解到,在C ++ 17中,我們可以通過std::filesystem::u8path使用UTF-8路徑打開std::fstream 但是在C ++ 20中,這個函數已被棄用,我們應該將const char8_t*傳遞給std::filesystem::path構造函數。

問題出在這里:雖然我們可以合法地轉換(通過reinterpret_cast )任何指向const char*指針,但我們不能倒退:從const char*const char8_t* (它會破壞嚴格的別名規則)。 因此,如果我們有一些外部API返回基於char的UTF-8表示文件名(例如來自用C編寫的庫),我們就無法安全地將指針轉換為基於char8_t的指針。

那么,我們如何將這種基於char的UTF-8字符串視圖轉換為基於char8_t的視圖呢?

免責聲明:我是引入char8_t並棄用u8pathP0482提案的作者。

你的觀察是正確的; 不允許使用reinterpret_cast生成指向char對象序列的char8_t指針。 這將在https://stackoverflow.com/a/57453713/11634221進一步討論。

雖然在C ++ 20中已經棄用了std::filesystem::u8path ,但是沒有計划立即刪除它; 你可以繼續使用它。 此外, P1423校正的在變化的意外后果P0482和允許它與兩個范圍被稱為charchar8_t在C ++ 20。 據我所知,沒有實現者將std::filesystem::u8path注釋為已棄用(我不知道是否有任何計划這樣做)。

沒有(格式良好的)方法來生成基於char8_t指針的char序列視圖。 可以編寫一個范圍/迭代器適配器,在內部將各個char值轉換為迭代器取消引用上的char8_t 這樣的適配器可以滿足C ++ 17和C ++ 20對非可變迭代器的隨機訪問迭代器要求(它不能滿足可變迭代器的要求,因為取消引用操作將無法提供一個左值,也不能滿足連續迭代器的要求)。 這樣的適配器足以調用接受范圍的std::filesystem::path構造函數。 嗯,這可能是一個有用的適配器,可以添加到https://github.com/tahonermann/char8_t-remediation

當然,對底層char數據的視圖的替代方法是復制它,但我可以理解為什么這樣做可能被認為是不合需要的(在使用std::filesystem::path時我們已經傾向於進行大量復制)。

這個字符類型參考 char8_t

它具有與unsigned char相同的大小, unsigned char和對齊方式(因此,與charsigned char具有相同的大小和對齊方式),但它是一種不同的類型。

因為它是一個獨特的類型 ,所以無法在不破壞嚴格別名的情況下將const char*轉換為const char8_t* 但是出於所有實際目的,由於char8_t基本上是一個unsigned char你可以使用reinterpret_cast來轉換指針。 這是錯的,但會奏效。

為了正確正確,可以使用char8_t開頭,或將原始字符復制到char8_t緩沖區(或std::u8string )。

暫無
暫無

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

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