utf-8 - 如何就地反转 UTF-8 字符串?

标签 utf-8 string algorithm performance

最近,有人问了一个 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/

相关文章:

cocoa - 确定 Cocoa (MAC OSX) 中字符串的像素长度

algorithm - 精神崩溃后忘记了编程逻辑

c - 修改数组任意元素

python - 从 Facebook 数据导出中解码看似格式错误的 Unicode 指针的 utf8 表示形式

Python 输出将非 ASCII 字符替换为 �

c - 通过指针的字符串(数组)容量

java - concat 命令中的这些字符串是在字符串池中创建的吗?

algorithm - 尝试字节编译时提高 Racket 代码的性能和错误

java - 使用Java从文本文件中读取希伯来语

http - 请帮助我跟踪如何在每一步处理字符集