如何从字符串的开头和结尾删除不可见的unicode字符



如何以可靠的方式删除字符串开头和结尾的不可见字符?在我的例子中,我的字符串以从左到右嵌入[LRE]字符开始。然而,string.Trim()并没有删除它,正如您在下面看到的:

var myString = "u202atest";
myString.Trim();
// Prints:
// "‪test"
myString.Trim().ToCharArray();
// Prints:
// {char[5]}
//     [0]: 8234 '‪'
//     [1]: 116 't'
//     [2]: 101 'e'
//     [3]: 115 's'
//     [4]: 116 't'

在.NET Framework API中是否有一个函数可以修剪所有这样的字符?我认为不止这一个,我希望避免手动指定每个。

Invisible定义不清。符合Unicode的解决方案:正则表达式类一般类别[p{Control}p{Format}p{Nonspacing_Mark}p{Enclosing_Mark}p{Line_Separator}p{Paragraph_Separator}]中的字符没有显示宽度。不用任何东西替换它们。

$ length "x{202a}test" =~ s/[p{Cc}p{Cf}p{Mn}p{Me}p{Zl}p{Zp}]//r
4

在C#中:

public static string RemoveCharactersWithoutDisplayWidth(this string str)
{
var regex = new Regex(@"[p{Cc}p{Cf}p{Mn}p{Me}p{Zl}p{Zp}]");
return regex.Replace(str, "");
}

您可以尝试:

mystring = myString.Trim('u202a');

如果要修剪更多相似的字符,可以将这些字符定义为数组。

char[] trimChars = {'u202a','u202b'};//More chars as your wish
mystring = myString.Trim(trimChars);

您可以尝试分析字节:

var s = "u202atest";
string s2 = null;
byte[] bytes = new byte[s.Length * sizeof(char)];
Buffer.BlockCopy(s.ToCharArray(), 0, bytes, 0, bytes.Length);
if (bytes[0] == 0x2a && bytes[1] == 0x20)
{
char[] c = new char[(bytes.Length - 2) / sizeof(char)];
Buffer.BlockCopy(bytes, 2, c, 0, bytes.Length - 2);
s2 = new string(c);
}
var c2 = s2.ToCharArray();

最新更新