当我想要反转一个字符串时,我喜欢使用这段代码。 [当我在[{1}}] 中没有使用std::string
或其他内置函数时。作为初学者,当我最初想到这一点时,我考虑了C
表。我认为这也适用于ASCII
。我假设因为值(ASCII等)的差异是固定的,所以它可以工作。
是否有任何字符编码可能无法使用此代码?
Unicode
更新:
此link与此问题相关。 子>
答案 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的字符串进行代码点反转的后果将更加可怕。