При использовании Google Closure Compiler, как впрочем и других аналогичных упаковщиков, основанных на Rhino, возникают некоторые проблемы с русским текстом.
Эта статья содержит рецепты, как их легко преодолеть.
Если вы попробуете сжать 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.
C кодировкой UTF-8 все немного проще. Мы можем скормить файл компилятору сразу же. Единственно, результат будет такой:
function func(){return a="\u0442\u0435\u0441\u0442"};
То есть, вместо UTF-символов мы имеем их запись в виде ASCII.
Для приведения такого файла к нормальному виду достаточно пропустить его через native2ascii без указания кодировки:
native2ascii -reverse <откомпилированный файл> <итоговый файл>
После этого полученный файл будет в кодировке UTF-8.
На этом проблемы с кодировкой должны быть исчерпаны.