Вы сказали, что ни одно из приведенных решений не сработало для вас, но я думаю, что на самом деле они в порядке (по крайней мере, некоторые из них). Позвольте мне продемонстрировать:
Вот примеры, которые вы перечислили:
$json:
<img src="img/map/"ST JOHN'S"_map.PNG"/ width="600">
$html:
<img src="img/map/ST JOHN'S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN's_map.PNG"/ width="600">
$escape:
<img src="img/map/ST JOHN\'S_map.PNG"/ width="600">
$urlenc:
<img src="img/map/ST%20JOHN%27S_map.PNG"/ width="600">
Я не вижу проблем ни с одним из них (кроме JSON, который я объясню чуть позже).
И я только что попробовал все эти примеры, пытаясь смоделировать ваш сценарий как можно точнее (даже вплоть до использования одного и того же имени файла) .... Все они загружали графику правильно, опять же, за исключением примера JSON.
Пример JSON нуждается в незначительной настройке, чтобы он заработал, но он также экранирует строку в работоспособном виде. Чтобы это работало, вам нужно принять во внимание, что JSON создает полностью заключенную в кавычки строку Javasscript, а не просто экранировать ее, как это делают другие, поэтому вы должны изменить вывод, чтобы закрыть кавычки и добавить строки вместе, например так:
$('#map_output').html('<p><img src="img/map/"+<?=$json?>+"_map.PNG"/ width="600"></p>');
Другим решениям это не нужно. Все они работают как есть. Как я уже сказал, я попробовал их, и все они загрузили изображение на страницу.
В этом контексте все три механизма (экранирующие \'
, сущности '
и кодировка URL %27
) являются действительными:
Экранирование работает, потому что вы находитесь в контексте Javascript, поэтому обратный слеш обрабатывается Javascript, и окончательно сгенерированный HTML, вставленный на страницу, не будет его содержать.
Сущности работают, потому что HTML переводит сущности в сопоставленный символ, поэтому '
на странице HTML совпадает с одинарной кавычкой, даже в пределах значения атрибута, как в этом случае.
Кодировка URL работает, потому что браузеры переводят их при загрузке URL.
Я бы сказал, что в этом случае правильное решение - это кодировка URL, поскольку она используется для URL. Причина этого заключается в том, что, хотя все решения работают для данного примера, если у вас есть какие-либо примеры, содержащие знак вопроса или знак амперсанда (&
) или несколько других зарезервированных символов, то кодирование URL будет единственным решением, которое будет работать в этих случаях. С другой стороны, если вы отображаете выходные данные на своей HTML-странице в другом контексте, то сущности - это путь. И если он будет использоваться только в Javascript, то ответом будет JSON.
Но вы говорите, что никто из них не сделал этого. Мой вопрос: вы на самом деле пробовали их? Вы запустили код, и изображение не удалось загрузить? Это для меня. С другой стороны, если они работали, но все еще не «справились», то чего же вы на самом деле хотите?
Я предполагаю, что на самом деле вы имеете в виду, что вы хотите получить простой символ цитаты, но он должен работать волшебным образом. Этого не может быть; для того, чтобы он работал, кавычка так или иначе должна быть экранирована, но пользователь никогда не увидит экранированную версию, так что об этом не нужно беспокоиться.
На самом деле вы должны экранировать или кодировать все строки, которые вы вводите или выводите, чтобы недопустимые символы работали. В противном случае у мистера О'Брайена будут проблемы с вводом его имени на ваш сайт, и если он будет управлять им, у вас будут проблемы с отображением его позже.