字符串中的C#UTF-8字节位置
我有一个外部3。party library,它对字符串进行分析,并返回给定字符串中有趣的事情/事件的列表 我的问题是3。当我将字符串传递给3时,party library将找到的位置作为字节位置返回,而不是字符串位置。第一方使用Encoding.UTF8.GetBytes(text)将其作为UTF-8 Encodede byte[]交付,因此它作为字节位置返回是有意义的 因为UTF-8中的字符没有固定的大小,所以我不能直接将其转换为字符串位置 问题是: “我是您的父亲”“您的”位于字节位置5,长度为4 “我是你的父亲”“你”位于字节位置5,长度为5 “我是您的父亲”“父亲”位于字节位置10,长度为6 “我是你的父亲”“父亲”位于字节位置11,长度为6 我的问题是,如何将字节位置转换为字符串位置 它是O(n),所以它是坏的,但是:字符串中的C#UTF-8字节位置,c#,string,utf-8,character-encoding,byte,C#,String,Utf 8,Character Encoding,Byte,我有一个外部3。party library,它对字符串进行分析,并返回给定字符串中有趣的事情/事件的列表 我的问题是3。当我将字符串传递给3时,party library将找到的位置作为字节位置返回,而不是字符串位置。第一方使用Encoding.UTF8.GetBytes(text)将其作为UTF-8 Encodede byte[]交付,因此它作为字节位置返回是有意义的 因为UTF-8中的字符没有固定的大小,所以我不能直接将其转换为字符串位置 问题是: “我是您的父亲”“您的”位于字节位置5,长
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
在.NETchar
s中
请注意,您可以进行简单的优化:
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;
}
这很糟糕。。。除了解析字符串之外,没有其他方法。。。时间过得很慢。逐代码点迭代字符串代码点(请注意,非BMP字符在.NET使用的UTF-16中以两个代码单位/字符编码),计算该字符的UTF-8字节数,对于传递该字符的第一个字符,这就是字符串位置。为什么需要字符串中的位置?这种情况可能是直接使用byte[]而不是编码路径下的字符串更容易。我认为这不可能比
O(N)更好
@DrewMcGowen您可以进行优化:如果utf8.Length==str.Length
,则无需映射。@Ralf:-)您是对的:-)我使用返回fixed 11和fixed 5:-)的方法对其进行了测试。请注意,奇特的第三方库返回位置列表,因此,您需要对itI进行聚合,因为itI可能缺少一些基本信息,但为什么不简单地使用Encoding.UTF8.GetString(UTF8,ix,len)代码>?由于发送的字节数组是UTF8,并且(希望)第三方也使用UTF8对其进行处理