PHP кодирование с использованием Unicode - PullRequest
0 голосов
/ 05 июля 2010

Как я могу получить сущность HTML из таких вещей, как \u00e4, что означает &aauml; (ä)?

У меня есть обратная косая черта в строке, по причине побега. Когда я снимаю косую черту, я получаю что-то вроде u00e4. Я должен убрать ресницы, чтобы иметь возможность хранить и восстанавливать его в сеансе.

Ответы [ 4 ]

3 голосов
/ 05 июля 2010

С htmlentities () :

<?php

echo htmlentities("\xE4");

?>

Однако стоит отметить, что:

  1. Сеансы не заботятся о кодировке символов.
  2. Сущности HTML не требуются в документах HTML Unicode (за исключением символов с особым значением в HTML, таких как < и >).

Так что это не решит вашу проблемуэто просто скроет; -)

Обновление

Я упустил ссылку на \00e4 в исходном вопросе.Символ ä соответствует кодовой точке U+00E4 Unicode.Однако PHP не поддерживает кодовые точки Unicode.Если вам нужно набрать его в своем коде PHP , и на вашей клавиатуре нет такого символа, вы можете сохранить документ как UTF-8 и затем предоставить байты UTF-8 (c3а4) с синтаксисом двойных кавычек :

<?php
// \[0-7]{1,3} or \x[0-9A-Fa-f]{1,2}
echo "\xc3\xa4";
?>

Тем не менее, это не имеет отношения к сеансам или HTML.Я не могу понять, в чем именно заключается ваша проблема.

Второе обновление

Так что serialize () не может обрабатывать ассоциативные массивы, а json_decode () не может передаваться с помощью вывода json_encode () ...

<?php

$associative_array = array(
    'foo' => 'ä',
    'bar' => 33,
    'gee' => array(10, 20, 30),
);

var_dump($associative_array);
echo PHP_EOL;
var_dump(serialize($associative_array));
echo PHP_EOL;
var_dump(unserialize(serialize($associative_array)));
echo PHP_EOL;

var_dump(json_encode($associative_array));
echo PHP_EOL;
var_dump(json_decode(json_encode($associative_array)));
echo PHP_EOL;

?>

...

array(3) {
  ["foo"]=>
  string(2) "ä"
  ["bar"]=>
  int(33)
  ["gee"]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(20)
    [2]=>
    int(30)
  }
}

string(83) "a:3:{s:3:"foo";s:2:"ä";s:3:"bar";i:33;s:3:"gee";a:3:{i:0;i:10;i:1;i:20;i:2;i:30;}}"

array(3) {
  ["foo"]=>
  string(2) "ä"
  ["bar"]=>
  int(33)
  ["gee"]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(20)
    [2]=>
    int(30)
  }
}

string(42) "{"foo":"\u00e4","bar":33,"gee":[10,20,30]}"

object(stdClass)#1 (3) {
  ["foo"]=>
  string(2) "ä"
  ["bar"]=>
  int(33)
  ["gee"]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(20)
    [2]=>
    int(30)
  }
}

Мне кажется, что вы добавляете несколько уровней сложности к простому сценарию, потому что вы делаете предположения о том, как работают некоторые функции PHP вместопроверить руководство или проверить себя.На данный момент предоставленная информация едва ли напоминает исходный вопрос, и мы до сих пор не увидели ни единой строки кода.

Пока мой совет: попытайтесь прекратить отладку приложения в целом, разделите егона меньшие части и используйте var_dump (), чтобы узнать, что на самом деле генерирует каждая из этих частей.Не принимайте вещи: сами проверяйте вещи.Также учтите, что PHP не поддерживает Unicode, как это делают другие языки.Каждая отдельная задача, которая включает обработку двухбайтовой строки, должна быть тщательно реализована с помощью соответствующих многобайтовых функций, которые часто требуют жесткого кодирования кодировки символов.

1 голос
/ 05 июля 2010

Как вы думаете, у вас проблемы с перезагрузкой? Вы выводите это на страницу HTML? В этом случае вы могли установить неправильную кодировку. Что касается использования сущностей, проверьте это: htmlentitites

0 голосов
/ 05 июля 2010

Как вы можете видеть в обсуждениях и ответах, это проблема, с которой php не может справиться с native (или до сих пор никто здесь не знает)

Я предлагаю использовать эту очень сложную функцию ...Я имею в виду, это мое решение, которое мне не очень нравится.

function parse_umlaut($string){

        $string = str_replace('u00c4', 'Ä', $string);
        $string = str_replace('u00e4', 'ä', $string);
        $string = str_replace('u00d6', 'Ö', $string);
        $string = str_replace('u00f6', 'ö', $string);
        $string = str_replace('u00dc', 'Ü', $string);
        $string = str_replace('u00fc', 'ü', $string);
        $string = str_replace('u00df', 'ß', $string);

        return $string;
 }
0 голосов
/ 05 июля 2010

Я не уверен, что это поможет вам, но взгляните на Wordpress ' sanitize_title функцию, где вы можете найти несколько огромных таблиц символов.

...