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

时间:2019-11-15 05:27:46

标签: c# .net unicode

如何以可靠的方式删除字符串开头和结尾的不可见字符?就我而言,我的字符串以Left-to-Right Embedding [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中是否有一个函数可以修剪所有此类字符?我认为不止一个,而且我想避免不必手动指定每个。

3 个答案:

答案 0 :(得分:1)

不可见定义不正确。符合Unicode的解决方案:regex类general categories [\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, "");
}

答案 1 :(得分:0)

您可以尝试:

mystring = myString.Trim('\u202a');

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

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

答案 2 :(得分:0)

您可以尝试分析字节:

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();