Tại sao, charset, thực sự có nghĩa là mã hóa mã hóa trong sử dụng phổ biến?


10

Một điều mà từ lâu đã làm tôi bối rối là rất nhiều phần mềm sử dụng thuật ngữ "bộ ký tự" và "mã hóa" làm từ đồng nghĩa.

Khi mọi người đề cập đến một "mã hóa" unicode, họ luôn có nghĩa là một quy tắc biểu diễn các ký tự unicode dưới dạng một chuỗi các byte - như ASCII hoặc UTF-8. Điều này có vẻ hợp lý và trực quan; ý tưởng là bạn đang "mã hóa" các ký tự đó dưới dạng byte bằng cách sử dụng bộ quy tắc được chỉ định.

Vì các quy tắc này đôi khi chỉ cung cấp khả năng "mã hóa" một số tập hợp con của tất cả các ký tự unicode, bạn có thể tưởng tượng rằng một "bộ ký tự" - viết tắt của 'bộ ký tự' - chỉ đơn giản có nghĩa là một bộ ký tự unicode - mà không quan tâm đến cách những ký tự được mã hóa. Do đó, một mã hóa sẽ bao hàm một bộ ký tự (một mã hóa như ASCII, chỉ có các quy tắc để mã hóa 128 ký tự, sẽ được liên kết với bộ ký tự của 128 ký tự đó) nhưng một bộ ký tự không cần ngụ ý mã hóa (ví dụ: UTF-8, UTF -16 và UTF-32 đều là các bảng mã khác nhau nhưng có thể mã hóa cùng một bộ ký tự).

Tuy nhiên - và đây là mấu chốt của câu hỏi của tôi - cách sử dụng từ "bộ ký tự" trong thế giới thực không khớp với cách xây dựng của từ này. Nó hầu như luôn được sử dụng để có nghĩa là "mã hóa".

Ví dụ:

  • Các charsetthuộc tính trong HTML được sử dụng để xác định một mã hóa
  • Charsets trong Java là mã hóa
  • charsets và character setstrong MySQL, một lần nữa, mã hóa

Việc sử dụng ngôn ngữ này gây tò mò bao nhiêu tuổi và làm thế nào mà định nghĩa phản trực giác về 'bộ ký tự' này tồn tại? Liệu nó có lẽ xuất phát từ một thời gian khi có thực sự , trong thực tế, một ánh xạ một-một giữa các bảng mã sử dụng và bộ ký tự họ được hỗ trợ? Hoặc có một số tiêu chuẩn hoặc đặc điểm kỹ thuật có ảnh hưởng đặc biệt quyết định định nghĩa của từ này?


5
Việc sử dụng charsettrước tiêu chuẩn Unicode, do đó, mặc dù nó có thể không phải là "ánh xạ một-một", các ký tự cần thiết cho một tài liệu có xu hướng buộc phải lựa chọn mã hóa. Nhưng tôi không có thời gian để nghiên cứu lịch sử thực sự của từ này ...
AmeliaBR

2
Bạn nói về các bộ ký tự là "một bộ các ký tự Unicode", như thể ai đó đã bắt đầu với Unicode và sau đó chọn các tập hợp con. Chính xác hơn là nói nhiều bộ ký tự tồn tại trước khi phát minh ra Unicode (hoặc ít nhất là trước khi Unicode trở nên phổ biến), và Unicode được xây dựng một cách có chủ ý để trở thành siêu bộ của chúng.
John Bartholomew

Câu trả lời:


3

Khái niệm về bộ ký tự cũ hơn Unicode.

Trước Unicode, một bộ ký tự xác định một bộ ký tự cách mỗi ký tự được biểu diễn dưới dạng bit. Hầu hết các bộ ký tự ánh xạ một ký tự thành một byte (cho phép một bộ 256 ký tự), một số được ánh xạ tới hai byte và một số ít (như ASCII) chỉ còn 7 bit. Các bộ ký tự khác nhau thường gán các giá trị khác nhau cho cùng một ký tự và không có khóa dịch chung giữa các bộ ký tự khác nhau được sử dụng.

Unicode là một nỗ lực để giải quyết vấn đề này bằng cách thống nhất tất cả các bộ ký tự khác nhau trong một "siêu bộ" chung. Với mục đích này, Unicode đã giới thiệu một số mức độ trừu tượng bổ sung, ví dụ khái niệm mã hóa ký tự như một cái gì đó tách biệt với các giá trị điểm mã. Điều này cho phép Unicode xác định lại các bộ ký tự trước unicode dưới dạng mã hóa ký tự unicode.

Ví dụ, thuộc tính bộ ký tự trong HTML (phản ánh tham số bộ ký tự trong tiêu đề loại nội dung HTTP), là từ trước khi unicode được sử dụng rộng rãi, nhưng khi nó được quyết định chấp nhận unicode là bộ ký tự phổ quát của internet, thuộc tính bộ ký tự chỉ được xác định lại để chỉ định mã hóa được sử dụng, nhưng tên không được thay đổi để cho phép tương thích ngược.


9

Tất nhiên, thuật ngữ này có nghĩa là viết tắt của bộ ký tự, bộ chữ này là một thuật ngữ cũ được sử dụng để mã hóa ký tự, có thể được hiểu là một) ánh xạ giữa các chuỗi byte và ký tự, b) ánh xạ giữa các số nguyên (số mã) và ký tự hoặc c) ánh xạ giữa các ký tự trừu tượng và số nguyên hoặc chuỗi byte.

Bộ ký tự của bộ phận được đưa vào sử dụng vì nó là một biểu thức ngắn và đơn giản. Trong đó, bộ cài đặt có ý nghĩa mơ hồ (vì toàn bộ khái niệm này rất mơ hồ), nhưng sau đó nó thường bị hiểu sai là một bộ sưu tập (Bộ đặt ra trong ý nghĩa lý thuyết), như được mô tả trong Bộ ký tự nổi tiếng của Dan Connelly (một lần) Được coi là có hại .

Điều quan trọng nhất sau đó là mã định danh charsetđã được sử dụng trong MIME và HTTP. Bí danh HTTP 1.0 RFC 1945 trích dẫn định nghĩa MIME, một phương thức được sử dụng với một hoặc nhiều bảng để chuyển đổi một chuỗi các octet thành một chuỗi các ký tự, sau đó nhận xét về sự nhầm lẫn: Sử dụng thuật ngữ 'bộ ký tự' này nhiều hơn thường được gọi là 'mã hóa ký tự.' Tuy nhiên, vì HTTP và MIME chia sẻ cùng một sổ đăng ký, điều quan trọng là thuật ngữ này cũng được chia sẻ.


1

RFC2045 đã giới thiệu "bộ ký tự" vào MIME và vào thời điểm đó, rõ ràng không phải tất cả các bảng mã được ánh xạ một char thành một octet. RFC2130 thảo luận về lịch sử này nhiều hơn một chút.

Về cơ bản, "bộ ký tự" là một thuật ngữ phổ biến hơn khi các tiêu chuẩn đó được viết, nó ngắn gọn hơn "mã hóa ký tự" hoặc "sơ đồ mã hóa văn bản" và ít mơ hồ hơn "mã hóa".


Theo tôi thì có vẻ như tham số 'bộ ký tự' đã có trong RFC 1341 (tháng 6 năm 1992).
John Bartholomew

1

Có ít nhất 2 bảng mã áp dụng cho việc chuyển văn bản. Mã hóa ký tự mô tả cách các ký tự (glyphs) được mã hóa. Tất cả các ngôn ngữ sử dụng tập hợp con của bộ ký tự UCS, thường được mã hóa thành giá trị 8 bit. Các bộ ký tự được tiêu chuẩn hóa có mã hóa ký tự chuẩn và các thuật ngữ thường được sử dụng thay thế cho nhau.

Mã hóa chuyển mô tả cách văn bản được truyền và thường độc lập với mã hóa ký tự. Hầu hết các mã hóa truyền không minh bạch và thay đổi chuỗi byte được truyền. Mã hóa truyền 8 bit là trong suốt đối với mã hóa 8 bit. Mã hóa truyền 7 bit chỉ có thể truyền các bộ ký tự 7 bit như ASCII

ASCII sử dụng 95 ký tự có thể in và thêm một vài ký tự để điều khiển vận chuyển (nguồn cấp dữ liệu, nguồn cấp dữ liệu mẫu, trả về vận chuyển, backspace và tab) được mã hóa trong 7 bit. Có các ký tự điều khiển bổ sung sử dụng các giá trị còn lại. ASCII là một tập hợp con đúng của các bộ ký tự UCS cũng như nhiều bộ ký tự 8 bit. ISO-8859-1 cũng là một tập hợp con đúng của bộ ký tự UCS, nhưng các ký tự này có mã hóa khác nhau trong UTF-8, sử dụng nhiều byte cho các giá trị ký tự lớn hơn 127.

Các máy tính lớn của IBM sử dụng (d) EBCDID sử dụng mã hóa 8 bit khác nhau. Có các bảng dịch ánh xạ các ký tự có thể in giữa mã hóa ký tự ASCII và ECBDIC. ECBDIC có bộ ký tự lớn hơn ASCII vì nó có dấu chấm câu không có sẵn trong ASCII. Điều này có thể ngăn chặn chuyển đổi chuyến đi khứ hồi đầy đủ giữa hai bảng mã này, nếu mã hóa ban đầu là ECBDIC.

Các mã hóa này không đủ cho các ngôn ngữ có các ký tự không được bao phủ bởi các ký tự có thể in ASCII. Microsoft và các hãng khác đã sử dụng các tiện ích mở rộng 8 bit cho bộ ký tự ASCII và mã hóa các ký tự bổ sung có giá trị trên 127. Một tiện ích mở rộng không đủ cho tất cả các ngôn ngữ vì các tiện ích mở rộng này chỉ thêm tối đa 96 ký tự vào bộ ký tự. Điều này dẫn đến nhiều bộ ký tự (bộ ký tự) được sử dụng cho các ngôn ngữ khác nhau với mã hóa ký tự 8 bit khác nhau. Các bộ ký tự này bao gồm các ký tự được yêu cầu cho ngôn ngữ hoặc họ ngôn ngữ đó. Các ký tự bổ sung có thể được mã hóa thành các giá trị khác nhau trong các bảng mã khác nhau. Người dùng tiếng Anh rất có thể nhận thấy điều này với dấu chấm câu mở rộng (dấu ngoặc kép bên trái và bên phải và dấu gạch ngang) hiển thị không chính xác nếu sử dụng bộ ký tự sai.

Đối với mã hóa byte đơn, chỉ các ký tự trong bộ ký tự có thể được mã hóa. Một số ngôn ngữ yêu cầu mã hóa nhiều byte để bao gồm bộ ký tự của chúng. Bộ ký tự Unicode (UCS) yêu cầu mã hóa nhiều byte cho các ký tự bên ngoài bộ ký tự ASCII. Bộ ký tự này là một siêu ký tự của tất cả các mã hóa ngôn ngữ cụ thể. UTF-8 là một mã hóa nhỏ gọn của bộ ký tự UCS. ASCII không yêu cầu thêm byte và hầu hết (tất cả?) Các ký tự ngôn ngữ châu Âu có thể được mã hóa thành một hoặc hai byte. Bộ ký tự UCS-2 đầy đủ có thể được mã hóa từ một đến ba byte. Tất cả các ký tự trong bộ ký tự UCS hiện tại có thể được mã hóa từ một đến bốn byte.


0

FWIW, IIRC, Back in the Commodore 64 ngày, một bộ ký tự là một hàm từ {0, ... 255} đến tập hợp tất cả các hình ảnh đen trắng trong đó u và v có thể là 8 và 12. Vì vậy, "thay đổi của bạn bộ ký tự "có nghĩa là sử dụng lệnh POKE trong ngôn ngữ BASIC để sửa đổi các vị trí bộ nhớ được chỉ định để giữ các hình ảnh đó. Ví dụ, mã ASCII 65 có nghĩa là A và hình ảnh của A sẽ được lưu trữ bắt đầu từ địa chỉ bộ nhớ a * 65 + b đối với một số b và tôi đoán a = u * v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.