gpt4 book ai didi

c# - 拉丁文、中文、西里尔文等的子字符串 UTF-8

转载 作者:太空狗 更新时间:2023-10-30 00:43:02 24 4
gpt4 key购买 nike

在 Windows Phone 上,我想将任何给定的字符串子字符串化为等同于 100 个 ASCII 字符的长度。

String.Length 显然没有用,因为中文字符串每个字符使用 3 个字节,丹麦语字符串每个字符使用 2 或 4 个字节,而俄语字符串每个字符使用 4 个字节。

唯一可用的编码是 UTF-8 和 UTF-16。那我该怎么办?

思路是这样的:

private static string UnicodeSubstring(string text, int length)
{
var bytes = Encoding.UTF8.GetBytes(text);

return Encoding.UTF8.GetString(bytes, 0, Math.Min(bytes.Length, length));
}

但是长度需要能被每个字符使用的字节数正确整除,所以最后字符总是被正确渲染。

最佳答案

一种选择是简单地遍历字符串,计算每个字符的字节数。

如果您知道不需要处理 BMP 之外的字符,那么这相当简单:

public string SubstringWithinUtf8Limit(string text, int byteLimit)
{
int byteCount = 0;
char[] buffer = new char[1];
for (int i = 0; i < text.Length; i++)
{
buffer[0] = text[i];
byteCount += Encoding.UTF8.GetByteCount(buffer);
if (byteCount > byteLimit)
{
// Couldn't add this character. Return its index
return text.Substring(0, i);
}
}
return text;
}

如果你必须处理代理对,它会变得有点棘手 :(

关于c# - 拉丁文、中文、西里尔文等的子字符串 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com