65
Chương 2: Thao tác dữ liệu
output.Close();
}
}
}
Chạy
CharacterEncodingExample
sẽ tạo ra file output.txt. Mở file này trong một trình soạn
thảo có hỗ trợ Unicode, bạn sẽ thấy kết quả như sau:
Source Text : Area = Πr^2
UTF-16 Bytes: 41-00-72-00-65-00-61-00-20-00-3D-00-20-00-A0-03-72-00-5E-00-32-00
UTF-8 Bytes: 41-72-65-61-20-3D-20-CE-A0-72-5E-32
ASCII Bytes: 41-72-65-61-20-3D-20-3F-72-5E-32
UTF-8 Text : Area = Πr^2
ASCII Text : Area = ?r^2
Chú ý rằng, nếu sử dụng UTF-16 thì mỗi ký tự được mã hóa bởi 2 byte, nhưng vì hầu hết các
ký tự đều là ký tự chuẩn nên byte cao là 0 (nếu sử dụng little-endian thì byte thấp viết trước).
Do đó, hầu hết các ký tự đều được mã hóa bởi những số giống nhau trong ba kiểu mã hóa,
ngoại trừ ký hiệu PI được mã hóa khác (được in đậm trong kết quả ở trên). Để mã hóa PI cần
2 byte, đòi hỏi này được UTF-8 hỗ trợ nên thể hiện được Π, trong khi đó ASCII chỉ sử dụng
một byte nên thay PI bằng mã 3F, đây là mã của dấu hỏi (?).
Nếu chuyển các ký tự Unicode sang ASCII hoặc một kiểu mã hóa khác thì có thể
mất dữ liệu. Bất kỳ ký tự Unicode nào có mã ký tự không biểu diễn được trong
kiểu mã hóa đích sẽ bị bỏ qua khi chuyển đổi.
Lớp
Encoding
cũng cung cấp phương thức tĩnh
Covert
để đơn giản hóa việc chuyển một mảng
byte từ kiểu mã hóa này sang kiểu mã hóa khác không phải qua trung gian UTF-16. Ví dụ,
dòng mã sau chuyển trực tiếp các byte trong mảng
asciiString
từ ASCII sang UTF-8:
byte[] utf8String = Encoding.Convert(Encoding.ASCII, Encoding.UTF8,
asciiString);
3.
3.
Chuy n các ki u giá tr c b n thành m ng ki u byte
ể
ể
ị ơ ả
ả
ể
Chuy n các ki u giá tr c b n thành m ng ki u byte
ể
ể
ị ơ ả
ả
ể
Bạn cần chuyển các kiểu giá trị cơ bản thành mảng kiểu byte.
Lớp
System.BitConverter
cung cấp các phương thức tĩnh rất tiện lợi cho việc
chuyển đổi qua lại giữa các mảng kiểu byte và hầu hết các kiểu giá trị cơ bản—
trừ kiểu
decimal
. Để chuyển một giá trị kiểu
decimal
sang mảng kiểu byte, bạn
cần sử dụng đối tượng
System.IO.BinaryWriter
để ghi giá trị đó vào một thể hiện
System.IO.MemoryStream
, sau đó gọi phương thức
Memorystream.ToArray
. Để có
một giá trị
decimal
từ một mảng kiểu byte, bạn cần tạo một đối tượng
MemoryStream
từ mảng kiểu byte, sau đó sử dụng thể hiện
System.IO.BinaryReader
để đọc giá trị này từ
MemoryStream
.