字符编码独立字符交换

Suv*_*yil 1 c c++ character-encoding

当我想要反转字符串时,我喜欢使用这段代码.[当我不使用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);
Run Code Online (Sandbox Code Playgroud)

更新:

链接与此问题相关.

zwo*_*wol 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有许多代码点可以作用于它们的周围而不是单独作为字符.作为一个简单的例子,代码点 - 反转字符串"Spın̈alTap",其中包含U + 0308 COMBINING DIAERESIS,将产生"patlänıpS" - 看看分音符如何从N迁移到A?对包含双向覆盖或连接jamo的字符串进行代码点反转的后果将更加可怕.