string_algo的boost to_upper函数没有考虑语言环境

时间:2009-11-20 14:26:40

标签: c++ string boost internationalization

我对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

所以,显然没有考虑到语言环境。我甚至尝试设置全局语言环境没有成功。我该怎么办?

4 个答案:

答案 0 :(得分:3)

除了ÉricMalenfant的答案 - std::locale方面适用于单个角色。为了获得更好的结果,您可以使用std::wstring - 因此可以转换更多字符,但正如您所看到的那样仍然不完美(例如ß)。

我建议尝试一下Boost.Locale(用于提升的新库,还没有用于提升),这可以做什么

http://cppcms.sourceforge.net/boost_locale/docs/

特别是请参阅http://cppcms.sourceforge.net/boost_locale/docs/index.html#conversions来解决您所谈论的问题。

答案 1 :(得分:1)

std :: toupper假定转换为1:1,因此对于ß到SS的情况,Boost.StringAlgo没有希望。

查看StringAlgo's code,我们看到它确实使用了区域设置(看起来除了Borland之外)。所以,对于另一种情况,我很好奇:你平台上toupper('ó', std::locale("es_CO.UTF-8"))的结果是什么?

编写上述内容让我想到了其他内容:源代码中字符串的编码是什么? UTF8?在这种情况下,std :: toupper会看到'ó'的两个代码单元,所以没有希望。 Latin1的?在这种情况下,使用名为“.UTF-8”的区域设置是不一致的。

答案 2 :(得分:0)

在标准库中有std :: toupper(boost :: to_upper使用),它一次对一个字符进行操作。

这解释了为什么ß不起作用。你没有说你正在使用哪个标准库和代码页,所以我不知道为什么ó不起作用。

如果使用wstring会发生什么?

答案 3 :(得分:0)

您可以使用boost :: locale。 Here就是一个例子。