我不明白,对于C,每个字符串总是一个多字节字符串,这意味着它们被编码为多字节字符:
char s[] = "AAA";
char m[] = "X生";
如果不包含像s
这样的扩展字符集的成员,那么
也是多字节字符串吗?
我有这个疑问,因为我从libc手册中读到了这个:
string“通常是指多字节字符串而不是 宽字符串。宽字符串是类型的数组 wchar_t和多字节字符串通常是指针 使用了类型wchar_t *。
所以我不明白多字节是否将字符串的字节(它们的编号)引用到宽字符串的编码方面。
答案 0 :(得分:3)
所以C99 draft standard( C11看起来相同)定义了多字节字符,如下所示:
表示扩展字符集成员的一个或多个字节的序列 源或执行环境
因此多字节字符是扩展字符集的一部分,因此s
不是由多字节字符组成的。
多字节字符在第5.2.1.2
部分中进一步定义:
源字符集可能包含多字节字符,用于 表示扩展字符集的成员。执行 字符集也可能包含多字节字符,不需要 具有与源字符集相同的编码。对彼此而言 字符集,以下内容:
基本字符集应存在,每个字符应编码为单个字节。
任何其他成员的存在,含义和代表性都是特定地区。
多字节字符集可能具有依赖于状态的编码,其中每个多字节字符序列始于初始值 转换状态并进入其他特定于语言环境的转换状态 序列中遇到特定的多字节字符。而 在初始移位状态下,所有单字节字符都保留它们 通常的解释,不要改变班次状态。该 对序列中后续字节的解释是函数 当前的转变状态。
所有位为零的字节应解释为空字符 独立于班次状态。这样的字节不应作为任何一部分出现 其他多字节字符。
答案 1 :(得分:1)
您可以轻松尝试测试字符串的字节数。如果我使用以下代码在我的机器上编译它:
char s[] = "AAA";
char m[] = "X生";
printf("s: %d\n", sizeof(s));
printf("m: %d\n", sizeof(m));
我得到输出结果
s: 4
m: 5
这意味着" s"不是多字节字符串,而是" m"是。为了确保您的编译器/系统的行为方式相同,我只需在您的系统上进行测试。