我有一个像这样的字符串 - Panamá
。我需要将此字符串转换为Panam\xE1
,以便在我使用PHP生成的JavaScript文件中可读。
是否有在PHP中对此进行编码的功能?任何想法都将不胜感激。
答案 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编码,则ord
和dechex
将执行您想要的操作:
$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