#php
#php
Вопрос:
Кто-нибудь может сказать мне, во что ø
превращается amp;Aring;
функция PHP?
Я сохраняю специальные символы, такие æ, ø, å, ö, ä
как символы в HTML-кодировке.
Я поискал в Google и Stackoverflow, но не могу понять, что искать.
Я справлялся с этим раньше, но не могу вспомнить, как : (
Следующее не работает:
$tmp = ('Øving, ære, blå');
$tmp2 = htmlspecialchars($tmp);
echo $tmp.' - '.$tmp2;
Вывод: Øving, ære, blå - Øving, ære, blå
Я тоже пробовал htmlentities
:
$tmp = ('Øving, ære, blå');
$tmp2 = htmlentities($tmp);
echo $tmp.' - '.$tmp2;
Это выводит: Øving, ære, blå - Ã�ving, ære, blÃ¥
когда я хочу, чтобы это было
Øving, ære, blå - amp;Oslash;ving, amp;aelig;re, blamp;aring;
Комментарии:
1. Ах, так вы все-таки не хотите этого для HTML, как вы указали. Понял.
2. Я использую это в HTML. Только HTML не включает такие символы, как
æ, ø or å
. Вот почему я должен использовать кодировку типаamp;Oslash;
Ответ №1:
Это зависит от кодировки, в которой закодированы ваши специальные символы (внутри php). Предполагая, что UTF-8 вы можете сделать
$str2 = htmlentities($str2,ENT_COMPAT,"UTF-8");
но следующее может быть более надежным (если у вас есть поддержка mb_ функций)
$str2 = mb_convert_encoding ($str1,"HTML-ENTITIES","UTF-8");
Обновление: Я проверил, что оба работают в указанном примере (символ u 00C5). И что вторая действительно более надежна в следующем смысле: когда именованная сущность не найдена для данного символа Юникода, первая альтернатива оставляет ее нетронутой, вторая использует числовую сущность. Если мы хотим избежать символов, отличных от ascii, на HTML-страницах, тогда предпочтительнее второе. Несколько строк для проверки:
<?php
for($i=129;$i<3000;$i )
printUnicode($i);
function printUnicode($value) {
$one_character = pack("L", $value);
$u8 = iconv("UTF-32", "UTF-8", $one_character);
echo join("t",array(
$value,
$u8,
htmlentities($u8,ENT_COMPAT,"UTF-8"),
mb_convert_encoding($u8,"HTML-ENTITIES","UTF-8")))
. "n";
}
?>
И некоторый пример вывода:
187 » amp;raquo; amp;raquo;
188 ¼ amp;frac14; amp;frac14;
189 ½ amp;frac12; amp;frac12;
190 ¾ amp;frac34; amp;frac34;
191 ¿ amp;iquest; amp;iquest;
192 À amp;Agrave; amp;Agrave;
193 Á amp;Aacute; amp;Aacute;
194 Â amp;Acirc; amp;Acirc;
195 Ã amp;Atilde; amp;Atilde;
196 Ä amp;Auml; amp;Auml;
197 Å amp;Aring; amp;Aring;
...
655 ʏ ʏ amp;#655;
656 ʐ ʐ amp;#656;
657 ʑ ʑ amp;#657;
658 ʒ ʒ amp;#658;
659 ʓ ʓ amp;#659;
Комментарии:
1. хм… Я пробовал ваше решение, оба из них, но оно все еще выдает
Øving, ære, blå
. Мне нужно будет проверить это завтра и посмотреть, что я смогу придумать.2. Смотрите комментарий Пола в его ответе. По-видимому, вы не понимаете, что строки в PHP — это просто набор байтов, вы должны знать кодировку, которую вы используете внутри PHP (необязательно связанную с вашей кодировкой HTML)
3. Да. Я не совсем понимаю суть кодирования. Я протестирую еще несколько в ближайшие несколько дней. И да,
amp;oslash;
— опечатка.
Ответ №2:
Я думаю, это было бы более уместно: htmlentities()
Комментарии:
1. Почему это было бы более уместно? Это попытается преобразовать все (все с помощью объекта). Если ему это нужно только тогда, когда ему это нужно, то
htmlspecialchars()
будет работать. Если я здесь чего-то не упускаю…2. А, теперь я понимаю. Он прояснил свой вопрос… Я предполагаю, что на самом деле он не использует это в HTML.
3. @Briedis- Я тоже так думал. Но, как вы можете видеть из моего обновления, я не совсем получаю желаемый результат. Я использую HTML5, поэтому мой
DOCTYPE
простоHTML
, а мета-тегcharset
имеет значениеutf-8
.
Ответ №3:
Как насчет этого:
$tmp = ('Øving, ære, blå');
$tmp2 = htmlentities($tmp, ENT_COMPAT, 'UTF-8');
echo $tmp.' - '.$tmp2;
Из командной строки я получаю нужную строку:
amp;Oslash;ving, amp;aelig;re, blamp;aring;
Комментарии:
1. Как кодируется ваш исходный файл? Как бы она ни была закодирована, попробуйте изменить третий параметр в
htmlentities()
вызове.2. Я использую HTML5, поэтому мой DOCTYPE — это просто HTM, а кодировка мета-тега установлена в utf-8.
3. Это означает указание браузеру, какую кодировку он должен использовать для чтения выходных данных.
htmlentities
может иметь различные эффекты в зависимости от кодировки исходного файла. Если вы не уверены в кодировке вашего исходного файла и используете Windows, вы можете попробовать Notepad , где вы можете изменить кодировку. Вы также могли бы попробоватьhtmlentities($tmp, ENT_COMPAT, 'ISO8859-1');
, поскольку это другая распространенная кодировка.
Ответ №4:
Вы всегда могли бы сделать:
$tmp = str_replace(array('æ','ø','å'),array('amp;Oslash;','amp;aelig;','amp;aring;'),$tmp);
Комментарии:
1. Я мог бы, но это могли быть другие символы, такие как
é, è, ë, ê, É,
и т.д. Поэтому я не хочу составлять большой список.