HTML5和神秘字符集

4

这是我在SO发的第一篇帖子,请客气点。

我正在开发一个网络应用程序,利用新的HTML5 target.result功能可以在无需上传任何内容到服务器的情况下读取文本文件的内容。

我的问题在于字符集。通常,网页内容是通过页面本身生成的博客文章、评论或其他内容来遵循该页面和数据库配置的字符集规范。然而,这种新的HTML5功能允许我们获取文本文件内容,而不知道所查询文档的原始字符集或格式。

编码数据后通过ajax发送数据是有意义的,因此我尝试了许多不同的方法将文本转换为UTF-8,并通过各种数据类型。我已经走过了整个chartset之路,htaccess、meta、content-type。

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

我认为社区可以从一种解决方案中受益,这种解决方案可以获取任何类型的文本文档的文本内容,而不考虑该文档的字符集或格式,以任何语言显示它的原始形式,并添加utf-8作为附加优势。没有谁看不懂的怪异符号,最终终结那些菱形问号。

这里是我目前的进展示例。

复制这篇新闻文章:新闻文章

...在这里粘贴:瑞士转换工具

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

那么谷歌是如何解决Google翻译的问题的呢?

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

编辑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);
}
}

当我将两者都设置为原始值时,似乎可以工作。你能否展示一些代码,在你的应用中这种方法会失败吗? - Dave Chen
嗨,戴夫。是的,但据我所知,ajax不使用原始数据,并且它具有默认的utf-8字符集,如果我没有弄错的话。如果我可以以原始格式通过ajax发送和接收数据,那将是很棒的,但可悲的是它总是以某种方式进行编码。问题在于不知道文本从哪里进行编码,然后将其编码为utf-8而没有问题。 - user3743250
@user3743250 给我们展示一些代码,例如jsFiddle。为了从文本文件中获取文本,社区受益于字节顺序标记(BOM),所有非遗留文本文件都应该包含它。不会出现菱形问号。 - xmojmr
有趣,我一定会研究一下。虽然我不太确定如何将其应用到我的代码中... - user3743250
1个回答

1

由于没有人回答,我将根据我以前进行的类似工作来尝试回答。这项工作是为一个不能理解utf-8但生成html的旧应用程序创建实时翻译。

它只涉及从有问题的字符代码创建映射表到其html实体等效项。例如,ñ => &ntilde; 。以下是一些示例代码。

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演示,当然你需要设置适当的映射。

非常感谢您的回答。这正是我担心的,但我开始认为这是唯一的方法。因此,我需要一张来自世界各地每种语言中所有有问题字符的地图。是否有任何地方可以下载这些字符的预定义地图? - user3743250

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