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

时间:2015-01-26 12:46:26

标签: c

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

char s[] = "AAA"; 

char m[] = "X生";
如果

不包含像s这样的扩展字符集的成员,那么

也是多字节字符串吗?

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

  

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

所以我不明白多字节是否将字符串的字节(它们的编号)引用到宽字符串的编码方面。

2 个答案:

答案 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"是。为了确保您的编译器/系统的行为方式相同,我只需在您的系统上进行测试。