我如何使用 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个名字,这在展示的时候有点问题。
早上好, 我有个问题。 例如,我需要使用 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个名字,这在展示的时候有点问题。