Python和Java Deencor字符之间的多字节错误

2024-10-06 11:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个Django应用程序,它调用javarestapi并检索多语言结果(结果首先来自Elasticsearch)。我可以很好地检索结果并将其存储到一个对象中,但是在Javascript中显示结果会给我带来垃圾-这应该是俄语:

a junk

当将其转换为字符串或尝试转换为unicode时,我得到:

UnicodeEncodeError at /getObjectArticles
'ascii' codec can't encode characters in position 23-24: ordinal not in range(128)

我知道API返回的数据很好,因为用Java应用程序调用很好。你知道如何处理传入的字符串以便它是可识别的字符吗?在

编辑:我的摄取代码。。在

^{pr2}$

编辑:我的Javascript/JQUERY

// Load article text
function getArticleText(articleId, index) {
    console.log($('#result_number').val());
    var es_url = gu.webapp_url + '/getArticle?articleId=' + encodeURIComponent(articleId) + "&index=" + encodeURIComponent(index);

    $.get(es_url).success(function(data) {
        console.log(data);
        var decodedText = $("<div/>").html(data.text).text();
        var decodedTitle = $("<div/>").html(data.articleTitle).text();

        // Close Article View Button
        $('#g2i2-article-info').html("<div id=\"closeArticleInfo\" class=\"closeWindow\">X</div>");

        // Article Info Table
        var articleTable = "<table class=\"table table-striped table-bordered table-condensed\">";
        articleTable = articleTable + "<tr><td>Title</td><td>" + decodedTitle + "</td></tr>";
        articleTable = articleTable + "<tr><td>Publication Date</td><td>" + data.pubDate + "</td></tr>";
        articleTable = articleTable + "<tr><td>Source Name</td><td>" + data.sourceName + "</td></tr>";
        articleTable = articleTable + "<tr><td>Location</td><td>" + data.locationName + "</td></tr>";
        articleTable = articleTable + "<tr><td>URL</td><td>" + data.url + "</td></tr>";
        articleTable = articleTable + "</table>"
        $('#g2i2-article-info').append(articleTable);

        // Article Text
        $('#g2i2-article-info').append(decodedText);
        $('#g2i2-article-info').css('display', 'block');

    }).error(function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus + " " + errorThrown);
    });

}

Tags: textdivinfourldataindexvararticle
1条回答
网友
1楼 · 发布于 2024-10-06 11:23:20

您的服务器上已经有Unicode数据;response.json()为任何JSON字符串生成Unicode值。没有必要尝试去破译它。在

浏览器产生了这个Latin 1 Mojibake。浏览器被发送UTF-8(一种多字节编码),而浏览器将单个字节解释为拉丁1字符。例如,您的标题以西里尔文字Со开头,它被编码为UTF-8,然后被误解为拉丁语1:

>>> u'Со'
u'\u0421\u043e'
>>> u'Со'.encode('utf8')
'\xd0\xa1\xd0\xbe'
>>> print u'Со'.encode('utf8').decode('latin1')
Со

因此,UTF-8中的D0A1字节组成了一个码位,现在被打印成两个拉丁语-1字符。在

Ñ字符是D1字节,后面可以跟大约33个不可打印的第二个UTF-8字节组成一个范围在рѠ之间的字符。接下来是и,实际上是и,等等

你需要弄清楚为什么浏览器认为你的数据是拉丁语1。在

通常,这是由发送到浏览器的Content-Type报头确定的;如果它被设置为text/html; charset=ISO-8851-1,那么浏览器的行为就好像所有文本都是拉丁语1一样。可能是HTML页面有一个<meta>标记,<meta charset="ISO-8851-1">或{}中的一个或类似标记,其中有几个密切相关的编码都具有类似的Mojibake效果。在

另一个选择是将其显式编码为UTF-8,然后在将其发送到浏览器之前设法将其解码到拉丁语-1。在

第三种选择是,您使用的JSON服务本身以jsonunicode字符串向您发送拉丁语-1字节,从而为您提供Mojibake源代码。在这种情况下,您仍然可以通过编码到拉丁语1然后从UTF-8解码来修复它:

^{pr2}$

但只有在确认服务器上的数据已经被mojibake之后才能这样做。在

相关问题 更多 >