На самом деле, все, как правило, хранится внутри Unicode, но не будем вдаваться в подробности.Я предполагаю, что вы получаете символические строки типа «Ã ¥ äö», потому что вы используете ISO-8859 в качестве кодировки символов.Есть трюк, который вы можете сделать, чтобы преобразовать этих персонажей.Функции escape
и unescape
, используемые для кодирования и декодирования строк запроса, определены для символов ISO, тогда как более новые encodeURIComponent
и decodeURIComponent
, которые делают то же самое, определены для символов UTF8.
escape
кодирует расширенные символы ISO-8859-1 (кодовые точки UTF U + 0080-U + 00ff) как %xx
(двузначный шестнадцатеричный код), тогда как кодирует кодовые точки UTF U + 0100 и выше как%uxxxx
(%u
, за которым следует четырехзначный шестнадцатеричный код.) Например, escape("å") == "%E5"
и escape("あ") == "%u3042"
.
encodeURIComponent
процентов кодируют расширенные символы в виде последовательности байтов UTF8.Например, encodeURIComponent("å") == "%C3%A5"
и encodeURIComponent("あ") == "%E3%81%82"
.
Таким образом, вы можете сделать:
fixedstring = decodeURIComponent(escape(utfstring));
Например, неправильно закодированный символ «å» становится «Ã ¥».Команда выполняет escape("Ã¥") == "%C3%A5"
, что является двумя неправильными символами ISO, закодированными как отдельные байты.Затем decodeURIComponent("%C3%A5") == "å"
, где два процента кодированных байтов интерпретируются как последовательность UTF8.
Если вам по какой-то причине нужно сделать обратное, это тоже работает:
utfstring = unescape(encodeURIComponent(originalstring));
Есть ли способ отличить плохие строки UTF8 от строк ISO?Оказывается, есть.Функция decodeURIComponent, использованная выше, выдаст ошибку, если задана неправильно сформированная кодированная последовательность.Мы можем использовать это, чтобы с большой вероятностью определить, является ли наша строка UTF8 или ISO.
var fixedstring;
try{
// If the string is UTF-8, this will work and not throw an error.
fixedstring=decodeURIComponent(escape(badstring));
}catch(e){
// If it isn't, an error will be thrown, and we can assume that we have an ISO string.
fixedstring=badstring;
}