使用非ascii字符编码字符串

时间:2015-01-24 22:38:07

标签: php hex encode

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

是否有在PHP中对此进行编码的功能?任何想法都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我的规则是,

  

如果您尝试使用 preg_replace 或来编码或转义数据   使用大量映射数组 str_replace 停止你可能做错了。

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

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

无论您的PHP字符串是否包含ASCII字符,要将任何数据从PHP发送到JS,您应始终 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字符。

答案 1 :(得分:0)

假设您的输入采用latin-1编码,则orddechex将执行您想要的操作:

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

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

答案 2 :(得分:-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