Преобразование html-ввода в правильную кодировку

У меня есть html-форма с одним html-полем ввода. Ввод копируется через буфер обмена из других программ. Иногда скопированный текст не utf-8, а ansi (проверено с помощью notepad++). Затем умляуты типа ü копируются как ü. Поскольку я не хочу каждый раз менять кодировку текста в буфере обмена (с помощью i.e.notepad++), я хотел бы сделать это с помощью javascript непосредственно при анализе и разделении входного текста.

Есть ли способ сделать это без реализации собственной функции для этого (что было бы следующим, что я сделал бы для наиболее распространенных умлаутов)?


person Sammy    schedule 11.03.2015    source источник
comment
ХОРОШО. Как всегда, поиск, тестирование и просмотр, а затем просто вопрос, и ответ приходит примерно так: stackoverflow.com/questions/18222665/ Может быть, это лучше для моего случая.   -  person Sammy    schedule 11.03.2015
comment
Я искал универсальный конвертер utf-8 и нашел это: jsfromhell.com/geral/utf-8< /а> . Однако ü не преобразуется в ü... В любом случае, если вы хотите, вы можете прослушать событие вставки и изменить значение ввода на закодированное. Я сделал это codepen, пытаясь: codepen.io/anon/pen/GgYZeb . Каждый раз, когда вы что-то вставляете, он автоматически преобразует его в UTF8... Но, похоже, это не работает в вашем конкретном случае.   -  person briosheje    schedule 11.03.2015
comment
О черт, это потому что это utf8.decode, я идиот. Пожалуйста, проверьте это: codepen.io/anon/pen/GgYZeb   -  person briosheje    schedule 11.03.2015


Ответы (1)


Украл из интернета это:

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/geral/utf-8 [rev. #1]

var UTF8 = {
    encode: function(s){
        for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
            s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
        );
        return s.join("");
    },
    decode: function(s){
        for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
            ((a = s[i][c](0)) & 0x80) &&
            (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
            o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
        );
        return s.join("");
    }
};

Затем вы можете добавить свой ввод:

<input type="text" id="test">

И прослушайте событие PASTE, и через несколько миллисекунд (иначе вы получите "" как .val) вы можете заменить все значение ввода декодированным:

$('#test').on('paste', function(e) {
  var controller = $(this);
  setTimeout(function(){
    controller.val(UTF8.decode(controller.val()));
  },10);
});

Кодепен:

http://codepen.io/anon/pen/GgYZeb

Обратите внимание, что он прослушивает только событие PASTE. Вы также можете добавить другие события, если вы заинтересованы.

person briosheje    schedule 11.03.2015
comment
Спасибо. Я попробую это - я думаю, мне не нужно понимать каждую грань этого кода ;-) - person Sammy; 11.03.2015
comment
@Sammy: я заметил, что он довольно глючит, поскольку, если вы возьмете фрагмент текста, а затем проанализируете другой, он по некоторым причинам удалит некоторые символы. Я действительно не знаю, как создается эта функция (объект UTF8), поэтому я не могу идти дальше, но если вы вставите всю закодированную строку Ansi, она будет правильно ее декодировать. - person briosheje; 11.03.2015
comment
@Sammy: Вы также можете подробнее взглянуть на это: stackoverflow.com/questions/6607799/ - person briosheje; 11.03.2015
comment
Мой qad способ состоял в том, чтобы использовать ссылку, которую я разместил. После сохранения моего js-файла как utf-8 он работал хорошо... Я попробую это решение позже. - person Sammy; 11.03.2015