簡體   English   中英

在 C++17 和 C++20 之間可移植地使用 UTF-8 字符串文字前綴

[英]Using UTF-8 string-literal prefixes portably between C++17 and C++20

我有一個用 C++17 編寫的代碼庫,它大量使用 UTF-8 和c++11 中引入的u8字符串文字來指示 UTF 編碼。 但是,c++20 將u8文字在 C++的含義從產生charconst char*更改為char8_tconst char8_t* 后者不是隱式指針可轉換const char*

我希望這個項目支持在 C++17 和 C++20 模式下運行而不會損壞; 可以做些什么來支持這一點?


目前,該項目使用char8別名,該別名使用u8文字的類型結果:

// Produces 'char8_t' in C++20, 'char' in anything earlier
using char8 = decltype(u8' ');

但是這種方法存在一些問題:

  1. char不保證是無符號的,這使得從數值生成代碼點不可移植(例如char8{129}char中斷,但不與char8_t )。

  2. char8與 C++17 中的char沒有區別,可能會破壞現有代碼,並可能導致錯誤。

  3. 從第 2 點繼續,不可能在 C++17 中用char8重載char來處理不同的編碼,因為它們不是唯一的類型。

可以做些什么來支持在 C++17 和 C++20 模式下運行,同時避免類型差異問題?

我建議在 C++20 之前的版本中簡單地將您自己的char8_tu8string類型聲明為別名unsigned charbasic_string<unsigned char> 然后在遇到轉換問題的任何地方,您都可以編寫包裝函數以在每個版本中適當地處理它們。

暫無
暫無

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

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