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

Pet*_*ter 6 c++ c++builder unicode-string

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

对于一小段功能,我使用towuppper()来大写字符串,在用户首次忽略时强调它.

原始字符串从一个语言DLL加载到utf16 wstring对象,我转换如下:

int length = mystring.length() ;
for (int x = 0 ; x < length ; x++)
    {
    mystring[x] = towupper(mystring[x]);
    }
Run Code Online (Sandbox Code Playgroud)

这一切运作良好,除了波兰,在下面的句子: "Rozumiemryzykownośćwykonania TEJ operacji"转换为"ROZUMIEM RYZYKOWNO SC的WYKONANIA TEJ OPERACJI",而不是"ROZUMIEM RYZYKOWNO SC WYKONANIA TEJ OPERACJI"

(请注意,"ryzykowność"这两个字的最后两个字符不会转换).

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

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

Nic*_*las 11

towupperC++标准不需要实现来执行Unicode大小写转换.即使宽字符串是Unicode字符串.即使在一个小写代码点与一个大写代码点匹配的情况下也是如此.

此外,towupper即使实现支持它,也无法执行正确的Unicode大小写转换.大小写转换实际上可以更改Unicode字符序列中的代码点数.并且towupper无法做到这一点.

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

  • @NicolBolas 这一切都取决于问题领域。如果您知道您将使用所有可能语言的有限子集,那么了解一种简单的方法是否适用于这些特定语言将很有用。 (2认同)