Какая функция PHP преобразует ø в

#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. Я мог бы, но это могли быть другие символы, такие как é, è, ë, ê, É, и т.д. Поэтому я не хочу составлять большой список.