Поддержка кодировок символов

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Конфигурационные файлы/Поддержка кодировок символов

Система ejudge не привязана к какой-либо конкретной кодировке символов, а может работать с произвольной однобайтовой кодировкой, которая поддерживается функцией iconv стандартной библиотеки языка Си. Ограничение на то, что кодировка должна быть однобайтовой накладывается тем, что для работы со строками используются функции стандартной библиотеки предполагающие, что строка оканчивается нулевым байтом. К однобайтовым здесь отнесена и кодировка utf-8 в которой один символ может кодироваться группой подряд расположенных байтов. Другие примеры однобайтных кодировок: koi8-r, windows-1251, cp866, iso8859-1.

Кодировка, используемая для хранения строк в памяти программ системы ejudge, далее называется внутренней кодировкой. Это может быть произвольная однобайтовая кодировка, поддерживаемая функцией iconv стандартной библиотеки. Внутренняя кодировка задаётся с помощью опции --enable-charset программы configure при компиляции системы. Если внутренняя кодировка с помощью этой опции не задана, в качестве внутренней кодировки используется utf-8.

При запуске внешних программ (например, программ участников на тестирование, или проверяющих программ, или скриптов компиляции) взаимодействие с ними ведётся во внутренней кодировке ejudge. Другими словами, текст из памяти копируется на вход внешних программ без изменений и наоборот, вывод внешних программ считывается в память тоже без изменений. В случае кодировки UTF-8 проверяется корректность текста в этой кодировке и некорректные байтовые последовательности заменяются на знак '?'.

Генерация HTML страниц также ведётся во внутренней кодировке. Несмотря на то, что в конфигурационных файлах присутствует параметр charset, позволяющий менять заголовок HTML-страниц, перекодирование текста сообщения из внутренней кодировки в кодировку HTML-страницы не происходит.

Тем не менее, в некоторых случаях можно указывать кодировки файлов, отличные от внутренней кодировки системы ejudge. Эти случаи рассмотрены далее.

Кодировка конфигурационных файлов

Кодировка конфигурационных файлов в формате XML (ejudge.xml, register.xml, users.xml, contest.xml, userlist.xml, serve-control.xml) задаётся непосредственно в заголовке соответствующего файла, например,

<?xml version="1.0" encoding="utf-8"?>

Как уже было сказано выше, поддерживаются любые однобайтовые кодировки, поддерживаемые функцией iconv стандартной библиотеки языка Си.

Кодировка конфигурационных файлов в текстовом формате (serve.cfg, master.cfg, judge.cfg, team.cfg) задается в первой строке соответствующего файла, например,

# -*- coding: utf-8 -*-

Кодировка генерируемых файлов

Текст всех HTML-страниц генерируется во внутренней кодировке системы ejudge. В конфигурационных файлах существует параметр charset, который позволяет изменять кодировку генерируемых файлов, однако в текущей версии этот параметр влияет только на генерируемый заголовок HTML-страницы (поле Content-type:), а не на содержимое страницы. Поэтому использование этих параметров не рекомендуется.

Для конфигурационных файлов утилит в формате XML (register.xml, users.xml, serve-control.xml) кодировка генерируемой страницы указывается с помощью атрибута charset элемента верхнего уровня. Например, в конфигурационном файле register.xml кодировка может быть задана следующим образом:

<?xml version="1.0" encoding="koi8-r"?>
<register_config
  charset = "KOI8-R"
  <!-- прочие атрибуты -->
>
  <!-- прочие элементы -->
</register_config>

Для конфигурационных файлов утилит в текстовом формате (serve.cfg, master.cfg, judge.cfg, team.cfg) кодировка генерируемых html-страниц указывается с помощью параметра charset, например, следующим образом:

charset = "koi8-r"