Как я могу разделить данные из строки с помощью Unicode? - PullRequest
0 голосов
/ 14 сентября 2018

Доброе утро, У меня вопрос. Мне нужно восстановить данные из строки с Unicode, например

"\ u001f \ u0013 \" ФЕРРЕЙРА РАМОС МУЗИ \ u001f \ u000f \ 0 \ u001f \ u0003 \ aRICARDO \ u001f \ u0004 \ u0003URY \ u001f \ u0000 / b09031979 \ u001f \ u0006 \ uBe / uBe / uBeBe / uBeBeBe / uBeBeBeBeBeBeBeBeBeBeBeBeBeBe uBeO \ u001f \ b \ u0004 \ "\ a \ u0016 \ u001f \ t \ b22072026 \ u001f \ n \ 0"

Строка в байтах

1F011346455252454952412052414D4F53204D555A491F02001F03075249434152444F1F04035552591F050830393033313937391F060E4D4F4E5445564944454F2F5552591F070833343934363638321F0804220720161F090832323037323032361F0A00

Мне нужно восстановить имя, фамилию и т. Д. В ArrayList или Arraystring, например

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

Моя проблема, если я использую

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

чтобы получить данные, я получаю только имя и фамилию, без дат или откуда.

Как я могу получить это из этой строки?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Возможно, вам придется создать собственный анализатор:

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

Похоже, что некоторые поля нуждаются в специальном разборе.

0 голосов
/ 17 сентября 2018

Мое решение:

Обнаружение только букв a-zA-Z и чисел с регулярным выражением Если регулярное выражение не выполнено или является пробелом, Word является Complet и затем добавляет его в список, в концеу меня есть список со всеми необходимыми словами и числами.

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 - вызвать 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 ()

image values returned">

Это решение для меня на данный момент хорошо, но некоторые люди имеют 2имена, и это небольшая проблема в момент показа.

0 голосов
/ 14 сентября 2018

Похоже, что это комбинация двоичных данных со строками.Существует количество строк.Так что этот код может помочь

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