假设我有一个 UTF-8 编码的 std::string
包含以下内容:
óó
我想将其转换为以下内容:
ÓÓ
理想情况下,我希望我使用的大写/小写方法在所有 UTF-8 中都是通用的。如果这甚至可能的话。
字符串中的原始字节序列是 0xc3b3c3b3
(每个字符两个字节,以及 ó
的两个实例),我希望输出为 0xc393c393
( Ó
的两个实例。 StackOverflow 上有 一些示例,但它们使用宽字符串, 其他答案 说您不应该将宽字符串用于 UTF-8。看起来这个问题可能非常“棘手”,因为输出可能取决于用户的语言环境。
我原本希望只使用 std::toupper()
之类的东西,但我真的不清楚它的用法,因为我似乎不只是一次转换一个字符,而是一个完整的字符串。另外,我放在一起的这个 Ideone 示例 似乎表明 toupper()
of 0xc3b3
只是 0xc3b3
,这是一个意想不到的结果。调用 setlocale
到 UTF-8 或 ISO8859-1 似乎不会改变结果。
如果您能阐明我做错了什么或为什么我的问题/前提有问题,我会很乐意提供一些指导!
原文由 aardvarkk 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++ 中没有进行 Unicode 大小写转换的标准方法。有些方法适用于 某些 C++ 实现,但标准并不要求它们这样做。
如果您想要保证 Unicode 大小写转换,您将需要使用 ICU 或 Boost.Locale 之类的库(又名:ICU 具有更类似于 C++ 的界面)。