char []如何表示UTF-8字符串?

dod*_*gel 8 c string utf-8 c11

在C11中,添加了一个带有前缀u8的新字符串文字.这将返回一个字符数组,其中文本编码为UTF-8.这怎么可能呢?签名不是正常的char吗?这意味着由于符号位,它使用的信息少了一点?我的逻辑将描述一串UTF-8文本需要是一个无符号字符数组.

Fre*_*Foo 6

签名不是正常的char吗?

无论charsigned或是依赖于实现unsigned.

此外,符号位不会"丢失",它仍然可以用于表示信息,并且char不一定是8位大(在某些平台上可能更大).


Ste*_*sop 6

这里有一个潜在的问题:

如果一个实现CHAR_BIT == 8使用符号幅度表示char(所以char有符号),那么当UTF-8需要位模式时10000000,那就是负0.所以如果实现进一步不支持负0,那么给定的UTF-8字符串可能包含无效(陷阱)值char,这是有问题的.即使它确实支持负零,比特模式10000000比较等于char比特模式00000000(nul终结符)的事实在使用UTF-8数据时也容易引起问题char[].

我认为这意味着对于符号级别的C11实现,char需要是无符号的.通常,无论char是有符号还是无符号,都取决于实现,但当然如果char签名导致无法正确实现UTF-8文字,那么实现者只需选择无符号.顺便说一句,这一直是C++的非2补码实现的情况,因为C++允许char以及unsigned char用于访问对象表示.C只允许unsigned char.

在2的补码和1的补码中,UTF-8数据所需的位模式是有效值signed char,因此实现可以自由地进行char有符号或无符号,并且仍然能够表示UTF-8字符串char[].这是因为所有256位模式都是有效的2的补码值,并且UTF-8恰好不使用该字节11111111(1s'补充负零).

  • @Mr Lister:我认为我的答案根本没有对实际实施的内容做出任何假设.它仅列举了他们(不)允许做的事情,特别是C11中支持UTF-8的要求最新排除的一种表示.出于所有实际目的,每个实现都是2的补充,但标准继续允许(愚蠢的)替代. (2认同)