Jon*_*Mee 20 c++ string locale ctype tolower
鉴于string foo
,我已经写了关于如何使用's 将字符转换为小写的答案cctype
tolower
transform(cbegin(foo), cend(foo), begin(foo), static_cast<int (*)(int)>(tolower))
Run Code Online (Sandbox Code Playgroud)
但我已经开始考虑 locale
的tolower
,这可以这样使用:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), foo.size()));
Run Code Online (Sandbox Code Playgroud)
tolower
接受并返回一个int
我认为只是一些过时的C东西的事实?小智 6
不幸的是,两者都同样糟糕.虽然std::string
假装是一个utf-8编码的字符串,但是没有方法/功能(包括tolower),真的是utf-8.因此,tolower
/ tolower
+ locale可能与单字节(= ASCII)的字符一起使用,对于每一组其他语言,它们都会失败.
在Linux上,我使用ICU库.在Windows上,我使用CharUpper
函数.
应该指出的是,语言设计者知道scctype
的创建时间tolower
。它在两个主要方面进行了改进:locale
tolower
locale
版本允许使用facet ctype
,即使用户修改了该版本,也不需要重新洗牌新的LC_CTYPE
过孔setlocale
并恢复之前的过孔LC_CTYPE
char
类型对象是否表示为有符号数量或无符号数量是由实现定义的。说明符signed
强制char
对对象进行签名
如果它是参数,则 scctype
的版本可能会产生未定义行为的可能性:tolower
不能表示为
unsigned char
且不等于EOF
因此,yield版本static_cast
需要额外的输入和输出:cctype
tolower
transform(cbegin(foo), cend(foo), begin(foo), [](const unsigned char i){ return tolower(i); });
Run Code Online (Sandbox Code Playgroud)
由于locale
版本直接在char
s 上运行,因此不需要类型转换。
因此,如果您不需要以不同的方式执行转换,facet ctype
那么它就变成了一个风格问题,即您是否更喜欢版本transform
所需的 lambda cctype
,或者您是否更喜欢locale
版本的:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), size(foo)));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1301 次 |
最近记录: |