1.  Как можно перекодировать строку вида: &.#1090;&.#1077;&.#1089;&.#1090; в UTF-8? (между символами & и # точки нет, поставил потому, что в противном случае на странице отображается в нормальном виде)

2. В Firefox 1.0.* в файле скрипта при выводе текста в оконный элемент приходилось пользоваться функцией перекодировки:

Выделить код

Код:

function unescapeEx(str)
{
    var converter = Components.classes['@mozilla.org/intl/texttosuburi;1'].createInstance(Components.interfaces.nsITextToSubURI);
    return converter.UnEscapeAndConvert('windows-1251', str);
}

В Firefox 1.5.0.* можно уже просто сохранять файлы *.js в UTF-8 и все работает без перекодировки.
Так вот в чем вопрос - как сделать, чтобы и в 1.0.* и в 1.5.0.* расширение работало нормально. А то делаешь одним способом в 1.0 работает нормально, в 1.5 кракозяблы, делаешь другим - наоборот.

Sky пишет

1.  Как можно перекодировать строку вида: тест в UTF-8? (между символами & и # точки нет, поставил потому, что в противном случае на странице отображается в нормальном виде)...

Сначала в unicode:

Выделить код

Код:

var a = "тест";
var b = a. replace
(
    /&#(\d+);/g,
    function ()
    {
        return (String. fromCharCode (arguments [1]));
    }
);
print (b);

или так:

Выделить код

Код:

var a = "тест";
var c = new XML ("<text>" + a + "</text>");
print ("cc: " + c. toString ());

а потом уже

...
2. В Firefox 1.0.* в файле скрипта при выводе текста в оконный элемент приходилось пользоваться функцией перекодировки:

Выделить код

Код:

function unescapeEx(str)
{
    var converter = Components.classes['@mozilla.org/intl/texttosuburi;1'].createInstance(Components.interfaces.nsITextToSubURI);
    return converter.UnEscapeAndConvert('windows-1251', str);
}

В Firefox 1.5.0.* можно уже просто сохранять файлы *.js в UTF-8 и все работает без перекодировки.
Так вот в чем вопрос - как сделать, чтобы и в 1.0.* и в 1.5.0.* расширение работало нормально. А то делаешь одним способом в 1.0 работает нормально, в 1.5 кракозяблы, делаешь другим - наоборот.

организовать альтернативу, в зависимости от версии приложения ?


:)
Пока тестировал код, обнаружил метод окна convertFromUnicode:

Выделить код

Код:

var b = window. convertFromUnicode ("UTF-8", "тест");
print (b);

По первому вопросу:

Выделить код

Код:

var a = "&#1090;&#1077;&#1089;&#1090;";
var b = a. replace
(
    /&#(\d+);/g,
    function ()
    {
        return (String. fromCharCode (arguments [1]));
    }
);
print (b);

Сработало, большое спасибо. А можете объясни ть как это работает? А то пользоваться "магической последовательностью" просто, но как-то нехорошо :). Хотелось бы понять.

window. convertFromUnicode

Пишет, что нет такого свойства. :| ???

организовать альтернативу, в зависимости от версии приложения

Можно, но неужели нет более простого, общего способа?!! Хотя, видимо, то, что в 1.0.* не отображалась правильно кириллица в UTF-8, был явный баг. Наверно в 1.5 исправили. Придется выкручиваться. :)

Sky пишет

...

Выделить код

Код:

...
var b = a. replace
(
    /&#(\d+);/g,
    function ()
    {
        return (String. fromCharCode (arguments [1]));
    }
);
...

...как это работает?...
...

Метод replace осуществляет поиск и замену по регулярному выражению. Если вторым аргументом replace является функция, ей передаются: найденная строка (1-й аргумент, arguments [0]) и все найденные подстроки - $1 (2-й аргумент, arguments [1]), $2 (3-й аргумент, arguments [2]) и т. д. Найденная подстрока заменяется тем, что отдаст функция. В данном случае, у последовательностей &#abcd; заменяется на String. fromCharCode (abcd), т. е., unicode-символ с кодом abcd.

...

window. convertFromUnicode

Пишет, что нет такого свойства. :| ???
...

Проверял на FF1.5.0.2, на двух разных профилях - в обоих есть и работает. Ну, если нет, то вот это:

Выделить код

Код:

var sc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
         createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
sc. charset = "UTF-8";
var b = sc. ConvertFromUnicode ("тест");
print (b);

думаю, наверняка сработает.

p.s.: поправил последний кусок кода - там Convert..., а не convert...

Спасибо за объяснение.

А convertFromUnicode так и не заработало... (здесь я, правда, ошибся, пишет не "нет такого свойства", а "Ошибка: sc.convertFromUnicode is not a function").
Ну да ладно, первый способ работает. :)
Кстати, Anton, у Вас FF 1.5.0.2? "Проверял на FF1.0.5.2," - наверно описка?

Sky пишет

...
А convertFromUnicode так и не заработало...

Convert

...Кстати, Anton, у Вас FF 1.5.0.2? "Проверял на FF1.0.5.2," - наверно описка?

ага