Строка кодирования с не-ascii символами

У меня есть такая строка — Panamá, Мне нужно преобразовать эту строку в Panam\xE1 так что он читается в файле JavaScript, который я генерирую с помощью PHP.

Есть ли функция для кодирования этого в PHP? Любые идеи были бы хорошы.

1

Решение

Если предположить, что ваш ввод в кодировке latin-1, то ord а также dechex буду делать что хочешь

$result = preg_replace_callback(
'/[\x80-\xff]/',
function($match) {
return '\x'.dechex(ord($match[0]));
},
$input);

Если ваши входные данные представлены в любой другой кодировке, вам необходимо знать, что это за кодировка, и соответствующим образом адаптировать решение. Обратите внимание, что в этом случае было бы невозможно использовать конкретно \x## запись в выводе JS во всех случаях.

0

Другие решения

Мое правило таково,

Если вы пытаетесь кодировать или экранировать данные, используя 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 по умолчанию будет экранировать символы Юникода.

1

Это должно работать для вас:

$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
-1
По вопросам рекламы [email protected]