【发布时间】:2016-03-24 14:13:44
【问题描述】:
我正在做一个项目,其中区分大小写的操作需要替换为不区分大小写的操作。在对此进行了一些阅读之后,要考虑的数据类型是:
- ASCII 字符
- 非 ASCII 字符
- Unicode 字符
如果我遗漏了列表中的任何内容,请告诉我。
以上是否需要单独处理,或者是否有 C++ 库可以处理所有这些而不考虑数据类型?
具体来说:
boost 库是否对此提供支持?如果有,是否有关于如何使用 API 的示例或文档?
我了解了 IBM 的 Unicode 国际组件 (ICU)。这是一个为不区分大小写的操作提供支持的库吗?如果有,是否有关于如何使用 API 的示例或文档?
最后,在上述(和其他)方法中,哪种方法更好,为什么?
谢谢!
根据cmets和答案,我写了一个示例程序来更好地理解这一点:
#include <iostream> // std::cout
#include <string> // std::string
#include <locale> // std::locale, std::tolower
using namespace std;
void ascii_to_lower(string& str)
{
std::locale loc;
std::cout << "Ascii string: " << str;
std::cout << "Lower case: ";
for (std::string::size_type i=0; i<str.length(); ++i)
std::cout << std::tolower(str[i],loc);
return;
}
void non_ascii_to_lower(void)
{
std::locale::global(std::locale("en_US.UTF-8"));
std::wcout.imbue(std::locale());
const std::ctype<wchar_t>& f = std::use_facet<std::ctype<wchar_t> >(std::local
std::wstring str = L"Zoë Saldaña played in La maldición del padre Cardona.";
std::wcout << endl << "Non-Ascii string: " << str << endl;
f.tolower(&str[0], &str[0] + str.size());
std::wcout << "Lower case: " << str << endl;
return;
}
void non_ascii_to_upper(void)
{
std::locale::global(std::locale("en_US.UTF-8"));
std::wcout.imbue(std::locale());
const std::ctype<wchar_t>& f = std::use_facet<std::ctype<wchar_t> >(std::local
std::wstring str = L"¥£ªÄë";
std::wcout << endl << "Non-Ascii string: " << str << endl;
f.toupper(&str[0], &str[0] + str.size());
std::wcout << "Upper case: " << str << endl;
return;
}
int main ()
{
string str="Test String.\n";
ascii_to_lower(str);
non_ascii_to_upper();
non_ascii_to_lower();
return 0;
}
输出是:
Ascii 字符串:测试字符串。 小写:测试字符串。
非ASCII字符串:▒▒▒▒▒ 大写:▒▒▒▒▒
非 Ascii 字符串:Zo▒ Salda▒a 在 La maldici▒n del padre Cardona 中演奏。 小写:zo▒ salda▒a 在 la maldici▒n del padre cardona 演奏。
非 ascii 字符串,虽然似乎被转换为大小写,但有些文本在输出中不可见。为什么是这样?
总体来说,示例代码看起来还可以吗?
【问题讨论】:
-
您可以将 ASCII 和非 ASCII 转换为 utf-32,并将它们与 unicode 字符串本身一起视为 std::wstring。您可以使用 std::to_lower 删除大小写因素。
-
@LibertyPaul 你的意思是
std::u32string? -
@LibertyPaul wchart_t 在 Windows 上不是 32 位。
-
@LibertyPaul 当它最初在 15 年前创建时,wchar_t 能够处理所有定义的代码点,但现在不行了。这个请求的真正问题是许多语言对大小写转换都有上下文要求 - 例如希腊语中的大写 sigma 0x3A3 应该变成 0x03C3 或 0x03C2,这取决于它是否位于单词的末尾。这个用例是什么 - 它是一个必须支持任何字符集/语言的国际应用程序,还是其他什么?
-
unicode大小写被this thread覆盖
标签: c++ case-insensitive icu