Tôi đang cố gắng đọc dữ liệu từ luồng nhị phân, một phần trong đó phải được phân tích cú pháp là UTF-8.Đọc cả dữ liệu văn bản và dữ liệu nhị phân từ InputStream
Sử dụng trực tiếp InputStream
cho dữ liệu nhị phân và InputStreamReader
trên đầu trang cho văn bản UTF-8 không hoạt động khi người đọc đọc trước và làm hỏng dữ liệu nhị phân tiếp theo ngay cả khi được yêu cầu đọc tối đa trong số n
ký tự.
Tôi nhận ra câu hỏi này rất giống với Read from InputStream in multiple formats, nhưng giải pháp được đề xuất có cụ thể đối với luồng HTTP, điều này không giúp ích gì cho tôi.
Tôi đã nghĩ chỉ đọc mọi thứ dưới dạng dữ liệu nhị phân và chuyển đổi các phần liên quan thành văn bản sau đó. Nhưng tôi chỉ có thông tin về độ dài của dữ liệu ký tự trong các ký tự chứ không phải theo byte. Vì vậy, tôi cần điều mà đọc nhân vật từ dòng để được nhận thức của mã hóa.
Có cách nào để yêu cầu InputStreamReader không đọc trước hơn cần thiết để đọc số ký tự nhất định không? Hoặc là có một người đọc hỗ trợ cả dữ liệu nhị phân và văn bản với một mã hóa và có thể được chuyển đổi giữa các chế độ này trên bay?
Vấn đề là, với UTF8, số byte có thể khác với số ký tự. Vì vậy, tôi sẽ cần phải tìm ra số lượng các ký tự nhiều byte trong chuỗi, đọc thêm byte và chuyển đổi một lần nữa và làm điều này hơn và hơn cho đến khi các con số phù hợp. – tajmahal
Tôi muốn nói định dạng của bạn không dễ giải mã và tôi sẽ sửa nó nếu bạn có thể. Tuy nhiên, bạn có thể phân tích cú pháp UTF-8 nếu bạn biết số ký tự. (Nhưng việc gửi số byte thực tế sẽ đơn giản hơn nhiều) –
Cách tiếp cận khác là đọc nhiều dữ liệu hơn mức cần thiết. Lấy số lượng ký tự mong đợi, ví dụ: substring() và chuyển đổi sang UTF-8 để xác định độ dài. Sử dụng dấu() và đặt lại() và đọc độ dài mà bạn biết. (Điều này chỉ hoạt động nếu mã hóa UTF-8 giống hệt nhau: | ví dụ: byte nul \ 0 được mã hóa theo hai cách khác nhau.(như các nhân vật khác có thể) –