Để hiểu thuộc tính "encoding", bạn phải hiểu sự khác biệt giữa byte và ký tự .
Hãy coi byte là các số từ 0 đến 255, trong khi các ký tự là những thứ như "a", "1" và "Ä". Tập hợp tất cả các ký tự có sẵn được gọi là bộ ký tự .
Mỗi ký tự có một chuỗi một hoặc nhiều byte được sử dụng để đại diện cho nó; tuy nhiên, số lượng và giá trị chính xác của các byte phụ thuộc vào bảng mã được sử dụng và có nhiều bảng mã khác nhau.
Hầu hết các bảng mã dựa trên một bộ ký tự và mã hóa cũ được gọi là ASCII, là một byte cho mỗi ký tự (thực tế, chỉ có 7 bit) và chứa 128 ký tự bao gồm rất nhiều ký tự phổ biến được sử dụng trong tiếng Anh Mỹ.
Ví dụ, đây là 6 ký tự trong bộ ký tự ASCII được đại diện bởi các giá trị từ 60 đến 65.
Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║ Character ║
╠══════╬══════════════║
║ 60 ║ < ║
║ 61 ║ = ║
║ 62 ║ > ║
║ 63 ║ ? ║
║ 64 ║ @ ║
║ 65 ║ A ║
╚══════╩══════════════╝
Trong tập hợp ASCII đầy đủ, giá trị thấp nhất được sử dụng là 0 và cao nhất là 127 (cả hai đều là ký tự điều khiển ẩn).
Tuy nhiên, một khi bạn bắt đầu cần nhiều ký tự hơn ASCII cơ bản cung cấp (ví dụ: các chữ cái có dấu, ký hiệu tiền tệ, ký hiệu đồ họa, v.v.), ASCII không phù hợp và bạn cần thứ gì đó mở rộng hơn. Bạn cần nhiều ký tự hơn (một bộ ký tự khác) và bạn cần một mã hóa khác vì 128 ký tự không đủ để khớp tất cả các ký tự. Một số mã hóa cung cấp một byte (256 ký tự) hoặc tối đa sáu byte.
Theo thời gian, rất nhiều bảng mã đã được tạo ra. Trong thế giới Windows, có CP1252, hoặc ISO-8859-1, trong khi người dùng Linux có xu hướng ưa chuộng UTF-8. Java sử dụng UTF-16 nguyên bản.
Một chuỗi các giá trị byte cho một ký tự trong một bảng mã có thể thay cho một ký tự hoàn toàn khác trong một bảng mã khác, hoặc thậm chí có thể không hợp lệ.
Ví dụ, trong ISO 8859-1 , â được đại diện bởi một byte có giá trị 226
, trong khi UTF-8 đó là hai byte: 195, 162
. Tuy nhiên, trong ISO 8859-1 , 195, 162
sẽ là hai ký tự, Ã, ¢ .
Hãy nghĩ về XML không phải là một chuỗi các ký tự mà là một chuỗi các byte.
Hãy tưởng tượng hệ thống nhận XML sẽ nhìn thấy các byte 195, 162
. Làm sao nó biết được đây là những ký tự nào?
Để hệ thống diễn giải các byte đó là các ký tự thực tế (và hiển thị chúng hoặc chuyển đổi chúng sang một kiểu mã hóa khác), nó cần biết cách mã hóa được sử dụng trong XML.
Vì hầu hết các bảng mã phổ biến đều tương thích với ASCII, theo như các ký tự và ký hiệu chữ cái cơ bản, trong những trường hợp này, bản thân khai báo có thể tránh được việc chỉ sử dụng các ký tự ASCII để cho biết mã hóa là gì. Trong các trường hợp khác, trình phân tích cú pháp phải thử và tìm ra mã hóa của khai báo. Vì nó biết khai báo bắt đầu với <?xml
nó, nên việc này sẽ dễ dàng hơn rất nhiều.
Cuối cùng, version
thuộc tính chỉ định phiên bản XML, trong đó có hai phiên bản hiện tại (xem Wikipedia phiên bản XML . Có sự khác biệt nhỏ giữa các phiên bản, vì vậy trình phân tích cú pháp XML cần biết nó đang xử lý những gì. Trong hầu hết các trường hợp (đối với tiếng Anh loa), phiên bản 1.0 là đủ.