gpt4 book ai didi

c# - 根据字节长度缩短UTF8字符串的最佳方法

转载 作者:可可西里 更新时间:2023-11-01 07:50:36 25 4
gpt4 key购买 nike

最近的一个项目要求将数据导入Oracle数据库。将执行此操作的程序是C#.Net 3.5应用程序,我正在使用Oracle.DataAccess连接库来处理实际的插入。

我遇到一个问题,在插入特定字段时会收到以下错误消息:

ORA-12899值对于X列太大

我使用了Field.Substring(0, MaxLength);,但仍然出现错误(尽管不是每条记录)。

最终,我看到了应该是显而易见的东西,我的字符串是ANSI,字段是UTF8。它的长度以字节为单位,而不是字符。

这使我想到了我的问题。修剪弦线以固定MaxLength的最佳方法是什么?

我的子字符串代码按字符长度工作。是否有简单的C#函数可以按字节长度智能地修剪UT8字符串(即不砍掉半个字符)?

最佳答案

这是两种可能的解决方案-LINQ单行处理从左到右的输入,而传统的for-循环处理从右到左的输入。哪个处理方向更快取决于字符串长度,允许的字节长度以及多字节字符的数量和分布,并且很难给出一般建议。 LINQ和传统代码之间的决定可能与口味(或速度)有关。

如果速度很重要,则可以考虑仅累积每个字符的字节长度直到达到最大长度,而不是在每次迭代中计算整个字符串的字节长度。但是我不确定这是否行得通,因为我不太了解UTF-8编码。我可以从理论上想象一个字符串的字节长度不等于所有字符的字节长度之和。

public static String LimitByteLength(String input, Int32 maxLength)
{
return new String(input
.TakeWhile((c, i) =>
Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
.ToArray());
}

public static String LimitByteLength2(String input, Int32 maxLength)
{
for (Int32 i = input.Length - 1; i >= 0; i--)
{
if (Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
{
return input.Substring(0, i + 1);
}
}

return String.Empty;
}

关于c# - 根据字节长度缩短UTF8字符串的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1225052/

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