我知道C ++中的char
只是一个整数类型,它将ASCII符号存储为0到127之间的数字。斯堪的纳维亚字母'æ','ø'和'å'不属于128 ASCII表中的符号。
当我尝试char ch1 = 'ø'
时,我自然会遇到编译错误,但string str = "øæå"
工作正常,即使字符串使用了char
s right?
string
会以某种方式切换到Unicode吗?
答案 0 :(得分:6)
在C ++中,有源字符集和执行字符集。您可以在源代码中使用源字符集;但这并不一定要与运行时可用的字符一致。
它的实现 - 定义了如果您在源代码中使用不在源字符集中的字符会发生什么。显然'ø'
不在编译器的源字符集中,否则你不会出错;这意味着您的编译器文档应该包含对它们对这两个代码示例的作用的解释。可能你会发现str
确实有一些形成字符串的字节序列。
为避免这种情况,您可以使用字符文字而不是在源代码中嵌入字符,在本例中为'\xF8'
。如果您需要使用不在执行字符集中的字符,则可以使用wchar_t
和wstring
。
答案 1 :(得分:6)
来自源代码char c = 'ø';
:
source_file.cpp:2:12: error: character too large for enclosing character literal type
char c = '<U+00F8>';
^
这里发生的是编译器正在从源代码编码转换字符,并使用适合单个char
的执行编码确定没有该字符的表示。 (请注意,此错误与c
的初始化无关,任何此类字符文字都会发生这种情况。examples)
然而,当您将这些字符放入字符串文字而不是字符文字时,编译器从源编码到执行编码的转换非常乐意在执行编码为多个时使用字符的多字节表示字节,例如UTF-8是。
为了更好地理解编译器在这个领域做了什么,你应该首先阅读C ++标准中的2.3 [lex.charsets],2.14.3 [lex.ccon]和2.14.5 [lex.string]。
答案 2 :(得分:4)
这里可能发生的事情是您的源文件被编码为UTF-8或其他一些多字节字符编码,编译器只是将其视为一个字节序列。单个char
只能是一个字节,但字符串非常乐意为所需的字节数。
答案 3 :(得分:0)
ASCII for C ++只有128个字符。
如果你想要'ø'是ASCII-EXTENDED 248(255),它是8位(不是字符值),包括ASCII的7位。
你可以尝试char ch1 ='\xD8';