C++ 什么可以保证存储在char32或char16到char中的UTF-8代码单元的静态转换结果与预期一致?

C++ 什么可以保证存储在char32或char16到char中的UTF-8代码单元的静态转换结果与预期一致?,c++,c++11,std,C++,C++11,Std,使用C++11标准时,是否可以保证存储在char32_t或char16_t码点中的ASCII字符将正确转换为char char32\u t和char16\u t都定义为始终无符号()。但是,char可以是有符号的,也可以是无符号的,具体取决于系统 我假设ASCII字符始终有效: char32_t original = U'b'; char value = static_cast<char>(original); 是否保证所有系统上的转换将以相同的方式工作(产生所述UTF-8代码单元

使用C++11标准时,是否可以保证存储在
char32_t
char16_t
码点中的ASCII字符将正确转换为
char

char32\u t
char16\u t
都定义为始终无符号()。但是,
char
可以是有符号的,也可以是无符号的,具体取决于系统

我假设ASCII字符始终有效:

char32_t original = U'b';
char value = static_cast<char>(original);
是否保证所有系统上的转换将以相同的方式工作(产生所述
UTF-8
代码单元的相同预期位),或无符号转换是否可能产生任何差异?

编辑:

<> P>我知道,C++(包括C++ 11)对于<代码> char < /代码>类型的编码是不可知的。唯一的要求(§3.9.1.1)是
char
必须能够存储§2.3中定义的基本字符集的任何字符。因此,即使是集合之外的ASCII字符,如
@
`
,也不能保证存储在
字符中。显然可以存储它们的代码点值,但机器可能会将它们解释为不同的标志符号(对于
isalpha
和类似的函数)


即使您只是对存储值感兴趣,在您的示例中,您也尝试将
静态
一个
int
表达式转换为
char
。如果您的
char
是有符号类型且值大于127,则结果是实现定义的,有关详细信息,请参阅。

'b'
不是ASCII编码的。你需要说
char32\U t c=U'b'
。在C++17中,您可以说
char C=u8'b'
来获得类型为
char
的UTF-8值,这与前128个值的ASCII值相同。@KerrekSB谢谢,fixedAFAIK有符号无符号强制转换纯粹是语法问题,也就是说,供人类使用;位总是简单地重新解释,没有任何类型的转换。所以,除非你找到一台不使用二的补码的机器,否则你不应该期待任何问题。当然,我知道这是在回答你的问题,因为你在问是否有任何保证。好问题!没有什么可以保证您的期望,但是如果它们符合语言规范,那么语言规范可以保证它。
char32_t someUtf32CodeUnit = 0x00001EA9;
// Third code-unit of ẩ
char extractedCodeUnit = static_cast<char>(((someUtf32CodeUnit >> 6) & 0x3F) | 0x80);