У меня есть веб-служба, которая получает данные от разных клиентов. Некоторые из них отправляют данные, закодированные с помощью escape(), в то время как другие вместо этого используют encodeURIComponent(). Есть ли способ определить кодировку, используемую для экранирования данных?
Как определить, закодирована ли строка с помощью escape() или encodeURIComponent()
Ответы (5)
Поощряйте своих клиентов использовать encodeURIComponent(). Объяснение см. на этой странице: Сравнение escape(), encodeURI() и encodeURIComponent() а>. Если вы действительно хотите выяснить, как именно что-то было закодировано, вы можете попытаться найти некоторые символы, которые escape() и encodeURI() не кодируют.
function isEncoded(str){return decodeURIComponent(str) !== str;}
- person RobertPitt; 29.04.2012
Это не поможет на стороне сервера, но на стороне клиента я использовал исключения javascript, чтобы определить, является ли кодировка URL-адреса кодировкой ISO Latin или UTF8.
decodeURIComponent
создает исключение для недопустимых последовательностей UTF8.
try {
result = decodeURIComponent(string);
}
catch (e) {
result = unescape(string);
}
Например, умляут 'ä' %E4
в кодировке ISO Latin вызовет исключение в Firefox, а кодировка 'ä' %C3%A4
в кодировке UTF8 - нет.
Смотрите также
- decodeURIComponent и unescape, что не так с unescape?
- Сравнение escape(), encodeURI() и encodeURIComponent()
Я понимаю, что это старый вопрос, но я не знаю лучшего решения. Итак, я делаю это так (благодаря комментарию Роберта Питта выше):
function isEncoded(str) {
return typeof str == "string" && decodeURIComponent(str) !== str;
}
Я еще не сталкивался со случаем, когда это не удалось. Что не означает, что такого случая не существует. Может быть, кто-то может пролить свет на это.
http://google.de/hello%20world woops
. Все еще нужно найти элегантный способ справиться с этим.
- person maryisdead; 24.06.2016
Спасибо @mika за отличный ответ. Возможно, только одно улучшение, поскольку функция unescape считается устаревшей:
declare function unescape(s: string): string;
decodeURItoString(str): string {
var resp = str;
try {
resp = decodeURI(str);
} catch (e) {
console.log('ERROR: Can not decodeURI string!');
if ( (unescape != null) && (unescape instanceof Function) ) {
resp = unescape(str);
}
}
return resp;
}
Вам не нужно различать их. escape() - это так называемое процентное кодирование, оно отличается от кодирования URI только тем, как кодируются определенные символы. Например, пробел закодирован как %20 с escape-кодом, но + с кодировкой URI. После декодирования вы всегда получаете одно и то же значение.