簡體   English   中英

string_algo的boost to_upper函數沒有考慮語言環境

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM