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

How i can split Data from String with Unicode?

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

"\u001f\u0001\u0013FERREIRA RAMOS MUZI\u001f\u0002[=12=]\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[=12=]"

以字节为单位的字符串

1F011346455252454952412052414D4F53204D555A491F02001F03075249434152444F1F04035552591F050830393033313937391F060E4D4F4E5445564944454F2F5552591F070833343934363638321F0804220720161F090832323037323032361F0A00

我需要恢复 ArrayList 或 Arraystring 中的姓名、姓氏等,例如

string[] array = {"Stephen", "King","11301958","NewYork/Usa"}

如果我使用

我的问题
System.Text.Encoding.UTF8.GetString(ByteArray);

为了获取数据,我只获取姓名和姓氏,没有日期或来源。

我如何从这个字符串中得到它?

看起来是二进制数据和字符串的组合。有一个行数。所以这段代码可能会有所帮助

            string input = "\u001f\u0001\u0013FERREIRA RAMOS MUZI\u001f\u0002[=10=]\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[=10=]";
            string output = System.Net.WebUtility.HtmlDecode(input);
            string[] lines = output.Split(new char[] { '\u001f' });

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

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

看起来某些字段需要特殊解析。

我的解决方案:

使用正则表达式仅检测字母 a-zA-Z 和数字 如果正则表达式失败或者是一个白色的Space,一个Word是Complet,接下来将它添加到一个List中, 最后我有一个列表,其中包含所有必要的单词和数字。

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

// 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);
}

2- 使用从 Byte[] 转换而来的字符串调用 GetWords()

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() 的结果

这个解决方案目前对我来说很好,但是有些人有2个名字,这在展示的时候有点问题。