У меня есть такая строка — Panamá
, Мне нужно преобразовать эту строку в Panam\xE1
так что он читается в файле JavaScript, который я генерирую с помощью PHP.
Есть ли функция для кодирования этого в PHP? Любые идеи были бы хорошы.
Если предположить, что ваш ввод в кодировке latin-1, то ord
а также dechex
буду делать что хочешь
$result = preg_replace_callback(
'/[\x80-\xff]/',
function($match) {
return '\x'.dechex(ord($match[0]));
},
$input);
Если ваши входные данные представлены в любой другой кодировке, вам необходимо знать, что это за кодировка, и соответствующим образом адаптировать решение. Обратите внимание, что в этом случае было бы невозможно использовать конкретно \x##
запись в выводе JS во всех случаях.
Мое правило таково,
Если вы пытаетесь кодировать или экранировать данные, используя preg_replace или же
используя массивные картографические массивы или же str_replace, СТОП Вы, вероятно, делаете это неправильно.
Все, что нужно, это одно пропущенное или ошибочное отображение (и вы пропустите некоторые сопоставления) затем вы получите код, который работает не во всех случаях, и код, который в некоторых случаях повреждает ваши данные. Были написаны целые библиотеки, уже предназначенные для выполнения переводов за вас (например, iconv) и для экранирования данных, вы должны использовать соответствующую функцию PHP.
Если вы планируете выводить данные в браузер (факт, который вы хотите закодировать для javascript, предлагает это), тогда я предлагаю использовать кодировку UTF8. Если ваши данные в латинице-1, используйте utf8_encode функция.
Независимо от того, содержит ли ваша строка PHP символы ASCII или нет, для отправки любых данных из PHP в JS вам следует ВСЕГДА используйте функцию json_encode.
Код PHP
$your_encoding = 'latin1';
$panama = "Panamá";
//Get your data in utf8 if it isnt already
$panama = iconv($your_encoding, "utf-8", $panama);
$panama_encoded = json_encode($panama);
echo "var js_panama = " . $panama_encoded . ";";
Выход JS
var js_panama = "Panam\u00e1";
Несмотря на то, что JSON поддерживает юникод, он может быть несовместим с вашим файлом JavaScript не в формате UTF-8. Это не проблема, потому что функция PHP json_encode по умолчанию будет экранировать символы Юникода.
Это должно работать для вас:
$str = "Panamá";
$str = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($m) {
$utf = iconv('UTF-8', 'UCS-4', current($m));
return sprintf("\x%s", ltrim(strtoupper(bin2hex($utf)), "0"));
}, $str);
echo $str;
Выход (исходный код):
Panam\xE1