C# 如何使用Unicode从字符串中分割数据?
早上好, 我有个问题。 例如,我需要使用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” 以字节为单位的字符串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
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)。