[英]boost to_upper function of string_algo doesn't take into account the locale
我對string_algo包中的函數有問題。
考慮一下這段代碼:
#include <boost/algorithm/string.hpp>
int main() {
try{
string s = "meißen";
locale l("de_DE.UTF-8");
to_upper(s, l);
cout << s << endl;
catch(std::runtime_error& e){
cerr << e.what() << endl;
}
try{
string s = "composición";
locale l("es_CO.UTF-8");
to_upper(s, l);
cout << s << endl;
catch(std::runtime_error& e){
cerr << e.what() << endl;
}
}
此代碼的預期輸出將是:
MEISSEN
COMPOSICIÓN
但我唯一得到的是
MEIßEN
COMPOSICIóN
所以,顯然沒有考慮到語言環境。 我甚至嘗試設置全局語言環境沒有成功。 我能做什么?
除了ÉricMalenfant的答案 - std::locale
facets適用於單個字符。 為了獲得更好的結果,你可以使用std::wstring
- 因此會轉換更多的字符,但正如你所看到的那樣仍然不完美(例如ß)。
我建議嘗試一下Boost.Locale(用於提升的新庫,還沒有用於提升),這樣做有用
http://cppcms.sourceforge.net/boost_locale/docs/ ,
特別是請參閱http://cppcms.sourceforge.net/boost_locale/docs/index.html#conversions來處理您正在討論的問題。
std :: toupper假定轉換為1:1,所以對於ß到SS的情況,Boost.StringAlgo沒有希望。
看看StringAlgo的代碼 ,我們看到它確實使用了語言環境(看起來除了Borland之外)。 所以,對於另一種情況,我很好奇:你的平台上toupper('ó', std::locale("es_CO.UTF-8"))
是什么?
寫上面的內容讓我想到了其他的東西:源代碼中字符串的編碼是什么? UTF8? 在這種情況下,std :: toupper會看到'ó'的兩個代碼單元,所以沒有希望。 Latin1的? 在這種情況下,使用名為“.UTF-8”的區域設置是不一致的。
您可以使用boost :: locale。 這是一個例子。
在標准庫中有std :: toupper(boost :: to_upper使用),它一次對一個字符進行操作。
這解釋了為什么ß不起作用。 你沒有說你正在使用哪個標准庫和代碼頁,所以我不知道為什么ó不起作用。
如果你使用wstring會發生什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.