字符编码独立字符交换

时间:2013-05-14 15:28:26

标签: c++ c character-encoding

当我想要反转一个字符串时,我喜欢使用这段代码。 [当我在[{1}}] 中没有使用std::string或其他内置函数时。作为初学者,当我最初想到这一点时,我考虑了C表。我认为这也适用于ASCII。我假设因为值(ASCII等)的差异是固定的,所以它可以工作。

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

Unicode

更新:

link与此问题相关。

1 个答案:

答案 0 :(得分: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的字符串进行代码点反转的后果将更加可怕。