我正在開發一個項目,其中區分大小寫的操作需要替換爲不區分大小寫的操作。在此做一些閱讀後,要考慮數據的類型有:不區分大小寫的操作
- Ascii字符
- 非ASCII字符
- Unicode字符
請讓我知道,如果我錯過了列表中的任何內容。
以上需要單獨處理還是有C++庫可以處理它們而不涉及數據類型?
具體做法是:
是否Boost庫爲此提供支持?如果是這樣,是否有示例或關於如何使用API的文檔?
我瞭解了IBM的Unicode國際組件(ICU)。這是一個爲不區分大小寫的操作提供支持的庫嗎?如果是這樣,是否有示例或關於如何使用API的文檔?
最後,上述(和其他)方法中的哪一種更好,爲什麼?
謝謝!
基礎上的意見和答案,我寫了一個示例程序,爲了更好地理解:
#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在Lamaldici▒n德爾帕德里卡多納播放。 小寫字母:zoalsalda▒a在la maldici?n del padre cardona中演奏。
雖然非ascii字符串似乎轉換爲大寫和小寫,但某些文本在輸出中不可見。爲什麼是這樣?
總的來說,示例代碼看起來好嗎?
您可以將ASCII和非ASCII轉換爲utf-32,並將它們與unicode字符串本身作爲std :: wstring對待。你可以使用std :: to_lower去除大小寫因子。 – LibertyPaul
@LibertyPaul你的意思是'std :: u32string'? – Simple
@Simple wstring是basic_string這是32位,但是,是的,u32string是一個很好的建議。 –
LibertyPaul