2015-05-19 11 views
5

Tôi đang cố gắng đọc các dòng từ các tệp .txt, đã được lưu dưới dạng Unicode. Đó là cách tôi đang làm nó:Làm thế nào để đọc tập tin Unicode Cyrillic trong C++?

wifstream input; 
string path = "test.txt"; 
input.imbue(locale(input.getloc(), 
     new codecvt_utf16<wchar_t, 0x10ffff, consume_header>)); 

input.open(path); 
if (input.is_open()) 
{ 
    wstring line; 
    input.seekg(1 , ios_base::beg); 
    getline(input, line); 
} 

Nó hoạt động tốt cho các tập tin với ký tự Latinh. Nhưng đối với các tệp Cyrillic tôi nhận được các ký hiệu lạ thay vì dấu cách và các ký tự liền kề.

Ví dụ:

là gì trong tập tin đầu vào:

Госдеп США осудил нападение на

Những gì tôi nhận được:!

︓осдепР ШАР> судилР = ападениеР = а

Tôi đang làm gì sai?

+0

chắc chắn nó không phải là một vấn đề đầu ra? chỉ vì bạn đang đọc trong unicode không có nghĩa là bạn đang outputting vào một môi trường unicode. –

+0

tôi sẽ loại bỏ dòng này: input.imbue (locale (input.getloc(), codecvt_utf16 mới )); – duDE

+0

Re "Tôi đang làm gì sai?", Tôi cảm thấy rất giống như được glib và trả lời "Sử dụng thư viện chuẩn C++", bởi vì nó nên làm điều này theo mặc định. Nó không phải là cần thiết để tìm ra cách sử dụng nó cho việc này. Hoặc làm việc xung quanh nó. –

Trả lời

0

Vâng, tìm ra con đường:

FILE *input= _wfopen(L"test.txt", L"rb"); 
wchar_t line[1000]; 
test.txtfgetws(line, 1000, input); 

trình tốt như thế. Đã khá ngu ngốc của tôi không thử nó đầu tiên. Cảm ơn mọi người.

1

một dòng trông rất đáng ngờ trong mã của bạn:

input.seekg(1, ios_base::beg);

nó đặt vị trí tập tin, vì vậy đọc chuỗi UTF16 bắt đầu vị trí 1 có thể không chính xác (BOM được đọc chính xác). tôi có cùng một kết quả cho tập tin utf16 trong ít endian.

vì vậy bạn có thể thay đổi vị trí để 0 hoặc xóa dòng này để làm cho mã này làm việc

+0

Tôi đã thêm vào nó cos có một ký tự kỳ lạ ở đầu tệp. Nó làm việc tốt cho các tập tin Latin. –

+0

"nhân vật lạ trong đầu" là BOM tôi đoán – Alexander

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