gpt4 book ai didi

c# - 来自字符串的随机字符 - 具有多字节字符

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:42 25 4
gpt4 key购买 nike

A similar question之前被问过,但这是不同的,因为我试图从中提取随机字符的字符串可能包含多字节字符。我基本上是在制作一个伪“leet”生成器,它接受一个字符串并将所有字符更改为从看起来相似的扩展 Unicode 中随机选择的字符,以赋予它一种“黑客”类型的外观。 (这是一个游戏,一个部分需要使用这种风格。不要评判我。)所以我有一个扩展方法:

private static Random rand = new Random();
public static char random(this string str)
{
return str[rand.Next(str.Length)];
}

它的工作方式是,我查看字符串中的每个字符,它的名称如下:

public static string leetify(this string str)
{
StringBuilder sb = new StringBuilder();

foreach (char c in str)
{
switch (char.ToLower(c))
{
case 'a':
sb.Append("4ÀÁÂÃÄÅàáâãäåĀāĂ㥹ǎǍǺǻȀȁȂȃȦȧȺɅɐɑɒªΆѦѧᴀᾼ₳".random());
break;
... //More of the same for each letter

//Okay, the letter 's' definitely has a failure case,
//not the only one, but needed an example
case 's':
sb.Append("ŚśŜŝŞşŠšƧƨȘșȿʂϨϩЅѕᵴṠṡṢṣṤṥṦṧṨṩ$§".random());
break;
...
default:
sb.Append(c);
break;
}
}
return sb.toString();
}

当然,其余字母的代码也类似。最终的字符串然后显示在 TextBox 和可能的其他各种控件中。现在,我已经检查过,我选择的所有字符都完全能够以我选择的字体显示在 TextBox 中 - 我可以将它们复制/粘贴到那里并且它可以工作。但是当我运行它时,字符串中出现了很多错误字符。我认为失败点是我的 random 函数不理解该字符串包含多字节字符。有什么方法可以修改它吗?

编辑:添加了肯定会导致失败的“s”集。

编辑 2:或者,如果有一些方法可以轻松判断我的字符串中的哪些字符是多字节的,我可以只删除它们并从中选择较少的字符。显然,我并没有将这些字符用于它们的预期目的,所以为了简单起见,我可以牺牲一点多样性。

最佳答案

问题可能在于其他字母集之一,而字符组合正是导致您出现问题的原因。例如,我可以通过将组合变音标记(例如\u0301 )包含到字符串中来导致@Harrison 的测试用例失败。因此,在没有看到其他集合和您正在使用的输入测试用例的情况下,很难说。

忽略所有这些,如果您确实有组合字符或代理对,则正确的方法是使用 StringInfo.GetTextElementEnumerator遍历字符串逻辑字符。这是一个性能不佳的示例,它将替换您当前的 Random 实现。

public static class Extensions
{
private static Random rand = new Random(1);

public static string Random(this string str)
{
var chars = new List<string>();
var strElements = StringInfo.GetTextElementEnumerator(str);
while (strElements.MoveNext())
{
chars.Add(strElements.GetTextElement());
}
return chars[rand.Next(chars.Count)];
}
}

这将涵盖所有情况,例如字母 "ś" 可以由其文字定义并且长度为 1 或与 s "s\u0301"< 上的组合字符一起定义 长度为 2。它们在渲染时代表相同的字形。

关于c# - 来自字符串的随机字符 - 具有多字节字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20832683/

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