2012-03-06 56 views
6

Tôi đang cố gắng làm một cái gì đó mà tôi cho là khá đơn giản nhưng tôi đã dành quá nhiều thời gian cho nó rồi và tôi đã thử nhiều cách tiếp cận khác nhau mà tôi đã nghiên cứu nhưng vô ích.C# UTF8 Đọc/Xuất

Về cơ bản, tôi có một danh sách rất lớn các tên có ký tự "đặc biệt" trong chúng từ bộ ký tự UTF8.

Mục tiêu cuối cùng của tôi là đọc từng tên và sau đó thực hiện yêu cầu HTTP bằng tên đó trong URL dưới dạng biến GET. Mục tiêu đầu tiên của tôi là đọc một tên từ một tệp và đặt nó vào tiêu chuẩn để xác nhận rằng tôi có thể đọc và viết UTF8 đúng cách, trước khi tạo chuỗi và thực hiện tất cả các yêu cầu HTTP.

File test1.txt tôi đã chứa chỉ nội dung này:

Ownage

sau đó tôi đã sử dụng mã này # C để đọc trong file. Tôi đặt mã hóa StreamReaderConsole.OutputEncoding thành UTF8.

static void Main(string[] args) 
{ 
    Console.OutputEncoding = System.Text.Encoding.UTF8; 

    using (StreamReader reader = new StreamReader("test1.txt",System.Text.Encoding.UTF8)) 
    { 
     string line; 

     while ((line = reader.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 

    } 

    Console.ReadLine(); 
} 

Nhiều bất ngờ của tôi, tôi nhận được loại đầu ra:

enter image description here

sản lượng dự kiến ​​là chính xác giống như các nội dung tập tin gốc.

Làm cách nào để chắc chắn rằng các chuỗi tôi sắp xây dựng để thực hiện các yêu cầu HTTP sẽ chính xác nếu tôi thậm chí không thể thực hiện một tác vụ đơn giản như đọc/ghi các chuỗi UTF8?

Trả lời

6

chương trình của bạn là tốt (giả sử các tập tin đầu vào thực sự là UTF-8). Nếu bạn gỡ lỗi chương trình của mình và sử dụng cửa sổ Xem để xem các chuỗi (biến số line), bạn sẽ thấy rằng đó là chính xác. Điều đó là cách bạn có thể chắc chắn rằng bạn sẽ gửi yêu cầu HTTP chính xác (hoặc bất kỳ điều gì khác bạn thực hiện với các chuỗi).

Điều bạn đang thấy là lỗi trong bảng điều khiển Windows.

May thay, nó chỉ ảnh hưởng đến phông chữ raster. Nếu bạn thay đổi cửa sổ bảng điều khiển của mình để sử dụng phông chữ TrueType, ví dụ: Consolas hoặc Lucida Console, vấn đề sẽ biến mất.

screenshot

Bạn có thể thiết lập này cho tất cả các cửa sổ trong tương lai bằng cách sử dụng “Defaults” mục trình đơn:

screenshot

+1

+1 Điều này đúng. Ngoài ra hãy chắc chắn rằng bạn đang lưu tập tin mẫu của bạn bằng cách sử dụng UTF-8 và không ANSI đó là mặc định trong Notepad. – Yuck

+0

Điều này, kết hợp với đề xuất của Yuck để đảm bảo rằng tôi đã chọn UTF-8 thay vì ANSI khi lưu tệp. Cảm ơn các bạn đã cứu tôi rất nhiều đau đầu tôi chắc chắn! – user17753

3

Xem Reading unicode from console

Nếu bạn đang sử dụng .NET 4 bạn sẽ cần phải sử dụng

Console.InputEncoding = Encoding.Unicode; 
    Console.OutputEncoding = Encoding.Unicode; 

và đảm bảo bạn đang sử dụng Lucida Console như font console.

Nếu bạn đang sử dụng .NET 3.5, bạn có thể không may mắn.

Để đọc một cách hiệu quả dây chuyền từ một tập tin tôi có lẽ sẽ sử dụng:

foreach(var line in File.ReadAllLines(path, Encoding.UTF8)) 
{ 
    // do stuff 
} 
+0

Điều đó dẫn đến lỗi 'IOException' khi tôi kiểm tra. – Yuck

+0

Thông báo trong ngoại lệ là gì? – Phil

+0

* Tham số không đúng. * Và trên dòng đầu tiên 'Console.InputEncoding = Encoding.Unicode;'. Sử dụng .NET 4. – Yuck

1

Đối với đọc tất cả các nhân vật như bạn đề cập đến bạn Phải sử dụng mặc định mã hóa như thế này

new StreamReader(@"E:\database.txt", System.Text.Encoding.Default))