字符串如何与非ascii符号一起工作,而char则不能
How does string work with non-ascii symbols while char does not?
我知道C++中的char
只是一个整数类型,它将ASCII符号存储为0到127之间的数字。斯堪的纳维亚字母"æ"、"ø"answers"å"不在ASCII表的128个符号中。
所以,当我尝试char ch1 = 'ø'
时,我自然会遇到编译器错误,然而string str = "øæå"
工作得很好,即使字符串使用了char
,对吗?
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>';
^
这里发生的情况是,编译器正在转换源代码编码中的字符,并使用适合单个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';
- 将双精度值转换为 char 变量时字符串流如何工作
- strcmp/char* 转换无法按预期工作
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 这个函数是如何工作的? char* getname();C++
- char* 如何读取十六进制的这个整数?它在 ostream::write() 中是如何工作的
- CIN正在为char阵列工作,但不为int阵列工作
- C++ extern const char* 未按预期工作
- strcat 3 char从char []到char *在Windows上工作,但在Cygwin中给出了细分故障
- 文件名如何在"char"和2字节字符之间工作
- 在 std::map 中使用 char* 作为键,它是如何工作的
- C++指针给出数据类型为"int"的错误,但与"char"一起工作正常
- 为什么 std::codecvt<wchar_t、char、mbstate_t> 不能按定义工作?
- 家庭工作:将一个文件读取到指向指针char(char**)的指针中
- 采用“std::string”的显式构造函数得到“char*”,工作正常
- char和wchar_t之间的转换在Windows中是如何工作的
- const char*和字符串比较在C++中是如何工作的
- c++将字符串转换为char不能工作
- 将char数组(或某些字节)视为struct对象.它是如何工作的
- 从char*到wchar*的转换不能正常工作
- 'TypeInfo<char>(char *)'没有定义,但在 C++11 之前工作;发生了什么更改,如何修复错误?