人们发现在 C++ 中将字符串转换为小写/大写的最佳方法是什么?

由于 C++ 并不是一种纯英语编程语言,因此问题变得更加复杂。有没有好的多语言方法?

有帮助吗?

解决方案

#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);

http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/

另外,常见字符串方法的 CodeProject 文章: http://www.codeproject.com/KB/stl/STL_string_util.aspx

其他提示

> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

这可以工作,但是这将使用标准的“C”语言环境。如果您需要获取另一个区域设置的 tolower,则可以使用构面。上面使用方面的代码将是:

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

对于希望使用 Nic Strong 的答案的复制粘贴者,请注意“use_factet”中的拼写错误以及 std::transform 缺少的第三个参数:

locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

应该

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

您还应该回顾一下 这个问题. 。基本上,问题在于标准 C/C++ 库不是为处理 Unicode 数据而构建的,因此您必须寻找其他库。

随着 C++ 标准的更新,这可能会发生变化。我知道 Borland (CodeGear) 的下一个编译器将支持 Unicode,并且我猜测 Microsoft 的 C++ 编译器将具有或已经具有支持 Unicode 的字符串库。

正如 Darren 告诉您的,最简单的方法是使用 std::transform。

但请注意,在某些语言中,例如德语,小写和大写之间并不总是存在一对一的映射。“esset”小写字符(看起来像希腊字符 beta)被转换为大写“SS”。

如果你有Boost,那么它有最简单的方法。看一下 Boost 字符串算法中的 to_upper()/to_lower().

我找到了一种转换 unicode (和多语言)字符大小写的方法,但您需要知道/找到(以某种方式)字符的区域设置:

#include <locale.h>

_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);

我还没有找到办法做到这一点......我有人知道怎么做,请告诉我。

将区域设置设置为 NULL 不起作用...

VCL 有一个 SysUtils.hpp 其中有 LowerCase(unicodeStringVar)UpperCase(unicodeStringVar) 这可能对你有用。我在 C++ Builder 2009 中使用它。

Steve 说的是对的,但我想如果你的代码必须支持多种语言,你可以有一个工厂方法来封装一组方法,这些方法根据该语言执行相关的 toUpper 或 toLower 操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top