2013-12-18 2 views
1

Как упражнение, я хочу написать XML-парсер (я знаю, что есть много действительно хороших библиотек, но я хочу попробовать сам). Я понимаю, что ByteString.Lazy, вероятно, лучший вариант для любого xml-файла, достаточно большого, потому что в памяти простые строки - это списки точек unicode. Мой вопрос: должен ли я использовать Data.Text.Lazy.Encoding.decodeUtf8With в качестве предварительного процессора или просто передавать кодирование прямо в синтаксический анализатор?Определение кодировки ByteString

ответ

3

Как это сделать in the XML standard itself, хотя это ненормативное приложение (т. Е. Вам разрешено делать это по-другому).

Воспроизведение алгоритма здесь было бы излишним, поэтому я предлагаю только по ссылке выше.

+0

Мне это известно. Я просто хотел знать, могу ли я получить очень большую эффективность, выполняя ненормативное обнаружение самостоятельно или позволяя библиотеке это делать. –

+0

Ну 'decodeUtf8With' не поможет вам, например, если используется UTF-16. Вы можете использовать алгоритм в стандарте, чтобы решить, что такое вход, и затем использовать одну из функций 'decode ___ With' перед запуском вашего синтаксического анализатора по декодированному« Тексту ». Я думаю, что кодирование, обрабатываемое как отдельный шаг, приведет к более чистому парсеру ядра. – porges

+0

Спасибо. Я предполагаю, что смотреть на первые байты и захватить объявление кодирования в строку [Char] не будет слишком дорогостоящим. Что касается кодировок, отличных от unicode, я просто надеюсь, что Data.Text.ICU не приведет к тому, что использование памяти будет расти экспоненциально. –

3

Это сложная проблема .... Кодирование XML-документа указано в самом документе (в инструкции по обработке). Это, очевидно, приводит к проблеме с курицей и яйцом, описанной здесь. What use is the 'encoding' in the XML header?

Итак, если вы хотите сделать все правильно, сначала вам нужно выяснить, как читать первую строку документа (это один байт на символ или 2 байта), затем прочитайте его, затем прочитайте остальную часть текста, используя правильную кодировку. К счастью, первая строка будет символами в диапазоне 32-127, что упростит ситуацию.

Если бы это был я, и я делал это как учебное упражнение, я бы просто ограничил документ до utf8 .... (подробности здесь просто сантехника).

Смежные вопросы