【问题标题】:How do I remove invisible unicode characters from the beginning and the end of a string?如何从字符串的开头和结尾删除不可见的 unicode 字符?
【发布时间】:2019-11-15 05:27:46
【问题描述】:

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

【问题讨论】:

    标签: c# .net unicode


    【解决方案1】:

    不可见是不明确的。符合 Unicode 的解决方案:正则表达式类 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, "");
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试:

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

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

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

      【讨论】:

        【解决方案3】:

        您可以尝试分析字节数:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-19
          • 1970-01-01
          • 2013-01-12
          • 1970-01-01
          • 2011-12-22
          • 1970-01-01
          相关资源
          最近更新 更多