C# 如何使用Unicode从字符串中分割数据?

C# 如何使用Unicode从字符串中分割数据?,c#,unicode-string,converters,C#,Unicode String,Converters,早上好, 我有个问题。 例如,我需要使用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\u001f\t\B2207026

早上好, 我有个问题。 例如,我需要使用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\u001f\t\B2207026\u001f\n\0”

以字节为单位的字符串

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

字符串[]数组={“Stephen”、“King”、“11301958”、“NewYork/Usa”}

如果我使用

System.Text.Encoding.UTF8.GetString(ByteArray);
为了获取数据,我只获取姓名,没有日期或来源


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

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

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

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

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()));
byte[]bytes=//您的数据在这里。。。。
//分析器
列表单词=新列表();
for(var i=0;i
输出:

FERREIRA RAMOS MUZI RICARDO URY 09031979 MONTEVIDEO/URY 34946682 " - some non-printable chars here 22072026 费雷拉·拉莫斯·穆齐 里卡多 乌里 09031979 蒙得维的亚/尤里 34946682 “-这里有些不可打印的字符 22072026 看起来有些字段需要特殊解析。

我的解决方案:

仅检测带有正则表达式的字母a-zA-Z和数字 如果正则表达式失败或为空白,则表示单词已完成,然后将其添加到列表中, 最后,我有一个清单,上面列出了所有必要的单词和数字

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);
}
//将utf-8字节转换为字符串。
s_unicode2=System.Text.Encoding.UTF8.GetString(apduRsp.Data);
列表测试=新列表();
如果(s_unicode2.Length>0)
{
test=GetWords(s_unicode2);
}
2-使用从字节[]转换的字符串调用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;
    }
private List GetWords(字符串文本)
{
正则表达式reg=新正则表达式(“[a-zA-Z0-9]”);
字串=”;
char[]ca=text.ToCharArray();
列表字符=新列表();
对于(int i=0;i65535)
{
继续;
}
if(字符Ishighsubrogate(c))
{
i++;
Add(新字符串(new[]{c,ca[i]}));
}
其他的
{
if(reg.Match(c.ToString()).Success | | c.ToString()==“/”)
{
Word=Word+c.ToString();
//Add(新字符串(new[]{c}));
}
else if(c.ToString()=“”)
{
如果(字长>0)
字符。添加(Word);
单词=”;
}
其他的
{
如果(字长>0)
字符。添加(Word);
单词=”;
}
}
}
返回字符;
}
3-GetWords()的结果


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

1F 01 13费雷拉·拉莫斯·穆齐
<代码>1F
字段开始,
01
字段索引,
13
字节长度(19)。作为字节数组处理比作为字符串处理要好得多。这是一种自定义二进制格式;你是从哪里得到它的?它是否有一些推荐的处理方法的文档?我添加了一个字节字符串。问题是有些字段不是字符串,甚至是字符串字段的用途也不总是很清楚。字段8包含
0x22072016
,该字段的BCD编码与字段9中的字符串编码类似(
22072026
)。要正确地解码,您需要知道所有这些字段的含义。当然你可以猜测,但这看起来不像你应该猜测的那种数据。它不是Unicode,请使用BinaryReader读取这些数据。共有10个字段,每个字段以0x1f开头。第二个字节是字段号(0x01..0A)。第三个字节是数据长度,后跟数据字节。字段2和10是空的,字段8是一个非常不稳定的字段,类似于日期(22072016)。