使用非 ascii 字符编码字符串

Encoding string with non-ascii characters

我有一个这样的字符串 - Panamá。我需要将此字符串转换为 Panam\xE1,以便它在我使用 PHP 生成的 JavaScript 文件中可读。

在PHP中是否有一个函数可以对此进行编码?任何想法将不胜感激。

这应该适合你:

$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

假设您的输入是 latin-1 编码,那么 orddechex 将执行您想要的操作:

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

如果您的输入采用任何其他编码,那么您需要知道那是什么编码并相应地调整解决方案。请注意,在这种情况下,不可能在所有情况下都在 JS 输出中专门使用 \x## 符号。

我的规则是,

If you try to encode or escape data using preg_replace or using massive mapping arrays or str_replace, STOP you are probably doing it wrong.

只需要一个遗漏或错误的映射(并且您将遗漏一些映射)然后您将得到在所有情况下都不起作用的代码和损坏的代码在某些情况下您的数据。已经编写了整个库专门为您进行翻译(例如 iconv)和转义数据,您应该使用正确的 PHP 函数。

如果您计划将数据输出到浏览器(您想要为 javascript 编码的事实表明了这一点),那么我建议使用 UTF8 编码。如果您的数据是 latin-1,请使用 utf8_encode 函数。

无论您的 PHP 字符串是否包含 ASCII 字符,要将任何数据从 PHP 发送到 JS,您应该 ALWAYS use the json_encode function

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 支持 unicode,但它可能与您的非 UTF-8 javascript 文件不兼容。这不是问题,因为 json_encode PHP 函数默认会转义 unicode 字符。