2009-03-23 23 views
16

Hướng dẫn nghiên cứu của tôi (cho kỳ thi 70-536) nói điều này hai lần trong chương văn bản và mã hóa, ngay sau chương IO."Khuôn khổ .NET sử dụng chuẩn mã hóa UTF-16 theo mặc định" có nghĩa là gì?

Tất cả các ví dụ cho đến nay là thực hiện việc truy cập tệp đơn giản bằng FileStream và StreamWriter.

Nó cũng có nội dung như "Nếu bạn không biết mã hóa nào sẽ sử dụng khi tạo tệp, không chỉ định mã và .NET sẽ sử dụng UTF16" và "Chỉ định các mã hóa khác nhau bằng cách sử dụng quá tải xây dựng luồng".

Đừng bận tâm đến thực tế là quá tải thực tế nằm trong lớp StreamWriter nhưng hey, bất cứ điều gì.

Tôi đang xem xét StreamWriter ngay bây giờ trong phản xạ và tôi chắc chắn tôi có thể thấy rằng mặc định là actaully UTF8NoBOM.

Nhưng không có điều nào trong số này được liệt kê trong errata. Đó là một cuốn sách cũ (cheked các errat của cả hai phiên bản) vì vậy nếu nó là sai tôi đã có thể nghĩ rằng ai đó đã nhặt nó .....

Làm cho tôi nghĩ rằng có lẽ tôi đã không hiểu nó.

Vì vậy, ..... bất kỳ ý tưởng gì nó đang nói về? Một số nơi khác có mặc định?

Nó hoàn toàn làm tôi bối rối.

Trả lời

35

“UTF-16” là một thuật ngữ khó chịu, vì nó có hai nghĩa mà có thể dễ dàng bị nhầm lẫn.

Ý nghĩa đầu tiên là một chuỗi các điểm mã 16 bit. Hầu hết những điều này tương ứng trực tiếp với ký tự Unicode của cùng một số; các ký tự bên ngoài Mặt phẳng đa ngôn ngữ cơ bản (U + 10000 trở lên) được lưu trữ dưới dạng hai điểm mã 16 bit, mỗi một trong số Surrogates.

Nhiều ngôn ngữ sử dụng UTF-16 theo nghĩa này cho mục đích lưu trữ nội bộ, bao gồm dưới dạng loại chuỗi gốc. Đây là nguồn thông thường của cụm từ như “.NET (hoặc Java) sử dụng UTF-16 làm mã hóa mặc định của nó”. .NET đang truy cập các phần tử của chuỗi 16 bit UTF-16 tại một thời điểm (ví dụ, ở cấp độ triển khai, như là một uint16).

Điều tiếp theo cần xem xét là mã hóa chuỗi UTF-16 đó thành các byte tuyến tính, để lưu trữ trong một tệp hoặc luồng mạng. Như thường lệ khi bạn lưu trữ số lượng lớn hơn vào byte, có hai mã hóa có thể: nhỏ hoặc cuối lớn. Vì vậy, bạn có thể sử dụng "UTF-16LE", mã hóa nhỏ của UTF-16 thành byte, hoặc "UTF-16BE", mã hóa lớn nhất.

(“UTF-16LE” được sử dụng phổ biến hơn. Chỉ cần thêm nhiều sự nhầm lẫn vào ngọn lửa, Windows mang lại cho nó cái tên mã hóa sai lệch và mơ hồ “Unicode”. 8 cho lưu trữ tập tin và luồng mạng hơn cả UTF-16LE/BE.)

Nhưng nếu bạn không biết liệu một chuỗi byte có chứa “UTF-16LE” hoặc “UTF-16BE”, bạn có thể sử dụng lừa tìm điểm mã đầu tiên để làm việc.Điểm mã này, Dấu đơn hàng (BOM), chỉ hợp lệ khi đọc một cách xung quanh, vì vậy bạn không thể nhầm lẫn một mã hóa cho mã khác.

Cách tiếp cận này, không quan tâm đến thứ tự byte mà bạn có nhưng sử dụng BOM để báo hiệu nó, thường được đề cập dưới tên mã hóa ... “UTF-16”. Vì vậy, khi ai đó nói "UTF-16", bạn không thể biết liệu chúng có nghĩa là một chuỗi các điểm mã Unicode ngắn hay một chuỗi các byte theo thứ tự không xác định sẽ giải mã thành một.

(“UTF-32” có cùng một vấn đề.)

If you don't know what encoding to use when you create a file, don't specify one and .NET will use UTF16

Nếu đó là trích dẫn trực tiếp thực tế nó là một lời nói dối. Xây dựng một StreamWriter mà không cần một đối số mã hóa is explicitly specified để cung cấp cho bạn UTF-8.

+1

+1 Wow cảm ơn vì câu trả lời tuyệt vời này. Tôi đang tiêu hóa. Nếu tôi có thể bỏ phiếu lên gấp đôi tôi sẽ :). –

2

UTF16 là mã hóa mặc định .NET sẽ sử dụng để mã hóa các chuỗi trong chương trình của bạn (như biến chuỗi).

3

Kiểm tra. Viết chuỗi "abcd" vào một tệp. Nếu nó sử dụng UTF8, tệp sẽ có kích thước 4 byte. Theo UTF16, nó sẽ là 8 byte. (Cộng có lẽ là BOM)

+0

Tôi đã thử nghiệm khi sử dụng Strea mWriter bởi breakpointing và kiểm tra mã hóa của StreamWriter - đó là UTF8NoBOM. Vì tất cả các ví dụ đã được thực hiện như thế này và cuốn sách không phức tạp, tôi đã không nhận được những gì họ đang có về .... –

+0

Bạn cần chỉ định mã hóa mà StreamWriter sử dụng. –

2

Tôi gặp sự cố này với lớp tĩnh System.IO.File.

Tôi muốn viết một chuỗi có chứa UTF-16 XML để gửi.

Trước tiên, tôi sử dụng

using(StreamWriter writer = File.CreateText(xmlFilePathTarget)) 
{ 
    writer.Write(xmlString); 
} 

Nhưng bởi vì nó đã viết chuỗi như UTF-8, IE sẽ không mở nó và hiển thị lỗi:

The XML page cannot be displayed Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.


Switch from current encoding to specified encoding not supported. Error processing resource 'file:///C:/Documents and Setti...

Nhờ phần lớn vào bài viết này, tôi tìm thấy giải pháp là sử dụng rõ ràng hàm tạo StreamWriter:

StreamWriter writer = new StreamWriter(xmlFilePathTarget, false, Encoding.Unicode)); 
Các vấn đề liên quan