2017-03-18 33 views
0

我正在使用以下AJAX调用从同一Github库中的另一个目录中获取包含日文字符的文本文件。通过AJAX从Github检索到的日文文本文件出现乱码

$.ajax({ 
    type: "GET", 
    url: "https://raw.githubusercontent.com/mystuff/japaneseProject/master/data/jp.txt", 
    contentType: 'text/plain; charset=utf-8', 
    dataType: "text", 
    cache: false, 
    success: function(data) { 
     console.log(data); 
    } 
}); 

console.log(data)输出,然而,仅仅是垃圾:

enter image description here

有些事情正在发生与编码,可能是,但我不知道是什么。最初这个URL是一个完美运行的直接Dropbox链接,但是由于Dropbox停止使用它的公共文件夹,它不再这样做。

如果我尝试其他托管服务,例如Google Drive,我会遇到CORS错误或输出相同的垃圾。

Here's an example of the text file

+1

嘿,你可以向我们提供偶然的数据集,网址是一个死链接。 – Neil

+0

@nfnneil我添加了一个链接到数据集。这只是一个日文频率单词列表的文本文件。 – user341554

+0

它对我来说很完美,我用我自己的服务器,http://neil.computer/stack/japanese.txt(pastebin不允许交叉起源)。尝试使用它,然后呢? – Neil

回答

2

您的pastebin链接是没有用的。
问题很可能是您的.txt文件已被编码为许多日语字符集编码之一,但您的页面的编码设置为utf-8。

两种解决方案则:

  • 最简单的,重新编码的TXT文件为UTF-8。

  • 如果您不能,您可以将文件作为Blob获取,然后通过FileReader以及readAsText(blob, encoding)的第二个参数将其作为文本读取。

(在下面的例子中,我做了编码的TXT文件作为ISO-2022-JP)

fetch('https://dl.dropboxusercontent.com/s/ikr7tk47ygt2mfe/test-ISO2022-JP.txt?dl=0') 
 
    .then(resp => resp.text()) 
 
    .then(text => raw.innerHTML = text); 
 
    
 
fetch('https://dl.dropboxusercontent.com/s/ikr7tk47ygt2mfe/test-ISO2022-JP.txt?dl=0') 
 
    .then(resp => resp.blob()) 
 
    .then(blob => { 
 
    let fr = new FileReader(); 
 
    fr.onload = e => fileRead.innerHTML = fr.result; 
 
    fr.readAsText(blob, 'ISO-2022-JP'); 
 
    });
table { 
 
    margin-top: 12px; 
 
    border-collapse: collapse; 
 
} 
 

 
td, 
 
th { 
 
    border: 1px solid #000; 
 
    padding: 2px 6px; 
 
    vertical-align: top; 
 
} 
 

 
tr { 
 
    border: 0; 
 
    margin: 0; 
 
}
<table> 
 
<tr> 
 
<th>Raw response as text</th> 
 
<th>From FileReader + encoding</th> 
 
</tr> 
 
<tr> 
 
<td><pre id="raw"></pre></td> 
 
<td><pre id="fileRead"></pre></td> 
 
</tr> 
 
</table>

+0

有没有办法检查文件的编码?我很确定我将它保存为Windows记事本中的“Unicode”。这会有所作为,如果是的话,为什么我原来的直接Dropbox链接工作,但不是Github上的原始文件? – user341554

+0

刚刚用重新编码的文件再次尝试过。我想显然Unicode和UTF-8毕竟不是一回事!总是想知道这两个选项之间的区别是什么...... – user341554

+0

@ user351554啊窗口和编码...根据[这个答案](http://stackoverflow.com/questions/13894898/unicode-file-in-notepad)记事本的* unicode *是utf-16的小端。没有办法检查文件的编码。我们所能做的最好的是猜测(例如通过检查未知字符或字符范围)。但是日本人是最难以察觉的语言之一,并且没有单一的防弹措施。 – Kaiido