在JS中进行Base64编码并在PHP中解码时出现了Umlauts问题

3

我搜索了很多但仍未找到问题的原因:

在调用我的php webservice时,我将登录凭据("PeterPan:Ützel([])ÄÄÖÖ'")进行编码,并使用UTF-8传递:

$.ajaxSetup({
        beforeSend: function(request) {
            request.setRequestHeader("Authentication", auth);
        },
        type: "POST",
        contentType: "charset=utf-8"
    });
var tok = sUsername + ':' + sPassword;
    var hash = this.Base64.encode(tok);
    var auth = hash;
$.ajax({
        url: "php/login.php"
    });

在PHP中,我正在使用以下方法解码字符串:
$headers = array();
foreach($_SERVER as $key => $value) {
    if (substr($key, 0, 5) <> 'HTTP_') {
        continue;
    }
    $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
    $headers[$header] = $value;
}

$response['Encoded'] = base64_decode($headers['Authentication']);
$encoded = json_encode($response);
header("Content-Type: text/html; charset=utf-8");
echo $encoded;

当响应到达时,编码的字符串看起来像这样:"PeterPan:\u00dctzel([])\u00c4\u00c4\u00d6\u00d6'"

这些umlauts(附加符号)被错误地编码了...

我做错了什么?

2个回答

1
你可以做以下操作:
JavaScript 代码:
// returns PeterPan%3A%C3%9Ctzel(%5B%5D)%C3%84%C3%84%C3%96%C3%96
var value = encodeURIComponent(sUsername + ':' + sPassword);

PHP:

header('Content-Type: text/html; charset=utf-8'); // might need this

// returns PeterPan:Ützel([])ÄÄÖÖ
echo rawurldecode("PeterPan%3A%C3%9Ctzel(%5B%5D)%C3%84%C3%84%C3%96%C3%96");

0

我相信umlauts已经被正确编码了。但是如果你需要将其打印或输出到浏览器,那么你可能需要使用iconv()指定正确的编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接