最近,有人问了一个 algorithm for reversing a string in place in C .大多数建议的解决方案在处理非单字节字符串时都会遇到麻烦。所以,我想知道什么是专门处理 utf-8 字符串的好算法。
我想出了一些代码,我将其作为答案发布,但我很高兴看到其他人的想法或建议。我更喜欢使用实际代码,所以我选择了 C#,因为它似乎是该站点中最受欢迎的语言之一,但我不介意您的代码是否使用另一种语言,只要它合理任何熟悉命令式语言的人都能理解。而且,由于这是为了了解如何在低级别实现这种算法(低级别我指的是处理字节),因此我们的想法是避免将库用于核心代码。
注意事项:
我对算法本身、它的性能以及如何对其进行优化很感兴趣(我的意思是算法级优化,而不是用++i 替换 i++ 等等;我对实际的基准测试也不感兴趣)。
我并不是要在生产代码中实际使用它或“重新发明轮子”。这只是出于好奇,也是一种练习。
我使用的是 C# 字节数组,因此我假设您无需遍历字符串即可获取字符串的长度,直到找到 NUL。 也就是说,我没有考虑查找字符串长度的复杂性。但是,例如,如果您使用的是 C,则可以在调用核心代码之前使用 strlen() 来解决这个问题。
编辑:
正如 Mike F 指出的那样,我的代码(以及此处发布的其他人的代码)不处理复合字符。关于这些的一些信息here .我不熟悉这个概念,但是如果这意味着存在“组合字符”,即只有与其他“基本”字符/代码点结合才有效的字符/代码点,这样的查找表字符可用于在反转时保留“全局”字符(“基本”+“组合”字符)的顺序。
最佳答案
我会进行一次反转字节,然后进行第二次反转,将任何多字节字符(在 UTF8 中很容易检测到)中的字节反转回正确的顺序。
您绝对可以一次通过在线处理这个问题,但除非例程成为瓶颈,否则我不会打扰。
关于utf-8 - 如何就地反转 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/199260/