2012-05-25 25 views
6

Im đọc một tập tin với ReadAllTextLàm thế nào để sử dụng ReadAllText khi mã hóa tập tin không rõ

String[] values = File.ReadAllText(@"c:\\c\\file.txt").Split(';'); 

    int i = 0; 

    foreach (String s in values) 
    { 
     System.Console.WriteLine("output: {0} {1} ", i, s); 
     i++; 
    } 

Nếu tôi cố gắng đọc một số tác phẩm tôi nhận được đôi khi các ký tự sai trở lại (cho ÖÜÄÀ ...). Đầu ra là như thế nào, nó bởi vì có một số rắc rối với các mã hóa '?':

output: 0 TEST 
output: 1 A??O? 

Một giải pháp sẽ được thiết lập mã hóa trong ReadAllText, cho phép nói một cái gì đó giống như ReadAllText(@"c:\\c\\file.txt", Encoding.UTF8) mà có thể khắc phục vấn đề. Nhưng nếu tôi vẫn sẽ nhận được '?' là đầu ra? Nếu tôi không biết mã hóa của tập tin thì sao? Và điều gì sẽ xảy ra nếu mỗi tệp đơn có mã hóa khác nhau? Điều gì sẽ là cách tốt nhất để làm điều đó với C#? Cảm ơn bạn

+1

Bạn cần biết mã hóa là gì. Và không có cách nào đáng tin cậy 100% để tìm hiểu hoàn toàn dựa trên nội dung của tệp. –

+0

Vui lòng tham khảo bài này http://stackoverflow.com/questions/2239968/c-sharp-file-readalltext-doing-weird-things – Dhaval

Trả lời

6

Cách duy nhất để thực hiện điều này là tìm kiếm byte order marks ở đầu tệp văn bản. (Đốm màu này thường đại diện cho tính cuối cùng của mã hóa ký tự được sử dụng, nhưng cũng là mã hóa - ví dụ: UTF8, UTF16, UTF32). Thật không may, phương pháp này chỉ hoạt động đối với mã hóa dựa trên Unicode, và không có gì trước đó (mà phương pháp ít đáng tin cậy hơn phải được sử dụng).

Loại StreamReader hỗ trợ phát hiện những dấu hiệu để xác định mã hóa - bạn chỉ cần vượt qua một lá cờ để tham số như vậy:

new System.IO.StreamReader("path", true) 

Sau đó bạn có thể kiểm tra giá trị của stremReader.CurrentEncoding để xác định mã hóa được sử dụng bởi tập tin. Tuy nhiên, lưu ý rằng nếu không có dấu mã hóa byte nào tồn tại thì CurrentEncoding sẽ mặc định là Encoding.Default.

Refer codeproject solution to detect encoding

+3

Nếu không có dấu ngoặc mã hóa byte tồn tại, sau đó sẽ sử dụng CurrentEncoding Encoding.UTF8 ** không ** Encoding.Default. "Tham số detectEncodingFromByteOrderMarks phát hiện mã hóa bằng cách xem ba byte đầu tiên của luồng. Nó tự động nhận dạng UTF-8, Unicode nhỏ gọn và văn bản Unicode lớn cuối nếu tệp bắt đầu bằng các dấu thứ tự byte thích hợp. UTF8Encoding được sử dụng. " [từ tài liệu] (http://msdn.microsoft.com/en-us/library/9y86s1a9.aspx) – MarkJ

5

Bạn phải kiểm tra mã hóa tệp trước. hãy thử điều này

System.Text.Encoding enc = null; 
System.IO.FileStream file = new System.IO.FileStream(filePath, 
    FileMode.Open, FileAccess.Read, FileShare.Read); 
if (file.CanSeek) 
{ 
    byte[] bom = new byte[4]; // Get the byte-order mark, if there is one 
    file.Read(bom, 0, 4); 
    if ((bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) || // utf-8 
     (bom[0] == 0xff && bom[1] == 0xfe) || // ucs-2le, ucs-4le, and ucs-16le 
     (bom[0] == 0xfe && bom[1] == 0xff) || // utf-16 and ucs-2 
     (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff)) // ucs-4 
    { 
     enc = System.Text.Encoding.Unicode; 
    } 
    else 
    { 
     enc = System.Text.Encoding.ASCII; 
    } 

    // Now reposition the file cursor back to the start of the file 
    file.Seek(0, System.IO.SeekOrigin.Begin); 
} 
else 
{ 
    // The file cannot be randomly accessed, so you need to decide what to set the default to 
    // based on the data provided. If you're expecting data from a lot of older applications, 
    // default your encoding to Encoding.ASCII. If you're expecting data from a lot of newer 
    // applications, default your encoding to Encoding.Unicode. Also, since binary files are 
    // single byte-based, so you will want to use Encoding.ASCII, even though you'll probably 
    // never need to use the encoding then since the Encoding classes are really meant to get 
    // strings from the byte array that is the file. 

    enc = System.Text.Encoding.ASCII; 
} 
+0

Cảm ơn! Lưu ý rằng FileStream được mở sau mã này và phải được đóng lại nếu mã này được sử dụng trong một số phương thức 'GetEncoding'. – Tieme

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