一尘不染

如何在原处反转UTF-8字符串?

algorithm

最近,有人问到一种用于反转C语言中的字符串的算法。在处理非单字节字符串时,大多数建议的解决方案都有麻烦。因此,我想知道什么样的算法可以很好地处理utf-8字符串。

我想出了一些代码,我将其发布为答案,但是我很高兴看到其他人的想法或建议。我更喜欢使用实际的代码,所以我选择了C#,因为它似乎是本网站中最受欢迎的语言之一,但是我不介意您的代码是否使用另一种语言,只要它合理即可。熟悉命令式语言的任何人都可以理解。并且,由于这是为了了解如何在低级别实现这种算法(低级别,我只是指处理字节),所以这种想法是避免将库用于核心代码。

笔记:

我对算法本身,其性能以及如何进行优化感兴趣(我的意思是算法级别的优化,不是用 i等代替i ;我也不是对实际的基准测试感兴趣)。

我并不是要在生产代码中实际使用它,也不是“重新发明轮子”。这只是出于好奇,是一种锻炼。

我正在使用C#字节数组,因此我假设您可以获取字符串的长度而无需遍历字符串,直到找到NUL。也就是说,我不考虑查找字符串长度的复杂性。但是,例如,如果您使用的是C,则可以在调用核心代码之前使用strlen()将其排除在外。

编辑:

正如Mike
F所指出的那样,我的代码(以及此处发布的其他人的代码)没有处理复合字符。关于这里的一些信息。我不熟悉该概念,但是如果这意味着存在“组合字符”,即仅与其他“基本”字符/代码点结合使用的字符/代码点,则需要查找此类字符的查找表反转时,可以使用字符保留“全局”字符(“基本”
+“组合”字符)的顺序。


阅读 249

收藏
2020-07-28

共1个答案

一尘不染

我将一遍反转字节,然后进行第二遍反转任何多字节字符(在UTF8中很容易检测到)中的字节,使其恢复正确顺序。

您绝对可以一次性完成此任务,但是除非例程成为瓶颈,否则我不会打扰。

2020-07-28