最近,有人询问了一种在 C 中反转字符串的算法。大多数提出的解决方案在处理非单字节字符串时都会遇到麻烦。所以,我想知道什么是专门处理 utf-8 字符串的好算法。
我想出了一些代码,我将其作为答案发布,但我很高兴看到其他人的想法或建议。我更喜欢使用实际代码,所以我选择了 C#,因为它似乎是这个网站上最流行的语言之一,但我不介意你的代码是另一种语言,只要它可以合理任何熟悉命令式语言的人都能理解。而且,因为这是为了了解如何在低级别实现这样的算法(低级别我只是指处理字节),所以这个想法是避免将库用于核心代码。
笔记:
我对算法本身、它的性能以及如何优化它感兴趣(我的意思是算法级优化,不是用 ++i 替换 i++ 等;我对实际的基准测试也不感兴趣)。
我并不是要在生产代码中实际使用它或“重新发明轮子”。这只是出于好奇和练习。
我正在使用 C# 字节数组,所以我假设您可以在不运行字符串的情况下获取字符串的长度,直到找到 NUL。也就是说,我没有考虑找到字符串长度的复杂性。但是,如果您使用的是 C,例如,您可以在调用核心代码之前使用 strlen() 将其排除在外。
编辑:
正如 Mike F 所指出的,我的代码(以及此处发布的其他人的代码)没有处理复合字符。关于这里的一些信息。我不熟悉这个概念,但如果这意味着存在“组合字符”,即仅与其他“基本”字符/代码点组合有效的字符/代码点,则此类查找表字符可用于在反转时保留“全局”字符(“基”+“组合”字符)的顺序。