繁体   English   中英

多字节字符串和普通字符串

[英]Multibyte strings and ordinary string

我不明白对于C,每个字符串是否始终都是多字节字符串,这意味着它们被编码为多字节字符:

char s[] = "AAA"; 

char m[] = "X生";

s还一个多字节字符串也如果它不包含一个扩展字符集等的构件m

我有这个疑问,因为我从libc手册中读到了以下内容:

字符串”通常是指多字节字符串,而不是宽字符串。 宽字符串是wchar_t类型的数组,对于多字节字符串,通常使用wchar_t *类型的指针。

所以我不明白多字节是否指向宽字符串编码方面的字符串字节(其编号)。

因此, C99草案标准C11看起来相同 )定义了多字节字符,如下所示:

一个或多个字节的序列,表示源或执行环境的扩展字符集的成员

因此, 多字节字符是扩展字符集的一部分,因此s不是由多字节字符组成。

5.2.1.2节进一步定义了多字节字符

源字符集可以包含多字节字符,用于表示扩展字符集的成员。 执行字符集还可以包含多字节字符,这些字符不必具有与源字符集相同的编码。 对于这两个字符集,以下内容均适用:

  • 基本字符集应存在,每个字符应编码为一个字节。

  • 任何其他成员的存在,含义和表示形式都是特定的区域设置。

  • 多字节字符集可以具有与状态有关的编码,其中,当多字节字符序列中遇到特定的多字节字符时,每个序列的字节都以初始移位状态开始,并进入其他特定于语言环境的移位状态。 在初始移位状态时,所有单字节字符都保留其通常的解释,并且不会更改移位状态。 序列中后续字节的解释是当前移位状态的函数。

  • 全比特为零的字节应被解释为与移位状态无关的空字符。 这样的字节不得作为任何其他多字节字符的一部分出现。

您可以轻松地测试一个字符串有多少字节。 如果我在计算机上使用以下代码对其进行编译:

char s[] = "AAA";
char m[] = "X生";
printf("s: %d\n", sizeof(s));
printf("m: %d\n", sizeof(m));

结果我将得到输出

s: 4
m: 5

这意味着“ s”不是多字节字符串,而“ m”是。 为了确保您的编译器/系统的行为相同,我将在您的系统上对其进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM