Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Кодировать в "JavaScript Unicode string"


Автор: GZep 20.7.2010, 21:54
Здравствуйте!

Нашел вот такой сервис:
http://www.auditmypc.com/html-encoder.asp
И вот, что он делает:

есть текст:
Код

1234 бла бла la la†®

преобразуем через сервис, получаем:
Код

\u0031\u0032\u0033\u0034\u0020\u0431\u043B\u0430\u0020\u0431\u043B\u0430\u0020\u006C\u0061\u0020\u006C\u0061\u2020\u00AE

Работает там flash файлик, а распотрашить swf нет возможности smile 

Ближайший аналог который нашел на PHP - json_encode()
Код

echo json_encode("1234 бла бла la la†®", JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP);

получаем:
Код

1234 \u0431\u043b\u0430 \u0431\u043b\u0430 la la\u2020\u00ae

То есть json_encode преобразовал не все символы, то есть для данной задачи нужно что-то другое. Буду рад любой помощи! smile 

Автор: skyboy 20.7.2010, 22:17
Код

function test($matches) {
// надо вернуть код символа, хранящегося в $matches[0]
// спереди прицепить строку "\u"
// сходу не вспомнил, какой функцией это сделать
}
$str = '1234 бла бла la la†®';
$str = preg_replace_callback('#.#u', 'test', $str);

Автор: GZep 21.7.2010, 00:16
Вот накатал немного:
Код

$text = "1234 бла бла la la†®";

echo "Количество символов в строке: " . strlen($text) . "<br />\n";//29
$utf16 = mb_convert_encoding($text, 'UTF-16', 'UTF-8');
$arr = str_split($utf16);
$out = "";
echo "Количество элементов массива после str_split: " . count($arr) . "<br />\n";//40 (!!!!!) сорок!!!1111адинадин

/**
 * Цикл нестандартный:
 * $i не 0, а 1
 * шаг не 1, а 2
 */
for ($i = 1, $n = count($arr); $i < $n; $i += 2) {

    $out .= sprintf('\u%04s', bin2hex($arr[$i]));

}

echo $out;//\u0031\u0032\u0033\u0034\u0020\u0031\u003b\u0030\u0020\u0031\u003b\u0030\u0020\u006c\u0061\u0020\u006c\u0061\u0020\u00ae


Результат подходящий, но метод... итого на данный момент:
  • работаем проходя циклом по каждому символу... не айс : (
  • не то, что проходя по каждому, а даже через одного - щаг цикла - 2
  • спасибо str_split за некорректную работу

Выжал из своего мозга все соки, вырубаюсь, иду спать)) быть может, кто-нибудь доработает smile 

Автор: ksnk 21.7.2010, 01:04
http://www.sysman.ru/index.php?showtopic=16981?

Автор: GZep 21.7.2010, 11:26
Цитата(ksnk @  21.7.2010,  01:04 Найти цитируемый пост)
не оно? 

кажись, оно!
вывод:
Код

%u0031%u0032%u0033%u0034%u0020%u0431%u043b%u0430%u0020%u0431%u043b%u0430%u0020%u006c%u0061%u0020%u006c%u0061%u2020%u00ae

сейчас только подкорректирую smile

Добавлено @ 11:40
Итак, благодаря уважаемому ksnk (+), появился второй вариант:
Код

function js_urlencode($str) {

    $str = mb_convert_encoding($str, "UTF-16", "UTF-8");
    $buf = "";

    for ($i = 0, $n = mb_strlen($str, "UTF-16"); $i < $n; $i++) {

        $buf .= "\u" . bin2hex(mb_substr($str, $i, 1, "UTF-16"));

    }

    return $buf;

}

echo js_urlencode("1234 бла бла la la†®");//\u0031\u0032\u0033\u0034\u0020\u0431\u043b\u0430\u0020\u0431\u043b\u0430\u0020\u006c\u0061\u0020\u006c\u0061\u2020\u00ae 

Результат впринципе совпадает с моим "наклёпанным" и "костыльным", да и принцип действия похожий, но этот, вроде, чище и, наверное, побыстрее будет. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)