Javascript.RU

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

При использовании 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.

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


Автор: Гость (не зарегистрирован), дата: 11 декабря, 2009 - 15:11
#permalink

native2ascii работает только в составе пакета или нет? Если нет? скиньте файл или ссылку на него на мыло, спасибо.


Автор: Вадимыч (не зарегистрирован), дата: 26 апреля, 2010 - 16:07
#permalink

А где взять этот native2asci?


Автор: Вадимыч (не зарегистрирован), дата: 26 апреля, 2010 - 19:16
#permalink

Перефразирую свой вопрос: есть ли аналоги native2ascii? Совершенно не хочется на сервере ставить JDK из-за этой приблуды...


Автор: Гость (не зарегистрирован), дата: 2 августа, 2010 - 00:15
#permalink

Вот простенький заменитель native2ascii на javascript под Windows Script Host.
Запуск: cscript.exe native2ascii.js <откомпилированный файл> <итоговый файл>

try
{
	var fso, f, input, output, re, matches, last
	if(WScript.Arguments.length < 2)
		die("Command line format: cscript.exe native2ascii.js input_file output_file", 1);
	fso = WScript.CreateObject('Scripting.FileSystemObject');
	f = fso.OpenTextFile(WScript.Arguments(0), 1);
	input = f.ReadAll(), output = '';
	f.Close();
	re = /\\u([0-9a-f]{4,4})/g;
	while((matches = re.exec(input)) !== null)
	{
		output += input.substring(last, matches.index) + String.fromCharCode(parseInt(matches[1], 16));
		last = matches.lastIndex;
	}
	output += input.substring(last);
	f = fso.OpenTextFile(WScript.Arguments(1), 2, true);
	f.Write(output);
	f.Close();
}
catch(e)
{
	die('Error: ' + e.description, 10);
}

function die(message, code)
{
	WScript.StdOut.WriteLine(message);
	WScript.Quit(code);
}

Автор: Гость (не зарегистрирован), дата: 2 августа, 2010 - 01:18
#permalink

Оказалось, что текст сохраняется в Windows-1251. Вот исправленный скрипт:

try
{
	var fso, f, input, output, re, matches, last, outstream
	if(WScript.Arguments.length < 2)
		die("Command line format: cscript.exe native2ascii.js input_file output_file", 1);
	fso = WScript.CreateObject('Scripting.FileSystemObject');
	f = fso.OpenTextFile(WScript.Arguments(0), 1);
	input = f.ReadAll(), output = '';
	f.Close();
	re = /\\u([0-9a-f]{4,4})/g;
	while((matches = re.exec(input)) !== null)
	{
		output += input.substring(last, matches.index) + String.fromCharCode(parseInt(matches[1], 16));
		last = matches.lastIndex;
	}
	output += input.substring(last);
	f = WScript.CreateObject("ADODB.Stream");
	f.Type = 2;
	f.Charset = "UTF-8";
	f.Open();
	f.WriteText(output);
	f.SaveToFile(WScript.Arguments(1), 2);
	f.Close();
}
catch(e)
{
	die('Error: ' + e.description, 10);
}

function die(message, code)
{
	WScript.StdOut.WriteLine(message);
	WScript.Quit(code);
}

Автор: Соziдатель (не зарегистрирован), дата: 3 октября, 2010 - 22:17
#permalink

Я так понимаю, что можно еще конвертировать скрипты в UTF-8, обрабатывать упаковщиком и переконвертировать обратно в Win-1251?


Автор: Георгий Иванкин (не зарегистрирован), дата: 1 декабря, 2010 - 16:06
#permalink

Кстати, native2ascii входит в состав дефолтных команд Apache Ant. Так что если вы юзаете ант для сжатия js, это может выглядеть примерно так:

<jscomp compilationlevel="simple" debug="false" output="ascii/scripts.min.js">
<sources dir="/">
<file name="script1.js" />
<file name="script2.js" />
</sources>
</jscomp>
<native2ascii src="ascii" dest="/" reverse="true" />
<delete dir="ascii" />

Пример для скриптов в UTF-8.

Если JDK не установлен, на задании native2ascii билдер будет вылетать с ошибкой.


Автор: Гостьfh (не зарегистрирован), дата: 12 февраля, 2011 - 18:53
#permalink
$us="fdjg";
echo $us;

Автор: VitAl2013, дата: 2 апреля, 2012 - 10:17
#permalink

То есть нет никакого значка чтоб java-всемогущий понял следующий текст как записанный пользователем уже в unicode? без скармливания каким-то программам? грошёвый продукт, если так


Автор: dima116, дата: 12 августа, 2012 - 20:38
#permalink

Хм, у меня по-умолчанию при написании:
native2ascii -reverse <откомпилированный файл> <итоговый файл>
он кодируется в win-1251.
Чтобы в utf-8 получить, необходимо написать:
native2ascii -reverse -encoding utf-8 <откомпилированный файл> <итоговый файл>


Автор: Demka (не зарегистрирован), дата: 30 октября, 2012 - 22:55
#permalink

для сжатия win-1251 достаточно указать ключ --charset WINDOWS-1251, а для UTF-8, соответственно --charset UTF-8 без всяких прыжков с переворотом.


Автор: Гость (не зарегистрирован), дата: 7 сентября, 2014 - 10:56
#permalink

Это действительно работает, неплохо бы автор исправил статью, чтобы не вводить новичков вроде меня в заблуждение %)


Автор: Гость (не зарегистрирован), дата: 13 апреля, 2022 - 03:54
#permalink

Автор: Гость (не зарегистрирован), дата: 15 апреля, 2022 - 23:51
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:45
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 14:21
#permalink

Автор: Christian Hilton (не зарегистрирован), дата: 18 мая, 2022 - 10:18
#permalink

Rollic Games' new action game for Android phones is called Blob Hero. The game plays similarly to Survivor Diary. If you're bored and don't have anything else to play, why not give this Blob Hero Mod APK game a try?


Автор: allanpetter, дата: 16 августа, 2022 - 12:14
#permalink

awesome post i love it keep posting more! Sheetrock Installation in fort worth texas


Автор: Starm Rio (не зарегистрирован), дата: 17 сентября, 2022 - 12:06
#permalink

UpToMods.Com is the best place to find free MOD APK games and apps from reputable sources. We also provide promo codes for popular game every day so that your entertainment experience will be better than ever!


Автор: Гость (не зарегистрирован), дата: 26 октября, 2022 - 07:20
#permalink

Indeed, I can't hide it when my ability is not enough to fully understand what you say. I really need more help from you, hope to hear from you soon, I promise to pay you in basketball stars.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
2 + 13 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum