1

当我想反转一个字符串时,我喜欢使用这段代码。[当我不使用]std::string或其他内置功能时C。作为一个初学者,当我最初想到这个时,我想到了ASCII桌子。我认为这也可以很好地工作Unicode。我假设因为值的差异(ASCII 等)是固定的,所以它可以工作。

是否有任何字符编码可能无法使用此代码?

char a[11],t;
int len,i;
strcpy(a,"Particl");    
printf("%s\n",a);
len = strlen(a);
for(i=0;i<(len/2);i++)
{
    a[i] += a[len-1-i];
    a[len-1-i] = a[i] - a[len-1-i];
    a[i] -= a[len-1-i];
}
printf("%s\n",a);

更新:

这个链接是与这个问题相关的信息。

4

1 回答 1

9

这不适用于某些(不一定是所有)代码点需要多个char单元来表示的任何编码,因为您正在逐字节反转而不是逐个代码点。对于通常的 8 位,char这包括可以表示所有 Unicode 的所有编码。

例如:在 UTF-16BE 中,字符串“hello”映射到字节序列00 68 00 65 00 6c 00 6c 00 6f。你的算法应用于这个字节序列将产生序列6f 00 6c 00 6c 00 65 00 68 00,这是字符串“漀氀氀攀栀”的UTF-16BE编码。

情况变得更糟——对 Unicode 字符串进行逐个代码点的反转仍然不会在所有情况下产生正确的结果,因为 Unicode 有许多代码点作用于其周围环境,而不是作为字符单独存在。举个简单的例子,对包含 U+0308 COMBINING DIAERESIS 的字符串“Spın̈al Tap”进行代码点反转,将产生“paT länıpS”——看看分音符是如何从 N 迁移到 A 的?在包含双向覆盖或连接 jamo 的字符串上逐个代码点反转的后果将更加可怕。

于 2013-05-14T15:32:28.347 回答