根据我的理解,a char是安全的容纳ASCII字符,char16_t而且char32_t可以安全地容纳来自unicode的字符,一个用于16位变体,另一个用于32位变量(我应该说"a"而不是"the" ?).但我当时想知道背后的目的wchar_t是什么.我应该在新代码中使用该类型,还是仅仅支持旧代码?wchar_t如果根据我的理解,它的大小不能保证大于一个,那么旧代码的目的是什么char?澄清会很好!
bam*_*s53 54
char用于8位代码单元,char16_t用于16位代码单元,char32_t用于32位代码单元.其中任何一个都可以用于'Unicode'; UTF-8使用8位代码单元,UTF-16使用16位代码单元,UTF-32使用32位代码单元.
所做的保证wchar_t是,语言环境中支持的任何字符都可以转换char为wchar_t,并且无论使用什么表示char,可以是多个字节,移位代码,有什么东西,wchar_t它将是单个不同的值.这样做的目的是,您可以wchar_t像使用ASCII的简单算法一样操纵字符串.
例如,将ascii转换为大写如下:
auto loc = std::locale("");
char s[] = "hello";
for (char &c : s) {
c = toupper(c, loc);
}
Run Code Online (Sandbox Code Playgroud)
但是这不会处理将UTF-8中的所有字符转换为大写,或者转换为其他一些编码(如Shift-JIS)中的所有字符.人们希望能够像这样将这些代码国际化:
auto loc = std::locale("");
wchar_t s[] = L"hello";
for (wchar_t &c : s) {
c = toupper(c, loc);
}
Run Code Online (Sandbox Code Playgroud)
所以每个wchar_t都是一个'字符',如果它有一个大写版本,那么它可以直接转换.不幸的是,这并不是真的有效; 例如,在某些语言中存在奇怪之处,例如德语字母ß,其中大写版本实际上是两个字符SS而不是单个字符.
因此,国际化的文本处理本质上比ASCII更难,并且不能像设计者那样真正简化wchar_t.因此wchar_t,广泛的字符一般提供的价值很小.
使用它们的唯一原因是它们已被烘焙到一些API和平台中.但是,我更喜欢在我自己的代码中坚持使用UTF-8,即使在这样的平台上进行开发,也只是在API边界转换为所需的编码.
Die*_*ühl 20
wchar_t当Unicode承诺创建16位表示时,该类型被置于标准中.大多数供应商选择制造wchar_t32位,但一家大型供应商选择将其制作为16位.由于Unicode使用超过16位(例如,20位),因此我们觉得我们应该有更好的字符类型.
意图char16_t是表示UTF16并且char32_t意味着直接表示Unicode字符.但是,在使用wchar_t作为基本界面一部分的系统上,您将被困在wchar_t.如果你不受约束,我个人会char用UTF8代表Unicode.这个问题char16_t和char32_t是它们不完全支持,甚至没有在标准C++库:比如,没有直接支持这些类型的流,它不仅仅是实例为这些类型的流更多的工作.
| 归档时间: |
|
| 查看次数: |
25090 次 |
| 最近记录: |