我有一个外部第三方库,它对字符串进行分析,并返回给定字符串中有趣的事物/事件的列表。
我的问题是第 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);
ix2
和 len2
位于 .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/