# Кодировки

## Поддерживаемые кодировки

DataparkSearch поддерживает почти все популярные в современном Internet однобайтные и многобайтные кодировки, включая корейский euc-kr, китайские Big5, gbk и gb2312, японские shift-jis, euc-jp и iso-2022-jp, а так же Unicode UTF-8. Это позволяет индексировать документы на более чем 650-ти языках мира, предусмотренных в Unicode.

Внимание! Из-за большого объема перекодировочных таблиц, приводящего к увеличению размера исполняемых файлов, поддержка многобайтных кодировок не компилируется по-умолчанию. Смотрите параметры `configure`, как активизировать поддержку этих кодировок при компиляции.

&groups;

## Разные названия кодировок

Каждая кодировка имеет модет иметь несколько различных вариантов названия. Например, iso-8859-2, iso8859-2, latin2 - названия одной и той же кодировки. DataparkSearch понимает следующие варианты названий кодировок:

&csalias;

## Перекодировка во время индексации

`indexer` перекодирует все документы в кодировку, указанную в команде
`LocalCharset` в файле `indexer.conf`. Внутри программы перекодировка реализована посредством промежуточного представления в виде Unicode. Особенность DataparkSearch состоит в том, что перекодировка между несовместимыми кодировками (например, между русской и греческой) не приводит к потере данных. В случае, если перекодировка какого-либо символа невозможна, DataparkSearch представит этот символ в базе данных в HTML-формате в виде &#NNN; где NNN - код символа, закрепленного за ним в Unicode. Таким образом, вне зависимости от выбора `LocalCharset`, DataparkSearch сохранит полную информацию о документе без каких-либо потерь. Однако, выбор `LocalCharset` влияет на размер базы данных.

## Выбор LocalCharset

Выбор `LocalCharset` должен производиться с учетом языкового наполнения индексируемого пространства. Правильный выбор позволит уменьшить место, требуемое для хранения, а так же увеличить скорость индексации и поиска.

Если командой `LocalCharset` указана кодировка `UTF-8`, то это позволит сохранять любые символы, поддерживаемым в Unicode без необходимости представлять их в HTML-формате. Однако, следует иметь в виду, что это заведомо приводит к использованию до двух-трех байт на каждую не-латинскую букву. Например, на каждую букву кириллицы требуется два байта для сохранения ее в UTF-8.

Поскольку все кодировки включают в себя латинские буквы, то любая кодировка предоставляет поддержку по-крайней мере двух языков - английского и еще какого-то одного (или более) языка (единственное исключение - `US-ASCII`, поддерживающий только латинские буквы). Это означает, что при использовании DataparkSearch с `LocalCharset`, отличным от UTF-8, одновременная индексация документов с языками из одной группы не приводит к необходимости использовать HTML-формат, а значит не приводит к увеличению необходимого дискового пространства.

Например, если Ваша поисковая машина настроена использовать `LocalCharset` из 5-й группы (Кирилица), то документы на болгарском, белорусском, македонском, русском, сербском, украинском, а так же на английском языках будут сохранены компактно, с использованием одного байта на одну букву. Индексирование документов в других кодировках не из 5-й группы (включая UTF-8) также возможно; однако `indexer` будет использовать HTML-формат для сохранения букв, отличных от кирилических и английских. Сохранение, например, греческой буквы в кириллической кодировке требует применение семь байт на одну букву.

Таким образом, следует придерживаться следующего алгоритма при выборе `LocalCharset`: если Вы индексируете, например, в-основном кириллические и анлгийские документы, то выгоднее изпользовать LocalCharset из 5й группы. Если же Ваши документы сожержат информацию на языках из многих языковыз групп одновременно, то в качестве `LocalCharset` выгоднее использовать UTF8.

## Определение кодировки документа

`indexer` определяет кодировку в документа в следующем порядке:

1. "Content-type: text/html; charset=xxx"

2. <META NAME="Content-Type" CONTENT="text/html; charset=xxx">

   Выбор этого варианта можно выключить указав команду `GuesserUseMeta no` в файле конфигурации `indexer.conf`.

3. При выключенном автораспозновании: кодировка по-умолчанию, указанная командой "Charset"

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

## Автоматическое распознавание кодировки

DataparkSearch имеет механизм автоматического распознавания кодировки и языка документа. В настоящее время распознается около 100 различных комбинаций кодировки и языка. Распознавание реализовано с использованием так называемой "N-Gram-Based Text Categorization" технологии. В комплекте программы поставляются файлы с так называемыми "картами языков", один файл на каждую пару кодировка-язык. По-умолчанию они устанавливаются в `/usr/local/dpsearch/etc/langmap/`. Чтобы увидеть полный список распознаваемых в настоящий момент языков и кодировок, взгляните в этот каталог. Распознавание работает хорошо на текстах в 500 байт и длиннее. Более короткие тексты могут распознаваться хуже. Для активизации автоматического распознавания кодировки необходимо загрузить языковые карты, используя команды
`LangMap`.

### Команда `LangMapFile`

Загружает из указанного файла карту языка и кодировки для автоматического их определения. Вы можете задать как абсолютный, так и относительный путь. Относительный путь задаётся от директории `etc`. Можно использовать несколько команд `LangMapFile`.

    LangMapFile langmap/en.ascii.lm

### Создание собственных карт языков

Для создания собственных карт языков служит утилита
`dpguesser`. Кроме этой утилиты вам также потребуется файл-образец текстов на данном языке в нужной кодировке. Для создания своей карты языка используйте следующий формат команды:

            dpguesser -p -c charset -l language < FILENAME > language.charset.lm

Утилиту `dpguesser` можно также использовать для определения языка и кодировки файла на основании уже созданных карт языков. Для этого используйте следующий формат команды:

            dpguesser [-n maxhits] < FILENAME

Для некоторых языков существует несколько используемых кодировок. Для преобразования текстов из одной, поддерживаемой DataparkSearch кодировки, в другую предназначена утилита
`dpconv`.

            dpconv [OPTIONS] -f charset_from -t charset_to [configfile] < infile > outfile

По умолчанию, утилиты `dpguesser` и `dpconv` устанавливаются в директорию `/usr/local/dpsearch/sbin/`.

Поддерживается автоматическое обновление карт языков и кодировок, если удалённый сервер возвращает чётко указаные язык и кодировку. Для включения этой возможности необходимо в файле `indexer.conf` указать команду

    LangMapUpdate yes

По умолчанию, DataparkSearch использует только первые 8192 байт каждого индексируемого файла для определения языка и кодировки. Вы можете изменить это значение при помощи команды `GuesserBytes`. Используйте значение 0 для учёта всего такста индексируемого документа.

    GuesserBytes 16384

## Кодировка документов по-умолчанию

Используйте команду `RemoteCharset` в `indexer.conf` чтобы установить кодировку документов по-умолчанию.

Если индексируемый сервер не выдает кодировку документа ни в заголовке Content-Type, ни в META-тэге, и при этом автоматическое распознаывание либо отключено, либо не дало хорошего результата (т.е. язык и кодировка документа "не похожи" на представленные в загруженных картах), то в качестве кодировки документа будет использована кодировка, указанная в команде `RemoteCharset`. Если же кодировка по-умолчанию не указана, то будет использована iso-8859-1 (latin1).

## Язык документов по-умолчанию

Вы можете установить язык документов по-умолчанию с помощью команды `DefaultLang` в файле `indexer.conf`. Это может пригодиться, например, во время поиска для ограничения поиска только по документам на указанном языке.

    DefaultLang <string>

Задаёт язык документов по умолчанию.

    DefaultLang en

## Перекодировка во время поиска

Чтобы указать кодировку, в которой будут оторбражаться результаты поиска, используйте команду `BrowserCharset` в `search.htm`. `BrowserCharset` может отличаться от `LocalCharset`. Поисковая программа произведет перекодировку автоматически.

## Команда `LocalCharset`

Задаёт кодировку, которая будет использоваться для хранения информации в базе данных. Данные во всех других кодировках будут перекодированы в эту кодировку. См. для подробного описания как выбрать `LocalCharset` для языков, используемых на вашем сайте или сайтах, а также списка поддерживаемых кодировок. Эта команда должны быть задана один раз и имеет глобальный эффект для всего файла конфигрурации. Значение по умолчанию: `iso-8859-1` (`latin1`).

    LocalCharset koi8-r

## Команда `RemoteCharset`

    RemoteCharset <charset>

`<сharset>` - кодовая страница по умолчанию для последующих команд `Server`, `Realm` или `Subnet`. Используется при индексировании "плохих" серверов, не предоставляющих информации о кодировке в заголовках ответа сервера или в <META NAME="Content" Content="text/html; charset="some_charset"> на страницах. Команда действует до конца файла, или до следующей команды `RemoteCharset`. Значение по умолчанию: iso-8859-1 (latin1).

    RemoteCharset iso-8859-5

## Команда `URLCharset`

    URLCharset <charset>

`<charset>` - кодовая страница для аргументов последующих команд `Server`, `Realm` или `URL`. Эта команда задаёт кодовубю страницу только для аргументов последующих команду и не влияет на определение кодировки индексируемых страниц. Имеет меньший приоритет, нежели команда `RemoteCharset`. Может задаваться перед каждой командой `Server`, `Realm` или `URL` и действует до конца файла конфигурации или до следующей команды `URLCharset`. Значение по умолчанию: ISO-8859-1 (latin1).

    URLCharset KOI8-R

## Команда `CharsToEscape`

    CharsToEscape "\"&<>![]"

Используйте эту команду в вашем поисковом шаблоне для указания списка эскейп-символов для мета-переменных поискового шаблона типа $&(x).