gpt4 book ai didi

c# - 如何从字符串中删除无效代码点?

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

我有一个需要提供规范化字符串的例程。但是,传入的数据不一定是干净的,如果字符串包含无效代码点,String.Normalize() 会引发 ArgumentException。

我想做的就是用一次性字符(例如“?”)替换这些代码点。但要做到这一点,我需要一种有效的方法来搜索字符串以首先找到它们。这样做的好方法是什么?

下面的代码有效,但它基本上使用 try/catch 作为粗略的 if 语句,因此性能很糟糕。我只是分享它来说明我正在寻找的行为:

private static string ReplaceInvalidCodePoints(string aString, string replacement)
{
var builder = new StringBuilder(aString.Length);
var enumerator = StringInfo.GetTextElementEnumerator(aString);

while (enumerator.MoveNext())
{
string nextElement;
try { nextElement = enumerator.GetTextElement().Normalize(); }
catch (ArgumentException) { nextElement = replacement; }
builder.Append(nextElement);
}

return builder.ToString();
}

(编辑:)我正在考虑将文本转换为 UTF-32,以便我可以快速迭代它并查看每个双字是否对应于一个有效的代码点。有没有一个功能可以做到这一点?如果不是,是否有一个无效范围列表?

最佳答案

似乎唯一的方法就是像您所做的那样“手动”。这是一个提供与您的结果相同的版本,但速度要快一些(在所有 charschar.MaxValue 的字符串上大约是 4 倍,改进较少U+10FFFF) 并且不需要不安全代码。我还简化并评论了我的 IsCharacter 方法来解释每个选择:

static string ReplaceNonCharacters(string aString, char replacement)
{
var sb = new StringBuilder(aString.Length);
for (var i = 0; i < aString.Length; i++)
{
if (char.IsSurrogatePair(aString, i))
{
int c = char.ConvertToUtf32(aString, i);
i++;
if (IsCharacter(c))
sb.Append(char.ConvertFromUtf32(c));
else
sb.Append(replacement);
}
else
{
char c = aString[i];
if (IsCharacter(c))
sb.Append(c);
else
sb.Append(replacement);
}
}
return sb.ToString();
}

static bool IsCharacter(int point)
{
return point < 0xFDD0 || // everything below here is fine
point > 0xFDEF && // exclude the 0xFFD0...0xFDEF non-characters
(point & 0xfffE) != 0xFFFE; // exclude all other non-characters
}

关于c# - 如何从字符串中删除无效代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767103/

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