我有这样的字符串
\u041d\u0418\u041a\u041e\u041b\u0410\u0415\u0412
如何将此内容转换为UTF-8编码?给定字符串的编码是什么?感谢您的参与!
简单的方法是将你的字符串用双引号包裹,让json_decode
函数将\u0000
转义字符转换成Javascript字符串语法。
$str = json_decode("\"$str\"");
看起来是俄文: НИКОЛАЕВ
(当json_decode
返回时,它已经是UTF-8格式了。)
如果要在PHP中解析该字符串,可以使用{{link1:json_decode
}},因为JSON支持该Unicode文字格式。
\uXXXX
的Unicode转义序列,此时你应该使用json_decode()
解码这些文档,而不是手动挑选字符串。
如果你想要生成没有Unicode转义序列的JSON文档,则应该在json_encode()
中使用JSON_UNESCAPED_UNICODE
标志。然而,默认情况下启用转义,因为它们很可能通过各种中间系统安全传输。我强烈建议除非你有充分的理由不这样做,否则保留转义。
最后,如果你只是想让Unicode文本以某种方式“安全”,请阅读以下SO主帖:UTF-8 all the way through
如果在三段“不要这样做”的内容之后,你仍然想这样做,那么这里有一些用于在任意文本中应用/移除\uXXXX
转义的函数:<?php
function utf8_escape($input) {
$output = '';
for( $i=0,$l=mb_strlen($input); $i<$l; ++$i ) {
$cur = mb_substr($input, $i, 1);
if( strlen($cur) === 1 ) {
$output .= $cur;
} else {
$output .= sprintf('\\u%04x', mb_ord($cur));
}
}
return $output;
}
function utf8_unescape($input) {
return preg_replace_callback(
'/\\\\u([0-9a-fA-F]{4})/',
function($a) {
return mb_chr(hexdec($a[1]));
},
$input
);
}
$u_input = 'hello world, 私のホバークラフトはうなぎで満たされています';
$e_input = 'hello world, \u79c1\u306e\u30db\u30d0\u30fc\u30af\u30e9\u30d5\u30c8\u306f\u3046\u306a\u304e\u3067\u6e80\u305f\u3055\u308c\u3066\u3044\u307e\u3059';
var_dump(
utf8_escape($u_input),
utf8_unescape($e_input)
);
输出:
string(145) "hello world, \u79c1\u306e\u30db\u30d0\u30fc\u30af\u30e9\u30d5\u30c8\u306f\u3046\u306a\u304e\u3067\u6e80\u305f\u3055\u308c\u3066\u3044\u307e\u3059"
string(79) "hello world, 私のホバークラフトはうなぎで満たされています"
json_decode
返回一个 UTF-8 字符串,再次使用utf8_encode
是没有帮助的。 - hakre