C++字符如何区分ASCII和UNICODE
How does C++ char distinguish ASCII and UNICODE
我目前正在用c++编写一个同时处理字母和朝鲜语字符的程序。
然而,我了解到c++中char
的大小只有1个字节。这意味着,为了处理外来字符或UNICODE,它需要为一个字符使用两个字符。
string s = string("a가b나c다");
cout<< s.length();
打印9
但我的问题是,c++执行如何区分这两种不同类型的字符?
例如,如果我制作一个9大小的char数组,它如何知道它的9个ascii字符还是4个unicode+1个ascii??
然后我发现了这个:
char c;
int a;
char* cp = "가나다라마바사아";
for (int i = 0; i < 20; i++) {
c = a = cp[i];
cout << "n c val : " << c;
cout << "n a val : " << a;
}
仅打印a.的负值
c val :
a val : -80
c val :
a val : -95
c val :
a val : -77
c val :
a val : -86
c val :
a val : -76
c val :
a val : -39
我可以推断,对于非ascii字符,它只使用负值?但这不是很浪费吗?
总之,我的问题是:c++是否只通过查看ascii字符和unicode字符是否为负数来区分它们?
总结答案:解析器通过查找字符的前几位来决定是否将1~4个字符视为1个字形,因此在某种程度上我的假设是有效的。
c++执行如何区分两种不同类型的字符?
没有。编译器决定在编译时将字符串编码为Unicode。在这种情况下,它似乎选择了UTF-8。
它如何知道它的9个ascii字符还是4个unicode+1个ascii??
同样,它没有。您的字符串包含9个字符值(不包括任何终止字符)。表示的实际"字符"(或"字形")的数量只能通过解析字符串来确定。如果您知道它是UTF-8,那么您可以相应地对其进行解析。
我可以推断出,对于非ascii字符,它只使用负值吗?但这不是很浪费吗?
否。嗯,有点。如果您感兴趣,请阅读Unicode(特别是UTF-8)入门知识。你可以阅读实际的标准,但它是巨大的。维基百科应该足以更好地理解。
您将看到多字节字符串具有高位集。这使得正确解析多字节值成为可能。这并没有那么浪费,因为标准的排列方式通常是为不太常见的值保留更宽的编码。
它输出负数的原因是您使用的是带符号的char
类型。如果您转换为unsigned
,您将看到这些值只是大于127。当你读到更多关于UTF-8编码的信息时,你就会明白为什么了。
我的问题是:c++是否只通过查看ascii字符和unicode字符是否为负数来区分它们?
我的回答是:不。"否定"是一个数字系统。你可能已经习惯了2的补码。编码,或者不编码:不存在"负"。
- C++ - Unicode Newline
- ascii 和 unicode 在处理级别有什么区别吗?
- C++字符如何区分ASCII和UNICODE
- 从ASCII到Unicode字符代码的转换(FreeType2)
- 如何打印混合 ASCII 字符和 Unicode 的字符串的每个字符
- C++设计:设计支持Unicode消息以及ASCII消息
- regex:在ascii和unicode之间切换
- wostringstream,Ascii,Unicode,Win32和整数连接到字符串
- 奇怪的ASCII/Unicode字符
- 如何禁用更改Unicode或ASCII函数名的MFC宏
- 转换带有 ASCII/UTF8 重音符号的 Unicode 字母
- fstream::open() Unicode 或非 ASCII 字符在 Windows 上不起作用(使用 std::ios::out)
- ASCII 码等同于 Java 中的 unicode 字符
- 将 MFC 的 CString 转换为 ASCII 和 UNICODE 的 int
- 将unicode(带BOM)字符串转换为ASCII std::string
- POSIX regex.h提供unicode字符还是基本上是非ascii字符?
- 如何将ASCII保存为C/ c++ (cpp)中的Unicode (UTF-16LE)
- 我可以使用什么winapi C函数调用来将unicode转换为ascii,反之亦然
- 将一个 UNICODE 字符转换为两个 ASCII 字符
- 将C win32 api unicode转换为ascii