代码之家  ›  专栏  ›  技术社区  ›  Maximiliano Cesán

如何使用Unicode从字符串中拆分数据?

  •  -2
  • Maximiliano Cesán  · 技术社区  · 6 年前

    早上好, 我有个问题。 例如,我需要用Unicode从字符串中恢复数据

    “\u001f\u0001\u0013FERREIRA RAMOS MUZI\u001f\u0002\0\u001f\u0003\aRICARDO\u001f\u0004\u0003URY\u001f\u0005\b09031979\u001f\u0006\u000eMONTEVIDEO/URY\u001f\a\b34946682\u001f\b\u0004\”\a\u0016\u001f\t\b2207026\u001f\n\0”

    以字节为单位的字符串

    1F011346455252454952412052414D4F53204D555A491F02001F03075249434152444F1F04035552591F050830393033313937391F060E4D4F4E5445564944454F2F5552591F070833343934363638321F0804220720161F090832323037323032361F0A00
    

    例如,我需要在ArrayList或Arraystring中恢复Name、LastName等

    System.Text.Encoding.UTF8.GetString(ByteArray);
    

    我怎么能从这根绳子上得到这个?

    3 回复  |  直到 6 年前
        1
  •  1
  •   001    6 年前

    您可能需要创建一个自定义解析器:

    byte [] bytes = // Your data here....
    // Parser
    List<string> words = new List<string>();
    for (var i = 0; i < bytes.Length; i++) {
        if (0x1F == bytes[i]) {
            int index = bytes[i+1]; // Ignoring this
            int len = bytes[i+2];
            // Convert bytes to string
            words.Add(System.Text.Encoding.UTF8.GetString(bytes, i+3, len));
            i += len + 2;
        }
    }
    Console.WriteLine(String.Join("\n", words.ToArray()));
    

    输出:

    FERREIRA RAMOS MUZI
    
    RICARDO
    URY
    09031979
    MONTEVIDEO/URY
    34946682
    "           - some non-printable chars here
    22072026
    

        2
  •  0
  •   jdweng    6 年前

    它看起来像是二进制数据和字符串的组合。有行计数。所以这个代码可能有用

                string input = "\u001f\u0001\u0013FERREIRA RAMOS MUZI\u001f\u0002\0\u001f\u0003\aRICARDO\u001f\u0004\u0003URY\u001f\u0005\b09031979\u001f\u0006\u000eMONTEVIDEO/URY\u001f\a\b34946682\u001f\b\u0004\"\a \u0016\u001f\t\b22072026\u001f\n\0";
                string output = System.Net.WebUtility.HtmlDecode(input);
                string[] lines = output.Split(new char[] { '\u001f' });
    
        3
  •  0
  •   Maximiliano Cesán    6 年前

    我的解决方案:

    如果正则表达式失败或为空白,则表示单词已完成,然后将其添加到列表中, 最后我列出了所有必要的单词和数字。

    1-将Byte[]数据转换为字符串

    // Convert utf-8 bytes to a string.
    s_unicode2 = System.Text.Encoding.UTF8.GetString(apduRsp.Data);
    
    List<string> test = new List<string>();
    if (s_unicode2.Length > 0)
    {
       test = GetWords(s_unicode2);
    }
    

    private List<string> GetWords(string text)
        {
            Regex reg = new Regex("[a-zA-Z0-9]");
            string Word = "";
            char[] ca = text.ToCharArray();
            List<string> characters = new List<string>();
            for (int i = 0; i < ca.Length; i++)
            {
                char c = ca[i];
                if (c > 65535)
                {
                    continue;
                }
                if (char.IsHighSurrogate(c))
                {
                    i++;
                    characters.Add(new string(new[] { c, ca[i] }));
                }
                else
                {
                    if (reg.Match(c.ToString()).Success || c.ToString() == "/")
                    {
                        Word = Word + c.ToString();
                        //characters.Add(new string(new[] { c }));
                    }
                    else if(c.ToString() == " ")
                    {
                        if(Word.Length > 0)
                            characters.Add(Word);
                        Word = "";
                    }
                    else
                    {
                        if(Word.Length > 0)
                            characters.Add(Word);
                        Word = "";
                    }
    
                }
    
            }
            return characters;
        }
    

    3-来自GetWords()的结果

    List<string> values returned

    这个解决方案目前对我来说是好的,但有些人有两个名字,这是一个小问题,目前显示。