C# 字符串中的 UTF-8 字节位置

标签 c# string utf-8 character-encoding byte

我有一个外部第三方库,它对字符串进行分析,并返回给定字符串中有趣的事物/事件的列表。

我的问题是第 3 方库将找到的位置返回为字节位置,而不是字符串位置,当我将字符串传递给第 3 方时,我使用 Encoding 将其作为 UTF-8 编码 byte[] 传递.UTF8.GetBytes(text),因此它作为字节位置返回确实有意义。

因为UTF-8中的字符没有固定大小,所以我无法直接将其转换为字符串位置。

问题是:

我是你的父亲”“你的”位于字节位置 5,长度为 4

我是你的父亲”“yøur”在字节位置 5 处找到,长度为 5

我是你的父亲”“父亲”在字节位置10处找到,长度为6

我是你的父亲”“父亲”位于字节位置 11,长度为 6

我的问题是,如何将字节位置转换为字符串位置?

最佳答案

它的复杂度是 O(n),所以它很糟糕,但是:

string str = "I am yøur father";
byte[] utf8 = Encoding.UTF8.GetBytes(str);

int len;
int ix = YourMethod(utf8, out len);

int ix2 = Encoding.UTF8.GetCharCount(utf8, 0, ix);
int len2 = Encoding.UTF8.GetCharCount(utf8, ix, len);

ix2len2 位于 .NET char 中。

请注意,您可以进行简单的优化:

int ix2;
int len2;

if (str.Length != utf8.Length)
{
    ix2 = Encoding.UTF8.GetCharCount(utf8, 0, ix);
    len2 = Encoding.UTF8.GetCharCount(utf8, ix, len);
}
else
{
    ix2 = ix;
    len2 = len;
}

关于C# 字符串中的 UTF-8 字节位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870418/

相关文章:

c# - 无溢出异常的平均函数

html - 如何更改 ios 中段落中的特定字符串?

python - 使用Python读取JSON时,'ascii'编解码器无法编码错误

java - 无论如何要在 Java 中为编译时更改 String 的编码?

c# - Azure Functions 无法再创建 .NET Framework 运行时

c# - 是否可以从 webbrowser NavigationFailed 事件中导航?

c# - 如何更改组合框中的项目?

string - 如何使用单个命令在 Dockerfile 中输出多行字符串

Pythonic 自定义排序字母等级 'D' 、 'C-' 、...、 'A+' ?

php - UTF-8贯穿始终