Unicode文字 - 这甚至有意义吗?

Ent*_*lpi 1 c++ unicode character-encoding

int main() {    
    std::cout << "\u2654" << std::endl; // Result #1: ?
    std::cout << U'\u2654' << std::endl; // Result #2: 9812
    std::cout << U'?' << std::endl; // Result #3: 9812
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我无法理解Unicode如何与C++一起工作.为什么文字输出终端中的文字?

我有点想要这样的事情;

char32_t txt_representation() { return /* Unicode codepoint */; } 
Run Code Online (Sandbox Code Playgroud)

注意:源是UTF-8,终端,坐在macOS Sierra,CLion上.

zwo*_*wol 7

C++在其类型系统中并没有真正的"字符"概念. char,wchar_t,char16_t,和char32_t都被认为是种整数.因此,字符文字一样'x',L'x',U'x'都是数字.有一个operator<<专门的char,这就是原因

cout << "endl is almost never necessary" << '\n';
Run Code Online (Sandbox Code Playgroud)

做同样的事情

cout << "endl is almost never necessary\n";
Run Code Online (Sandbox Code Playgroud)

但是没有类似的东西*char_t,所以你的宽字符文字正在被默默地转换成int并打印出来.我个人从不使用iostreams,因此我实际上并不知道如何说服operator<<打印数字作为其Unicode代码点,但可能有一些方法可以做到这一点.

类型系统中"字符串"和"整数数组"之间存在更强的区别,因此在提供字符串文字时,您可以获得预期的输出.但请注意,它cout << L"?"不会提供您期望的输出,cout << "?"甚至不能保证编译. cout << u8"?" 在符合C++ 11标准的系统上工作,其中窄字符编码实际上是UTF-8,但如果字符编码是其他的话,可能会产生mojibake.

(是的,这有点复杂,没有任何借口可以存在.这部分是因为从C继承的向后兼容性约束,部分是因为它在20世纪90年代全部设计,在Unicode接管世界之前,部分原因是C++字符串和流类中的许多设计错误都没有明显的错误,直到修复它们为时已晚.)