[英]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
並棄用u8path
的P0482提案的作者。
你的觀察是正確的; 不允許使用reinterpret_cast
生成指向char
對象序列的char8_t
指針。 這將在https://stackoverflow.com/a/57453713/11634221進一步討論。
雖然在C ++ 20中已經棄用了std::filesystem::u8path
,但是沒有計划立即刪除它; 你可以繼續使用它。 此外, P1423校正的在變化的意外后果P0482和允許它與兩個范圍被稱為char
和char8_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
和對齊方式(因此,與char
和signed 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.