客户端或服务器正在删除变音符号

client or server is removing umlauts

我正在使用 btoa 将我的字符串编码为 base64。但是,它似乎无法正常工作,无论出于何种原因,所有变音符号都会被删除。

我试图演示它,但在这个页面上它有效:

var content = "This text contains umlauts (ÖÜÄ) they will be removed on my webpage, but not in this demo for whatever reason";

alert(content);

content = btoa(content);

alert(content);

content = atob(content);

alert(content);

但它在我的网页上不起作用:

这是参数的值content

PHA+VGhpcyB0ZXh0IGNvbnRhaW5zIHVtbGF1dHMgKMTc1ikuIExldHMgc2VlIGlmIHRoZXkgYXJlIGdldHRpbmcgcmVtb3ZlZC48L3A+

如果你解码这个 base64 编码的字符串 here 那么你会得到这个结果:

This text contains umlauts (). Lets see if they are getting removed.

如您所见,无论出于何种原因,变音符号都被删除了。

这是我对字符串进行编码的代码片段,它用于 post 博客的新闻条目:


编辑:下面的代码突然没有任何变化就可以工作了。请参阅下面的其他编辑以获取更多信息。


var content = $(".ql-editor").html();

$.ajax({
    url: "ajax.php",
    method: "POST",
    data: {
        action: "postNews",
        autor: autor,
        content: btoa(content),
        date: date
    },
    success: function(response) {

        if (response.indexOf("error") === -1) {
            $("#statusBoxMessage").html("Ihr Eintrag wurde erfolgreich veröffentlicht.");
            $("#statusBoxImage").attr("src", "gfx/page/checkmark.jpg");
            showStatusBox("success");
        } else {

            $("#statusBoxMessage").html("Fehler! Der Eintrag konnte nicht erstellt werden! (" + response + ")");
            $("#statusBoxImage").attr("src", "gfx/page/fail.jpg");
            showStatusBox("fail");  
        }
    },
    error: function(response) {
        $("#statusBoxMessage").html("Fehler! " + response);
        showStatusBox("fail");
    }
});

编辑:我也有一个几乎相同的脚本,我用它来编辑博客中的新闻条目,它仍然不起作用并删除任何变音符号:


$("#submitEditContent").click(function() {

    var content = $("#editEditor").val();
    var s = 0;

    if (target == "pages/news.html" || target == "news.html") {
        target = currentNewsFilename;
        s = 1;
    }

    $.ajax({
        url: "ajax.php",
        method: "POST",
        data: {
            action: "postEdit",
            content: btoa(content),
            target: target
        },
        success: function(response) {
            if (response == "success") {
                if (s == 0) {
                    window.location.replace("index.php?page=" + target);
                } else {
                    window.location.reload();
                }

            } else {
                console.warn(response);
            }
        }
    });

我希望有人能解释为什么第一个脚本突然停止删除元音符号而第二个脚本仍然删除元音符号。

我用最新的 chrome 浏览器对其进行了测试。

let decoded = atob('PHA+VGhpcyB0ZXh0IGNvbnRhaW5zIHVtbGF1dHMgKMTc1ikuIExldHMgc2VlIGlmIHRoZXkgYXJlIGdldHRpbmcgcmVtb3ZlZC48L3A+')
console.log(decoded)

我认为您网页上的编码没有任何问题。

这在浏览器中工作得很好。 并且 它适用于您引用的外部站点,但您需要将编码设置为 ISO-8859-1 而不是 UTF-8。试一试。

感谢@Matt Morgans 的提示,我解决了这个问题。我们发现客户端一切正常,我不得不更改服务器端代码。

之前:

$content = $_POST["content"];
$content = stripScript(base64_decode($content));
$content = mb_convert_encoding($content, 'UTF-8', 'OLD-ENCODING');

之后:

$content = $_POST["content"];
$content = stripScript(base64_decode($content));
$content = mb_convert_encoding($content, 'UTF-8', 'Windows-1252');

这也有效:

$content = mb_convert_encoding($content, 'UTF-8', 'ISO-8859-1');