c++ towupper() 不转换某些字符

c++ towupper() doesn't convert certain characters

我使用 Borland C++ Builder 2009,我的应用程序被翻译成多种语言,包括波兰语。

对于一小部分功能,我使用 towuppper() 将字符串大写,以便在用户首次忽略时强调它。

原始字符串从语言 dll 加载到 utf16 wstring 对象中,我这样转换:

int length = mystring.length() ;
for (int x = 0 ; x < length ; x++)
    {
    mystring[x] = towupper(mystring[x]);
    }

所有这一切都很好,除了波兰语,其中以下句子:"Rozumiem ryzykowność wykonania tej operacji" 转换为 "ROZUMIEM RYZYKOWNOść WYKONANIA TEJ OPERACJI" 而不是 "ROZUMIEM RYZYKOWNOŚĆ WYKONANIA TEJ OPERACJI"

(注意单词 "ryzykowność" 的最后两个字符不会转换)。

并不是说这个字符没有大写的 Unicode 变体。 Unicode 字符 346 可以解决问题。 http://www.fileformat.info/info/unicode/char/015a/index.htm

这是我过时的编译器安装中的过时库的问题还是我遗漏了其他东西?

C++ 标准不需要 towupper 的实现来执行 Unicode 大小写转换。即使宽字符串是 Unicode 字符串。即使在一个小写代码点映射到一个大写代码点的情况下。

此外,towupper 无法执行正确的 Unicode 大小写转换,即使实现支持它也是如此。大小写转换实际上可以改变 Unicode 字符序列中代码点的数量。 towupper 做不到。

不能依赖 C++ 标准库来处理此类 Unicode 问题。您需要转移到专用的 Unicode 库,例如 ICU。

在 Windows 这将起作用: 编辑刚刚意识到您使用的是 Borland,而不是 Msvc。

 #include <cctype>
 #include <clocale>

 int main(int argc, char** argv)
 {
    setlocale(LC_ALL, "polish");

    wchar_t c[2] = { L'ś', L'ć'};
    wchar_t c1 = _towupper_l(c[0], _get_current_locale());
    wchar_t c2 = _towupper_l(c[1], _get_current_locale());

    return 0:
}

您首先需要使用 setlocale. And then use _towupper_l 将语言环境设置为 'polish'。 这里有一个 link 告诉你什么字符串,指的是一种特定的语言,可以与 setlocale.

一起使用

编辑: 请注意,如果我打印结果:

_wprintf_l(L" c1 = %c, c2 = %c\n", _get_current_locale(),  c1, c2);

输出将是:

c1 = S, c2 = C

但是如果我在调试器中观察 C1 和 C2 的值,我可以看到正确的结果,带有重音符号。我的控制台不会打印那种字符。