2012-02-19 24 views
6

Ví dụ, khi tôi đọc ký tự π (\u03C0) từ Tệp bằng API FileReader, tôi nhận được ký tự pi quay lại khi đọc nó bằng cách sử dụng FileReader.readAsText(blob). Nhưng khi tôi sử dụng FileReader.readAsBinaryString(blob), tôi nhận được kết quả \xcf\x80 thay vào đó, dường như không có bất kỳ mối tương quan rõ ràng nào với ký tự pi. Chuyện gì vậy? (Điều này có lẽ có cái gì để làm với cách UTF-8/16 được mã hóa ...)Sự khác biệt giữa readAsBinaryString và readAsText sử dụng FileReader

+2

'CF80' là mã hóa UTF-8 cho π. – deceze

+0

... oh, bạn nói đúng ... cảm ơn! – gengkev

+0

... có lẽ quá hiển nhiên, nhưng bạn có thể đăng câu trả lời đó nếu muốn. – gengkev

Trả lời

2

Oh tốt, nếu đó là tất cả các bạn cần ... :)

CF80 là bảng mã UTF-8 cho π.

12

FileReader.readAsText lấy mã hóa của tệp vào tài khoản. Đặc biệt, vì bạn có tệp được mã hóa bằng UTF-8, có thể có nhiều byte cho mỗi ký tự. Đọc nó như là văn bản, UTF-8 được đọc như nó là, và bạn nhận được chuỗi của bạn.

FileReader.readAsBinaryString, mặt khác, thực hiện chính xác những gì nó nói. Nó đọc byte tệp theo byte. Nó không nhận ra các ký tự nhiều byte, đặc biệt là tin tốt cho các tệp nhị phân (về cơ bản là bất cứ điều gì ngoại trừ một tệp văn bản). Vì π là một ký tự hai byte, bạn nhận được hai byte riêng lẻ tạo thành chuỗi trong chuỗi của bạn.

Sự khác biệt này có thể thấy ở nhiều nơi. Đặc biệt khi mã hóa bị mất và bạn thấy các ký tự như é được hiển thị là Ã ©.

+0

cảm ơn ... vì vậy khi tôi cố gắng nối \ xA2 vào BlobBuilder, nó sẽ trở thành \ xC2 \ xA2 bởi vì đó là mã UTF-8 được mã hoá, nhưng làm cách nào tôi có thể lấy lại \ xA2? (đó là một ký tự một byte) – gengkev

+0

oh, tôi đoán tôi phải sử dụng một ArrayBuffer sau đó – gengkev