Кодировка: русский текст

При использовании Google Closure Compiler, как впрочем и других аналогичных упаковщиков, основанных на Rhino, возникают некоторые проблемы с русским текстом.

Эта статья содержит рецепты, как их легко преодолеть.

Сжатие в кодировке: windows-1251

Если вы попробуете сжать javascript, в котором присутствуют русские буквы в кодировке windows-1251, то на выходе вместо русского текста получите "кракозяблы". Это нормально.

Для того, чтобы произвести правильную обработку, необходимо для начала перевести файл в промежуточный ASCII-формат. Это умеет делать утилита native2ascii, которая распространяется вместе с JDK.

То есть, обычной JRE (Java Runtime Environment) не хватит, нужно поставить JDK, и там, в директории bin, будет лежать эта утилита.

На входе: file.js

function()
  var a = "тест"
  return a
}

Запускаем:

native2ascii -encoding windows-1251 file.js file.ascii.js

Получаем file.ascii.js

function func() {
a = "\u0442\u0435\u0441\u0442"
return a
}

Теперь полученный файл в формате ASCII можно смело передавать компилятору:

java -jar compiler.jar  --js file.ascii.js  --js_output_file file.ascii.compiled.js

На выходе: file.ascii.compiled.js

function func(){return a="\u0442\u0435\u0441\u0442"};

И теперь - возвращаем файл из промежуточного формата обратно, в родной windows-1251:

native2ascii -reverse -encoding windows-1251 file.ascii.compiled.js file.compiled.js

Получили результат - сжатый файл в кодировке windows-1251.

Пакетный файл

Вот небольшой пакетный файл под windows для сжатия. Предполагается, что путь к native2ascii (к директории bin в JDK) у вас в переменной PATH.

native2ascii -encoding windows-1251 "%1.js" "%1.tmp.js"
java -jar compiler.jar --js "%1.tmp.js" --js_output_file "%1.compiled.tmp.js" %2 %3 %4 %5 %6 %7
native2ascii -reverse -encoding windows-1251 "%1.compiled.tmp.js" "%1.compiled.js"
del /q "%1.tmp.js"
del /q "%1.compiled.tmp.js"

Использование для файла file.js:

c.bat file --compilation_level ADVANCED_OPTIMIZATIONS

Готовый файл будет file.compiled.js.

Сжатие в кодировке UTF-8

C кодировкой UTF-8 все немного проще. Мы можем скормить файл компилятору сразу же. Единственно, результат будет такой:

function func(){return a="\u0442\u0435\u0441\u0442"};

То есть, вместо UTF-символов мы имеем их запись в виде ASCII.

Для приведения такого файла к нормальному виду достаточно пропустить его через native2ascii без указания кодировки:

native2ascii -reverse <откомпилированный файл> <итоговый файл>

После этого полученный файл будет в кодировке UTF-8.

На этом проблемы с кодировкой должны быть исчерпаны.