2010-01-13 32 views
9

Tôi nhận được đầu vào bảng điều khiển từ người dùng và muốn mã hóa nó thành UTF-8. Sự hiểu biết của tôi là C++ không có mã hóa chuẩn cho luồng đầu vào và thay vào đó nó phụ thuộc vào trình biên dịch, môi trường thời gian chạy, bản địa hóa và những gì không.Xác định mã hóa đầu vào bằng cách kiểm tra byte đầu vào

Làm cách nào để xác định mã hóa đầu vào bằng cách kiểm tra các byte của đầu vào?

Trả lời

3

Nói chung, bạn không thể. Nếu tôi quay một luồng các byte được tạo ngẫu nhiên tại ứng dụng của bạn thì nó có thể xác định "mã hóa" của chúng như thế nào? Bạn chỉ cần phải xác định rằng ứng dụng của bạn chấp nhận mã hóa nhất định, hoặc giả định rằng những gì hệ điều hành tay bạn sẽ được mã hóa phù hợp.

+0

Để tạo điều này, bạn có thể sử dụng môi trường để xác định mặc định hợp lý. Hãy xem $ LANG và lệnh miền địa phương, nếu hệ điều hành của bạn hỗ trợ chúng. –

2

Thường kiểm tra xem đầu vào có phải là UTF hay không là vấn đề của chẩn đoán - không có thuật toán dứt khoát nào cho bạn biết "có/không". Các heuristic phức tạp hơn, ít tích cực sai/tiêu cực bạn sẽ nhận được, tuy nhiên không có cách "chắc chắn".

Đối với một ví dụ về chẩn đoán bạn có thể kiểm tra thư viện này: http://utfcpp.sourceforge.net/

bool valid_utf8_file(iconst char* file_name) 
{ 
    ifstream ifs(file_name); 
    if (!ifs) 
     return false; // even better, throw here 

    istreambuf_iterator<char> it(ifs.rdbuf()); 
    istreambuf_iterator<char> eos; 

    return utf8::is_valid(it, eos); 
} 

Bạn có thể sử dụng nó, hoặc kiểm tra nguồn của nó như thế nào họ đã làm điều đó.

+0

Lưu ý - điều này cho bạn biết nếu nó có thể là utf8, bạn không thể biết nếu nó là. Một dòng mã ASCII 7bit thông thường là utf8 cho đến khi bạn nhấn ký tự có dấu đầu tiên. –

+1

* Kiểm tra * liệu đầu vào có hợp lệ UTF-8 hay không phải là heuristic (đó là chức năng của bạn), nhưng xác định xem UTF-8 có phải là * ý định của người dùng * không. –

+0

Phím tắt ngôn ngữ: / –

0

Sử dụng hệ điều hành được cài sẵn có nghĩa là. Những thay đổi từ một hệ điều hành khác. Trên Windows, tốt hơn hết là nên sử dụng các API của WideChar và không nghĩ đến việc mã hóa.

Và nếu đầu vào của bạn xuất phát từ tệp, trái với bảng điều khiển thực, thì tất cả các phiên cược sẽ bị tắt.

0

Jared Oberhaus đã trả lời câu hỏi này trên trang related question dành riêng cho java.

Về cơ bản có một vài bước bạn có thể thực hiện để thực hiện một dự đoán hợp lý, nhưng cuối cùng nó chỉ là phỏng đoán mà không có chỉ dẫn rõ ràng. (Do đó điểm đánh dấu BOM nổi tiếng trong các tệp UTF-8)

0

Như đã được nói để đáp ứng question John Weldon has pointed to, có một số thư viện nhận dạng mã hóa ký tự. Bạn cũng có thể xem nguồn của lệnh unix file và xem thử nghiệm nào sử dụng để xác định mã hóa tệp. Từ trang người đàn ông của file:

ASCII, tiêu chuẩn ISO-8859-x,-ISO phi 8-bit các bộ ký tự mở rộng ASCII (chẳng hạn như những người sử dụng trên các hệ thống máy tính Macintosh và IBM), UTF-8-mã hóa Các bộ ký tự Unicode, UTF-16 được mã hóa và các bộ ký tự EBCDIC có thể được phân biệt bằng các dãy khác nhau và các chuỗi byte tạo thành văn bản in được trong mỗi bộ.

PCRE cung cấp chức năng kiểm tra chuỗi nhất định cho mã UTF-8 hoàn toàn hợp lệ.

Các vấn đề liên quan