CSV 文件在 postman 和 angular http 请求中出现 non-English 个字符错误
CSV file with non-English characters error in postman and angular http request
我上传了一个包含一些德语单词的 CSV 文件。我可以通过 this link 访问该文件。当我尝试通过邮递员获取文件时,响应未完全转换为 utf。
下载文件后,我用excel或记事本++打开文件,我得到了预期的结果。
我再次尝试通过 angular HttpClient 获取文件。我在 Chrome 的网络预览部分收到此回复。
但是当我console.log响应时,现在响应不正确。
我尝试通过邮递员调用添加 Accept: application/csv
和 Accept-Charset: UTF-8
header,但得到相同的结果。
我用angular做了一个stackblitz sample。
您可以将“responseType”更改为“arraybuffer”,然后使用您需要的任何编码对数组进行解码。在这种情况下 iso-8859-2
看看 example.
由于一个字节只能有256个不同的值,而世界上所有语言的集合都超过256个字符,UTF-8需要用多个字节来表示一些字符。通常,像单词“bênção”这样的重音字符在 UTF-8 中表示为 2 个字节(而在 ISO 8859-1 中仅表示为 1 个字节):
b | ê | n | ç | ã | o
ISO 8859-1: 62 | EA | 6E | E7 | E3 | 6F
UTF-8: 62 | C3 AA | 6E | C3 A7 | C3 A3 | 6F
当您尝试阅读以一种编码编写的文本时,就好像它是另一种编码一样,这是一个问题:如果文本以 UTF-8 编写但以 ISO 8859-1 读取,它显示为“bênçà £o”;相反的显示为“b�n��o”
JavaScript中的示例:
var bytesUtf8 = new Uint8Array([0x62, 0xc3, 0xaa, 0x6e, 0xc3, 0xa7, 0xc3, 0xa3, 0x6f]);
var bytesIso = new Uint8Array([0x62, 0xea, 0x6e, 0xe7, 0xe3, 0x6f]);
var decIso = new TextDecoder("iso-8859-1")
var decUtf8 = new TextDecoder("utf-8")
var decBytesIsoCorrect = decIso.decode(bytesIso)
var decBytesUtf8Correct = decUtf8.decode(bytesUtf8)
var decBytesIsoInUtf8 = decUtf8.decode(bytesIso)
var decBytesUtf8InIso = decIso.decode(bytesUtf8)
console.log('iso > iso', decBytesIsoCorrect)
console.log('utf-8 > utf-8', decBytesUtf8Correct)
console.log('iso > utf-8', decBytesIsoInUtf8)
console.log('utf-8 > iso', decBytesUtf8InIso)
注:可以使用iso-8859-n
我上传了一个包含一些德语单词的 CSV 文件。我可以通过 this link 访问该文件。当我尝试通过邮递员获取文件时,响应未完全转换为 utf。
下载文件后,我用excel或记事本++打开文件,我得到了预期的结果。
我再次尝试通过 angular HttpClient 获取文件。我在 Chrome 的网络预览部分收到此回复。
但是当我console.log响应时,现在响应不正确。
我尝试通过邮递员调用添加 Accept: application/csv
和 Accept-Charset: UTF-8
header,但得到相同的结果。
我用angular做了一个stackblitz sample。
您可以将“responseType”更改为“arraybuffer”,然后使用您需要的任何编码对数组进行解码。在这种情况下 iso-8859-2
看看 example.
由于一个字节只能有256个不同的值,而世界上所有语言的集合都超过256个字符,UTF-8需要用多个字节来表示一些字符。通常,像单词“bênção”这样的重音字符在 UTF-8 中表示为 2 个字节(而在 ISO 8859-1 中仅表示为 1 个字节):
b | ê | n | ç | ã | o
ISO 8859-1: 62 | EA | 6E | E7 | E3 | 6F
UTF-8: 62 | C3 AA | 6E | C3 A7 | C3 A3 | 6F
当您尝试阅读以一种编码编写的文本时,就好像它是另一种编码一样,这是一个问题:如果文本以 UTF-8 编写但以 ISO 8859-1 读取,它显示为“bênçà £o”;相反的显示为“b�n��o”
JavaScript中的示例:
var bytesUtf8 = new Uint8Array([0x62, 0xc3, 0xaa, 0x6e, 0xc3, 0xa7, 0xc3, 0xa3, 0x6f]);
var bytesIso = new Uint8Array([0x62, 0xea, 0x6e, 0xe7, 0xe3, 0x6f]);
var decIso = new TextDecoder("iso-8859-1")
var decUtf8 = new TextDecoder("utf-8")
var decBytesIsoCorrect = decIso.decode(bytesIso)
var decBytesUtf8Correct = decUtf8.decode(bytesUtf8)
var decBytesIsoInUtf8 = decUtf8.decode(bytesIso)
var decBytesUtf8InIso = decIso.decode(bytesUtf8)
console.log('iso > iso', decBytesIsoCorrect)
console.log('utf-8 > utf-8', decBytesUtf8Correct)
console.log('iso > utf-8', decBytesIsoInUtf8)
console.log('utf-8 > iso', decBytesUtf8InIso)
注:可以使用iso-8859-n