如何在C ++中更改拉丁文UTF-8字符串的大小写?

时间:2012-05-17 23:56:29

标签: c++ stl utf-8

在Objective-C中,它很简单:

NSLog(@"%@", [@"BAÑO" lowercaseString]);  // Outputs "baño".

在C ++中,什么是等效的?任何人都可以为此提供产生相同输出的有效代码吗?有没有一个很好的STL方法来做到这一点,而不依赖于ICU,Boost或任何其他第三方库?

我目前的非解决方案是:

using namespace std;
string s = "BAÑO";
wstring w(s.begin(), s.end());
transform(w.begin(), w.end(), w.begin(), towlower);
// w contains "baÑo"

2 个答案:

答案 0 :(得分:5)

问题在C ++中变得非常复杂。我所知道的只有一个库可以考虑到unicode规范化和其他非低128-ASCII字符点问题。

IBM's ICU

它很大但它能正确地完成所有事情。不幸的是,toupper和tolower在这个问题上不尽如人意,而且没有其他的C ++结构可用。

答案 1 :(得分:2)

tolower,这是特定于语言环境的,但我认为它不适用于UTF-8字符串。

正确的解决方案始终是特定于语言环境的,因为案例规则取决于语言。例如,'I'的小写版本并不总是'i'。