Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串中的C#UTF-8字节位置_C#_String_Utf 8_Character Encoding_Byte - Fatal编程技术网

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

字符串中的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,长

我有一个外部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),所以它是坏的,但是:

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
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对其进行处理