Поиск байта [] для шаблона C # - PullRequest
0 голосов
/ 11 ноября 2009

_documentContent содержит весь документ в виде исходного кода HTML. patternToFind содержит текст для поиска в _documentContent.

Фрагмент кода ниже работает нормально, если язык английский. Однако тот же код вообще не работает, когда он встречает язык, подобный корейскому.

Образец документа

Настоящее время

Настоящее время такое же, как вы узнали. Вы берете словарную форму глагола, опускаете 다, добавляете соответствующее окончание.

먹다 - 먹 + 어요 = 먹어요
마시다 - 마시 + 어요 - 마시 어요 - 마셔요.

Это время используется для представления того, что происходит в настоящем. Я ем. Я пью. Это общий термин для настоящего времени.

Когда я пытаюсь найти 먹, приведенный ниже код завершается неудачей.

Может кто-нибудь предложить какое-то решение для этого

using System;
using System.Collections.Generic;
using System.Text;

namespace MultiByteStringHandling
{
    class Program
    {
        static void Main(string[] args)
        {
            string _documentContent = @"먹다 - 먹 + 어요 = 먹어요";
            byte[] patternToFind = Encoding.UTF8.GetBytes("먹");
            byte[] DocumentBytes = Encoding.UTF8.GetBytes(_documentContent);

            int intByteOffset = indexOf(DocumentBytes, patternToFind);
            Console.WriteLine(intByteOffset.ToString());
        }
        public int indexOf(byte[] data, byte[] pattern)
        {
            int[] failure = computeFailure(pattern);

            int j = 0;
            if (data.Length == 0) return 0;

            for (int i = 0; i < data.Length; i++)
            {
                while (j > 0 && pattern[j] != data[i])
                {
                    j = failure[j - 1];
                }
                if (pattern[j] == data[i])
                {
                    j++;
                }
                if (j == pattern.Length)
                {
                    return i - pattern.Length + 1;
                }
            }
            return -1;
        }
        /**
         * Computes the failure function using a boot-strapping process,
         * where the pattern is matched against itself.
         */
        private int[] computeFailure(byte[] pattern)
        {
            int[] failure = new int[pattern.Length];

            int j = 0;
            for (int i = 1; i < pattern.Length; i++)
            {
                while (j > 0 && pattern[j] != pattern[i])
                {
                    j = failure[j - 1];
                }
                if (pattern[j] == pattern[i])
                {
                    j++;
                }
                failure[i] = j;
            }

            return failure;
        }
    }
}

Ответы [ 2 ]

6 голосов
/ 11 ноября 2009

Серьезно, почему бы просто не сделать следующее?

var indexFound = documentContent.IndexOf("data");

Преобразование строк в байтовые массивы с последующим поиском в них не имеет особого смысла, если исходные данные - текст Вы всегда можете найти позицию байта после, если хотите.

0 голосов
/ 11 ноября 2009

UTF-8 - переменный многобайтовый формат. Поиск английского текста в корейских данных никогда не будет совпадать при прямом сопоставлении с шаблоном. Если вы сканируете текст, вам будет гораздо лучше использовать .IndexOf (шаблон) [как указано Noldorin ] или .Contains (шаблон).

...