字符串如何与非ascii符号一起工作,而char则不能

How does string work with non-ascii symbols while char does not?

本文关键字:工作 char 不能 一起 符号 ascii 字符串      更新时间:2023-10-16

我知道C++中的char只是一个整数类型,它将ASCII符号存储为0到127之间的数字。斯堪的纳维亚字母"æ"、"ø"answers"å"不在ASCII表的128个符号中。

所以,当我尝试char ch1 = 'ø'时,我自然会遇到编译器错误,然而string str = "øæå"工作得很好,即使字符串使用了char,对吗?

string会以某种方式切换到Unicode吗?

在C++中,有源字符集执行字符集。源字符集是您可以在源代码中使用的字符集;但这并不一定与运行时可用的字符一致。

它的实现定义了如果在源代码中使用不在源字符集中的字符会发生什么。显然'ø'不在编译器的源字符集中,否则就不会出现错误;这意味着编译器的文档应该包括它对这两个代码示例所做操作的解释。您可能会发现str中确实有某种字节序列,这些字节形成了一个字符串。

为了避免这种情况,您可以使用字符文字,而不是在源代码中嵌入字符,在本例中为'xF8'。如果需要使用不在执行字符集中的字符,可以使用wchar_twstring

来自源代码char c = 'ø';:

source_file.cpp:2:12: error: character too large for enclosing character literal type
  char c = '<U+00F8>';
           ^

这里发生的情况是,编译器正在转换源代码编码中的字符,并使用适合单个char的执行编码来确定没有该字符的表示。(请注意,此错误与c的初始化无关,任何此类字符文字都会发生此错误。示例)

然而,当您将这些字符放入字符串文本而不是字符文本中时,编译器从源编码到执行编码的转换非常乐意在执行编码为多字节(如UTF-8)时使用字符的多字节表示。

为了更好地理解编译器在这方面的作用,您应该从阅读C++标准中的第2.3条[lex.charsets]、第2.14.3条[lex.con]和第2.14.5条[lex.string]开始。

这里可能发生的情况是,源文件被编码为UTF-8或其他一些多字节字符编码,编译器只是将其视为一个字节序列。一个char只能是一个字节,但一个字符串非常乐意拥有所需的字节数。

C++的ASCII只有128个字符。如果你想要"ø",它是ASCII-EXTENDED 248(255),它是8位(不是字符值),包括ASCII中的7位。您可以尝试char ch1 ='xD8';