CPFix | Исправление кракозябр на сервере

#Rips

Эксперт
Пользователь
Регистрация
16 Дек 2015
Сообщения
1,737
Лучшие ответы
0
Репутация
499

Скачать с YD:
Описание:

История проблемы или зачем это всё нужно
Наверно каждый, кто включал русский язык в майнкрафте, обращал внимание на то, что при попытке набрать что-то в чат на сервер отправлялись какие-то кракозяблики их же можно было увидеть в книгах, а на табличках вместо русских букв появлялись непонятные знаки вопросов. Причина всего это проста. В стандартный клиент майнкрафта включена устаревшая версия библиотеки LWJGL, при вводе символов с клавиатуры, кодирует их не в кодировке UTF-8, а в какой-то безумной смеси: один байт от кодировки UTF-8, а второй - обычный символ в кодировке CP1251. В результате то тут, то там на серверах появляются таблички с "кривыми" символами, а все благодаря тому, что традиционная руссификация методом "подстановки" файла font.txt на самом деле не решает проблемы, а маскирует её: в клиентах, руссифицированных посредством font.txt (и соответствующего графического файла) на самом деле кодировка не исправлена, исправлено только её отображение, а на сервер символы попадают во все том же кривом отображении.

Таким образом, у потенциальных игроков на сервере может быть:

Стандартный клиент со стандартной руссификацией и старой версией LWJGL (Windows) — если не прилагать каких-то усилий, то он в принципе не сможет писать на русском.
Стандартный клиент со стандартной руссификацией и старой версией LWJGL (Linux) — насколько знаю тут всё хорошо, UTF-8 в чате, на табличках и вообще. То что он пишет видят все.
Стандартный клиент c руссификатором методом font.txt и старой версией LWJGL (Windows) — клиент пишет в чат на русском. Его не понимают клиенты из п.1 и п.2, но понимают все клиенты из п.3
Стандартный клиент c обновленной версией LWJGL (Windows) — собственно всё нормально текст принимается в UTF-8, игрок видит, что он пишет и его текст понятен всем.

Как с этим бороться

Естественно самым координальным и верным решением было бы устранение изначальной проблемы - внедрением исправленной версией LWJGL в клиент Minecraft'а. Но пока это не сделают разработчики, это решение будет неэффективным. Придется контроллировать игроков, заставлять их либо самостоятельно обновлять злосчастную LWJGL или же усиленно "впаривать" собственный клиент (с обновленной библиотекой). В ряде случаев второй вариант может решить проблему, но по тем или иным причинам ограничивать игроков каким-то специальным клиентом не всегда представляется возможным (да и удобным). Поэтому, при текущей ситуации, сервер направленный на полноценную поддержку кириллицы в игре должен уметь приводить к нормальному виду текст в "кривой" кодировке поступаемый от клиента. Процедура "руссфикации" сервера в этом случае будет выглядеть следующим образом.


Что нужно для организации поддержки русского языка

Собственно, для организации поддержки русского языка нужно не так уж и много:

Убедиться, что при вызове Java для старта сервера, включена поддержка UTF-8 для файлов. Для этого при запуске должен использоваться ключ: -Dfile.encoding=UTF-8
Необходимо внедрить "русский" файл font.txt в craftbukkit.jar (Ваше ядро сервера). Это необходимо для того, чтобы русский язык начал поддерживаться в табличках (в чате он и так воспринимается нормально).
Установить плагин CPFix, который необходим для того чтобы приводить весь поступающий в чат, таблички, книги текст в едино-верную кодировку UTF-8. С этим плагином даже клиенты под Windows с устаревшей LWJGL смогут с горем пополам писать на русском языке. К примеру, слово "ïðèâåò", поступившее от такого клиента, после перекодировки превратится в "привет".

А как же консоль?

С консолью есть несколько нюансов. Все они связаны с консолью в Windows (в Linux насколько я понимаю с поддержкой кодировки UTF-8 в консоли проблем никаких нет). Поэтому все о чем я буду говорить ниже относится к стандартной консоли Windows. Для того чтобы консоль нормально отображала текст UTF-8 (т.е. сообщения игроков в чате, текст выводимый плагинами на русском) необходимо включить в ней вывод в кодировке UTF-8. Проще всего это сделать вызвав команду chcp 65001. И уже после этой команды запускать Java. В качестве примера привожу содержимое cmd-файла, которым я запускаю свой "домашний тестовый" сервер:

PHP:
chcp 65001
"%ProgramFiles%\Java\jre7\bin\java.exe" -Xms1024M -Xmx1024M -Dfile.encoding=UTF-8 -jar craftbukkit.jar
pause
После этого, сервер будет поддерживать вывод текста на русском языке (и кстати в цвете - тоже). Однако остается одно огромное "но": Windows-консоль не поддерживает ввод текста в кодировке UTF-8! То есть не поддерживает ВООБЩЕ! То есть текст вы на русском читать сможете, а писать нет. Лично меня это устраивает: на домашне-тестовом сервере писать что-то с консоли на русском не приходится, а на активном игровом сервере вряд ли будет использоваться Windows.

Однако если уж очень хочется, то можно и заставить консоль "принимать" русский текст. Для этого придется устроить небольшую чехарду с кодировками. Во-первых, надо будет отказаться от кодировки UTF8 в консоли. Т.е. убрать chcp 65001 из командного файла, которым запускается сервер. Также необходимо будет отключить поддержку UTF-8 для файлов (т.е. убрать из строки запуска Java ключ -Dfile.encoding=UTF-8). В результате мы получим вот такой файл:

PHP:
"%ProgramFiles%\Java\jre7\bin\java.exe" -Xms1024M -Xmx1024M -jar craftbukkit.jar
pause<</code>>

Теперь необходимо в настройках плагина CPFix (версии 0.2.0) настроить перекодирование текста из консоли:
PHP:
<<code yml>>output-recode:
  console:
    enable: true
    code-page: CP866
  server-log:
    enable: true
    code-page: CP866
input-recode:
  enable: true
  code-page: CP866
Все эти опции отключены по умолчанию, но в файле настроек присутствуют - нужно включить и перезагрузить сервер. Кстати, если вы используете в консоли какую-то другую кодировку, то можете подставить и её. Ну и кстати, кодировку журнального файла (server-log) может отличаться от кодировки консоли: в консоль текст может выводиться в CP866, а в server.log при желании можно вести в UTF8.

Собственно после этого можно будет вводить в консоли текст на русском и сервером, а также плагинами он будет восприниматься адекватно. И команда /say Привет! будет понята всеми


Команды:

PHP:
/cpfix — Показать текущую конфигурацию
/cpfix reload — Перезагрузить конфиг
Права / Permissions:

Прав на плагин нету

Конфигурация файла:
PHP:
general:
# Проверять наличие новых версий на BukkitDev
  check-updates: true
# Язык (По умолчанию русский)
  language: russian
# Сохранить текущий язык в файле
  language-save: false
code-page:
# Перекодировать сообщения в чате
  chat-fix-enable: true
# Перекодировать команды
  command-fix-enable: true
# Перекодировать таблички
  sign-fix-enable: true
# Перекодировать книги
  book-fix-enable: true
# Включить (true) кодирование предмета (отключено по умолчанию)
  lore-fix-enable: false
# Информировать игрока, если он набирает неправильный символ в чате или на знаке (только один раз :))
  inform-player: true
# Вызов консоли вывода и server.log
output-recode:
  console:
    enable: true
    code-page: CP866
  server-log:
    enable: true
    code-page: CP866
# Ввод перекодировки (только консоль)
input-recode:
  enable: true
  code-page: CP866
 
Сверху Снизу