【问题标题】:HTML5 and the mystery charsetHTML5 和神秘字符集
【发布时间】:2014-06-16 01:30:14
【问题描述】:

这是我在 SO 的第一篇文章,所以要温柔。

我目前正在开发一个利用新 HTML5 target.result 的网络应用程序。这使我无需将任何内容上传到服务器即可读取文本文件的内容。

我遇到的问题是关于字符集的。因此,通常 Web 内容是通过页面本身生成的,作为博客文章、评论或任何符合该页面字符集和数据库配置的内容。然而,这个新的 HTML5 功能允许我们在不知道相关文档的原始字符集或格式的情况下获取文本文件内容。

在 ajax 发布数据之前对其进行编码是有意义的,因此我尝试了许多不同的方法将文本转换为 utf-8 以及通过各种数据类型。我已经走过了整个图表集之路,htaccess,meta,content-type。

毫不奇怪,这么多人发现使用不同字符集、ASCII、不同语言和 ajax 数据类型对 URI 进行编码、解码的整个过程如此痛苦。

我认为社区可以从一种解决方案中受益,该解决方案可以从任何类型的文本文档中获取文本,无论字符集或格式如何,采用任何语言,并通过 ajax 请求响应以其原始形式显示它,并具有额外的 utf- 8.没有任何人看不懂的奇怪符号,最终终结了那些菱形问号。

这是我现在所处位置的一个示例。

复制这篇新闻文章:News Article

...粘贴到这里:swiss converter tool

无论我使用什么配置,我都无法在底部输出中正确显示撇号,似曾相识吗?

那么谷歌是如何通过谷歌翻译解决这个问题的呢?

编辑: 另外值得注意的是,ABC 新闻和瑞士工具转换器的字符集都是 utf-8。您可以清楚地看到,从 utf-8 转换为 utf-8 也会产生奇怪的符号,即使它们是完全相同的字符集。

EDIST: 2 好的,所以我设法打乱了一个快速原型并将其上传到远程服务器。您可以通过babblingo访问它

这是通过 ajax 发布文本的 javascript:

function handleFileSelect(evt) {

evt.stopPropagation();
evt.preventDefault();

var files = evt.dataTransfer.files;

for (var i = 0, f; f = files[i]; i++) {
    var reader = new FileReader();
    reader.onload = (function(theFile) {
        return function(e) {
            var insertText = e.target.result;
            var fields = 'text=' + insertText;
            $.ajax({
                type: "POST",
                url: "ajax.php?action=addfile",
                data: fields,
                dataType: "json",
                complete: function (data) {
                    if (data.responseJSON.message) {
                        $( "#modal-message h4" ).replaceWith( "<h4 class='modal-title text-center'>"+data.responseJSON.message+"</h4>" );
                    }
                    if (data.responseJSON.report) {
                        $( "#report_box" ).replaceWith( '<div id="report_box">'+data.responseJSON.report+'</div>' );
                    }
                    if (data.responseJSON.import) {
                        $('#output_box').replaceWith('<div id="output_box" class="hidden-print">'+data.responseJSON.import+'</div>');
                    }
                    $('#modal-message').modal('show');
                    setTimeout(function() {$('#modal-message').modal('hide');}, 3000);
                }
            });


        };
    })(f);

    reader.readAsText(f);
}
}

【问题讨论】:

  • 当我将两者都设置为原始时,它似乎工作。你能在你的应用程序中显示一些失败的代码吗?
  • 嗨,戴夫。是的,但据我所知,ajax 不使用原始数据,如果我没记错的话,它有一个默认的 utf-8 字符集。如果我可以通过 ajax 以原始格式发送和接收数据,那就太棒了,但遗憾的是它总是以某种方式编码。问题是不知道文本是从什么编码的,然后毫无问题地将其编码为 utf-8。
  • @user3743250 向我们展示一些代码,例如jsFiddle。为了从文本文件中获取文本,社区受益于所有非传统文本文件应包含的Byte Order Marks (BOM)。没有菱形问号
  • 有趣,我一定会调查的。虽然我不太确定如何将它应用到我的代码中......

标签: php jquery html


【解决方案1】:

由于没有人回答这个问题,我将根据我对不理解 utf-8 但生成 html 的遗留应用程序的即时翻译所做的类似工作来冒险回答。

它只涉及创建一个从有问题的字符代码到它的等效 html 实体的映射表。 ñ => ñ例如。这是一些示例代码。

function createEntities(source) {
    var map = [
       { key:"á", value: "<b>&aacute;</b>"},
       { key:"ñ", value: "<b>&ntilde;</b>"},
        { key:"ó", value: "<b>&oacute;</b>" },
       { key:"'", value: "<b>&apos;</b>" }
    ];
    var target = source;
    for ( prop in map ) {
       var pair = map[prop];
       target = target.replace(pair.key,pair.value)
    }
    return target;
}

这里有一个jsFiddle 演示了这一点。当然,您需要设置适当的映射。

【讨论】:

  • 感谢您的回答。这是我害怕的,但我开始认为这是唯一的方法。所以,我需要一张来自世界各地每种语言的所有有问题的字符的地图。有什么地方可以下载这些字符的预定义地图?
猜你喜欢
  • 2018-11-24
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
相关资源
最近更新 更多