Tha*_*guy 6 c++ string char character-encoding non-ascii-characters
据我所知,char在C++中只是一个整数类型,它将ASCII符号存储为0到127之间的数字.斯堪的纳维亚字母'æ','ø'和'å'不在ASCII表中的128个符号中.
所以当我尝试自然会char ch1 = 'ø'得到一个编译器错误,但是string str = "øæå"工作正常,即使字符串使用了chars 吗?
是否string以某种方式切换到Unicode?
在C++中,有源字符集和执行字符集.您可以在源代码中使用源字符集; 但这不一定与运行时可用的字符一致.
它是实现定义的,如果您在源代码中使用不在源字符集中的字符会发生什么.显然'ø'不在您的编译器的源字符集中,否则您不会遇到错误; 这意味着您的编译器文档应该包含对这两个代码示例的作用的说明.可能你会发现它str确实有一些形成字符串的字节序列.
为避免这种情况,在这种情况下,您可以使用字符文字而不是在源代码中嵌入字符'\xF8'.如果您需要使用不在执行字符集中的字符,则可以使用wchar_t和wstring.
从源代码char c = 'ø';:
source_file.cpp:2:12: error: character too large for enclosing character literal type
char c = '<U+00F8>';
^
Run Code Online (Sandbox Code Playgroud)
这里发生的是编译器正在从源代码编码转换字符,并使用适合单个内部的执行编码确定没有该字符的表示char.(注意,这个错误与初始化没有任何关系c,它会发生在任何这样的字符文字中.例子)
但是,当您将这些字符放入字符串文字而不是字符文字时,编译器从源编码到执行编码的转换非常乐意在执行编码为多字节时使用字符的多字节表示,例如就像UTF-8一样.
为了更好地理解编译器在这个领域做了什么,你应该首先阅读C++标准中的2.3 [lex.charsets],2.14.3 [lex.ccon]和2.14.5 [lex.string].