在Nginx日志中发现,nginx将特殊字符转化为16进制,看起来很不方便,使用PHP和Ruby转换为原字符,方法如下:
PHP
public function x22()
{
$request_body = '{\x22no\x22:\x222020042309311\x22,\x22php\x22:\x22\x5Cu53d1\x5Cu53d1\x5Cu53d1\x22}';
$new_request_body = '';
$pt = 0;
while ($pt < strlen($request_body)) {
if ($request_body[$pt] == '\\' && $request_body[$pt + 1] == 'x') {
//\x22为16进制,转换为10进制,再转化为ASCII码
$new_request_body .= chr(hexdec($request_body[$pt] . $request_body[$pt + 1] . $request_body[$pt + 2] . $request_body[$pt + 3]));
$pt = $pt + 4;
} else {
$new_request_body .= $request_body[$pt];
$pt = $pt + 1;
}
}
print_r($new_request_body);
}
php.png
Ruby
#!/usr/bin/ruby -w
request_body = "{\x22no\x22:\x222020042309311\x22,\x22php\x22:\x22\x5Cu53d1\x5Cu53d1\x5Cu53d1\x22}"
new_request_body = ''
pt = 0
while pt < request_body.length do
# 如果是中文, 转码
if request_body[pt] == '\\' and request_body[pt + 1] == 'x' then
word = (request_body[pt + 2] + request_body[pt + 3]).to_i(16).chr
new_request_body = new_request_body + word
pt = pt + 4
# 如果是英文, 不处理
else
new_request_body = new_request_body + request_body[pt]
pt = pt + 1
end
end
puts '翻译结果:'
puts new_request_body
ruby.png
JavaScript
var request_body = '{\x22no\x22:\x222020042309311\x22,\x22php\x22:\x22\x5Cu53d1\x5Cu53d1\x5Cu53d1\x22}';
var new_request_body = '';
var pt = 0;
while(pt < request_body.length){
if (request_body[pt] == '\\' && request_body[pt + 1] == 'x') {
//\x22为16进制,转换为10进制,再转化为ASCII码
new_request_body += parseInt(request_body[pt] + request_body[pt + 1] + request_body[pt + 2] + request_body[pt + 3],16).fromCharCode();
pt = pt + 4;
} else {
new_request_body += request_body[pt];
pt = pt + 1;
}
}
console.log(new_request_body);
写作不易,如果您觉得对您有帮助,请您给我点个赞或者关注我 [送你小花花~]
网友评论