首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多字节字符串和普通字符串

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

Stack Overflow用户
提问于 2015-01-26 12:46:25
回答 2查看 3.9K关注 0票数 1

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

代码语言:javascript
运行
复制
char s[] = "AAA"; 

char m[] = "X生";

如果s不包含像m这样的扩展字符集的成员,那么它也是一个多字节字符串吗?

我对此表示怀疑,因为我阅读了libc手册中的以下内容:

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

因此,我不明白多字节是否被引用到宽字符串的编码方面的字符串(它们的编号)的字节。

EN

回答 2

Stack Overflow用户

发布于 2015-01-26 13:06:38

因此,C99标准草案 (C11看起来一样)定义多字节字符如下:

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

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

多字节字符在5.2.1.2节中进一步定义。

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

  • 基本字符集应存在,每个字符应编码为一个字节。
  • 任何附加成员的存在、意义和表示都是特定的。
  • 多字节字符集可以具有状态相关的编码,其中每个多字节字符序列从初始移位状态开始,当在序列中遇到特定的多字节字符时,进入其他特定于地区的移位状态。当处于初始的shift状态时,所有的单字节字符都保留其通常的解释,并且不改变shift状态。序列中后续字节的解释是当前移位状态的函数。
  • 所有位为零的字节将被解释为与shift状态无关的空字符。这种字节不应作为任何其他多字节字符的一部分出现。
票数 3
EN

Stack Overflow用户

发布于 2015-01-26 12:58:28

您可以很容易地尝试测试一个字符串有多少字节。如果我用以下代码在我的机器上编译它:

代码语言:javascript
运行
复制
char s[] = "AAA";
char m[] = "X生";
printf("s: %d\n", sizeof(s));
printf("m: %d\n", sizeof(m));

因此我会得到输出

代码语言:javascript
运行
复制
s: 4
m: 5

这意味着"s“不是多字节字符串,而是"m”。为了确保编译器/系统的行为方式相同,我只需要在您的系统上测试它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28150386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档