Sự khác biệt giữa một ký tự, một điểm mã, glyph và grapheme là gì?


146

Cố gắng hiểu sự tinh tế của Unicode hiện đại đang khiến tôi đau đầu. Cụ thể, sự khác biệt giữa các điểm mã, ký tự, glyph và biểu đồ - các khái niệm mà trong trường hợp đơn giản nhất , khi xử lý văn bản tiếng Anh sử dụng các ký tự ASCII, tất cả đều có mối quan hệ một đối một với nhau - gây rắc rối cho tôi.

Xem cách các thuật ngữ này được sử dụng trong các tài liệu như JavaScript của Matthias Bynens có vấn đề về unicode hoặc phần của Wikipedia về sự thống nhất của Han , tôi đã tập hợp rằng các khái niệm này không giống nhau và thật nguy hiểm khi kết luận chúng, nhưng tôi thuộc loại đấu tranh để nắm bắt ý nghĩa của mỗi thuật ngữ .

Unicode Consortium cung cấp một bảng chú giải để giải thích nội dung này, nhưng nó chứa đầy những "định nghĩa" như thế này:

Nhân vật trừu tượng . Một đơn vị thông tin được sử dụng cho tổ chức, kiểm soát hoặc đại diện cho dữ liệu văn bản. ...

...

Nhân vật . ... (2) Từ đồng nghĩa với nhân vật trừu tượng. (3) Đơn vị mã hóa cơ bản cho mã hóa ký tự Unicode. ...

...

Glyph . (1) Một hình thức trừu tượng đại diện cho một hoặc nhiều hình ảnh glyph. (2) Một từ đồng nghĩa cho hình ảnh glyph. Khi hiển thị dữ liệu ký tự Unicode, một hoặc nhiều glyph có thể được chọn để mô tả một ký tự cụ thể.

...

Đồ thị . (1) Một đơn vị viết đặc biệt tối thiểu trong bối cảnh của một hệ thống chữ viết cụ thể. ...

Hầu hết các định nghĩa này có chất lượng nghe có vẻ rất hàn lâm và trang trọng, nhưng thiếu chất lượng ý nghĩa bất cứ điều gì , hoặc nói cách khác là trì hoãn vấn đề định nghĩa đối với một mục hoặc phần chú giải khác của tiêu chuẩn.

Vì vậy, tôi tìm kiếm sự khôn ngoan phức tạp của những người học được nhiều hơn tôi. Chính xác thì mỗi khái niệm này khác nhau như thế nào và trong hoàn cảnh nào họ sẽ không có mối quan hệ một đối một với nhau?


Có nhiều hệ thống chữ viết rất khác nhau, cho nhiều ngôn ngữ khác nhau. Do đó, có nhiều quan điểm khác nhau về vấn đề viết lách, và cũng có một lịch sử lâu dài đằng sau nó. IMHO thật hữu ích khi ghi nhớ điều đó, vì Unicode cố gắng bao quát mọi thứ . (Là nhân vật đáng sợ giống hay khác nhau? Các gốc Kanji? Hangul? Diacritics? Biểu tượng cảm xúc màu da ?? ...)
Pablo H

Câu trả lời:


225
  • Nhân vật là một thuật ngữ quá tải có thể có nghĩa là nhiều thứ.

  • Một điểm mã là đơn vị nguyên tử của thông tin. Văn bản là một chuỗi các điểm mã. Mỗi điểm mã là một số được đưa ra ý nghĩa theo tiêu chuẩn Unicode.

  • Một đơn vị mã là đơn vị lưu trữ của một phần của một điểm mã được mã hóa. Trong UTF-8, điều này có nghĩa là 8 bit, trong UTF-16, điều này có nghĩa là 16 bit. Một đơn vị mã có thể đại diện cho một điểm mã đầy đủ hoặc một phần của điểm mã. Ví dụ: glyph người tuyết ( ) là một điểm mã đơn lẻ nhưng 3 đơn vị mã UTF-8 và 1 đơn vị mã UTF-16.

  • Biểu đồ là một chuỗi gồm một hoặc nhiều điểm mã được hiển thị dưới dạng một đơn vị đồ họa duy nhất mà người đọc nhận ra là một thành phần duy nhất của hệ thống chữ viết. Ví dụ, cả hai aäđều là đồ thị, nhưng chúng có thể bao gồm nhiều điểm mã (ví dụ: äcó thể là hai điểm mã, một cho ký tự cơ sở atheo sau là một cho diaresis, nhưng cũng có một điểm mã thay thế, kế thừa, đại diện cho biểu đồ này ). Một số điểm mã không bao giờ là một phần của bất kỳ biểu đồ nào (ví dụ: phần tử không tham gia có độ rộng bằng không hoặc phần ghi đè có hướng).

  • Một hình tượng là một hình ảnh, thường được lưu trữ trong một phông chữ (mà là một tập hợp các glyphs), được sử dụng để đại diện cho graphemes hoặc bộ phận của chúng. Các phông chữ có thể kết hợp nhiều glyph thành một đại diện duy nhất, ví dụ, nếu ở trên älà một điểm mã duy nhất, một phông chữ có thể chọn hiển thị dưới dạng hai glyph riêng biệt, được phủ chồng lên nhau. Đối với OTF, các bảng GSUB và GPOS của phông chữ chứa thông tin thay thế và định vị để làm cho công việc này. Một phông chữ cũng có thể chứa nhiều glyph thay thế cho cùng một grapheme.


4
Tôi vừa gửi một bản chỉnh sửa sắp xếp lại thứ tự mã điểm và đơn vị mã. Tôi đồng ý với bạn rằng đơn vị mã sẽ đến thứ hai. Đối với việc "không đúng chỗ", tôi nghi ngờ bạn thấy câu trả lời này là phục vụ một mục đích khác với tôi. Tôi nghĩ rằng có giá trị lớn khi có tất cả 5 điều khoản này ở một nơi. Điều cuối cùng tôi muốn là google "sự khác biệt giữa glyph, grapheme, đơn vị mã và điểm mã và phải có câu trả lời ở hai nơi. Trong rất nhiều cuộc thảo luận, các thuật ngữ này đều được sử dụng trong cuộc thảo luận, hiếm khi làm Tôi thấy một cuộc thảo luận với 4 người khác nhưng không phải là đơn vị mã.
Micah Zoltu

1
Vì vậy, ví dụ '\ uD83D \ uDC0A' (hiển thị biểu tượng cảm xúc cá sấu) các điểm mã, biểu đồ, v.v. là gì? Đặc biệt, làm thế nào nó liên quan đến .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0).charCodeAt(1)kết quả?
qbolec

3
@qbolec: Đó là hai đơn vị mã UTF-16 biểu thị một điểm mã duy nhất (U + 1F40A) và được cho là biểu tượng cảm xúc, có lẽ là biểu đồ đơn, riêng của nó.
Kerrek SB

2
@ TomPažourek: Trong quá trình chuẩn hóa phân tách, nó được biểu thị bằng hai loại tiền mã hóa ( acộng với "kết hợp dấu phụ"); trong hợp quy hóa, nó được biểu thị bằng một mật mã duy nhất ( ätừ phạm vi Latin-1 cũ). Chuẩn hóa Unicode là chủ đề bạn muốn điều tra nếu điều này làm bạn quan tâm. Trong một thế giới trống, sẽ chỉ có các nhân vật cơ sở và kết hợp và không có vật liệu tổng hợp dựng sẵn.
Kerrek SB

1
@Kaushik: Tôi không chắc ý của bạn là gì: một đơn vị mã là một đơn vị lưu trữ, vâng, nhưng một điểm mã nói chung yêu cầu nhiều đơn vị mã để lưu trữ (ngoại trừ trong UTF-32).
Kerrek SB

1

Bên ngoài tiêu chuẩn Unicode, một ký tự là một đơn vị văn bản riêng gồm một hoặc nhiều biểu đồ . Những gì tiêu chuẩn Unicode định nghĩa là "ký tự" thực sự là sự pha trộn giữa đồ thị và ký tự. Unicode cung cấp các quy tắc cho việc giải thích các biểu đồ xen kẽ như các ký tự riêng lẻ.

Một Unicode điểm mã là số duy nhất được gán cho mỗi ký tự Unicode (đó là một trong hai nhân vật hoặc một grapheme).

Thật không may, các quy tắc Unicode cho phép một số biểu đồ xen kẽ được hiểu là các biểu đồ khác đã có điểm mã riêng ( biểu mẫu được sắp xếp sẵn ). Điều này có nghĩa là có nhiều hơn một cách trong Unicode để thể hiện một ký tự. Chuẩn hóa Unicode giải quyết vấn đề này.

Một glyph là đại diện trực quan của một nhân vật. Một phông chữ cung cấp một bộ glyphs cho một bộ ký tự nhất định (không phải ký tự Unicode). Đối với mỗi nhân vật, có vô số glyphs có thể.

Trả lời Mark Amery

Đầu tiên, như tôi đã nói, có vô số glyphs có thể có cho mỗi ký tự nên không, một ký tự không "luôn được đại diện bởi một glyph". Unicode không quan tâm nhiều đến glyphs và những thứ nó định nghĩa trong biểu đồ mã của nó chắc chắn không phải là glyphs. Vấn đề là cả hai đều không phải là nhân vật. Vậy chúng là gì?

Đó là thực thể lớn hơn, grapheme hoặc nhân vật? Người ta gọi những yếu tố đồ họa đó trong văn bản không phải là chữ cái hoặc dấu chấm câu là gì? Một thuật ngữ nhanh chóng nảy ra trong tâm trí là "grapheme". Đó là một từ gợi lên chính xác ý tưởng về "một đơn vị đồ họa trong văn bản". Tôi đưa ra định nghĩa này: Một grapheme là thành phần khác biệt nhỏ nhất trong một văn bản viết .

Người ta có thể đi theo một cách khác và nói rằng đồ thị bao gồm các ký tự, nhưng sau đó chúng sẽ được gọi là "đồ thị Trung Quốc", và tất cả các bit và mảnh đồ thị Trung Quốc được tạo thành sẽ phải được gọi là "ký tự". Tuy nhiên, đó là tất cả ngược. Đồ thị là các bit và mảnh nhỏ riêng biệt. Nhân vật được phát triển hơn. Cụm từ "glyphs có thể ghép lại được", sẽ được nói rõ hơn trong ngữ cảnh Unicode là "các ký tự có thể ghép lại được".

Unicode định nghĩa các ký tự nhưng nó cũng định nghĩa các biểu đồ sẽ được soạn thảo với các biểu đồ hoặc ký tự khác. Những điều quái dị mà bạn sáng tác là một ví dụ tốt về điều này. Nếu họ nắm bắt được, có lẽ họ sẽ nhận được điểm mã của riêng mình trong phiên bản Unicode sau này;)

Có một yếu tố đệ quy cho tất cả điều này. Ở cấp độ cao hơn, biểu đồ trở thành ký tự trở thành biểu đồ, nhưng đó là biểu đồ hoàn toàn đi xuống.

Trả lời TS

Chương 1 của tiêu chuẩn nêu rõ: "Mã hóa ký tự Unicode xử lý các ký tự chữ cái, ký tự tư tưởng và ký hiệu tương đương, có nghĩa là chúng có thể được sử dụng trong bất kỳ hỗn hợp nào và với cơ sở tương đương". Đưa ra tuyên bố này, chúng ta nên chuẩn bị cho một số sự kết hợp của các điều khoản trong tiêu chuẩn. Đôi khi thuật ngữ thích hợp chỉ trở nên rõ ràng khi nhìn lại khi một tiêu chuẩn phát triển.

Nó thường xảy ra trong các định nghĩa chính thức của một ngôn ngữ mà hai điều cơ bản được định nghĩa theo nghĩa của nhau. Ví dụ: trong XML, một phần tử được định nghĩa là thẻ bắt đầu có thể được theo sau bởi nội dung, theo sau là thẻ kết thúc. Nội dung được xác định lần lượt là một yếu tố, dữ liệu ký tự hoặc một vài thứ khác có thể. Một mẫu các định nghĩa tự tham chiếu cũng được ẩn trong tiêu chuẩn Unicode:

Một đồ thị là một điểm mã hoặc một ký tự.

Một ký tự được tạo thành từ một chuỗi gồm một hoặc nhiều đồ thị.

Khi lần đầu tiên đối mặt với hai định nghĩa này, người đọc có thể phản đối định nghĩa đầu tiên với lý do điểm mã một ký tự, nhưng điều đó không phải lúc nào cũng đúng. Một chuỗi gồm hai điểm mã đôi khi mã hóa một điểm mã duy nhất theo chuẩn hóa và điểm mã được mã hóa đó đại diện cho ký tự, như được minh họa trong hình 2.7 . Chuỗi các điểm mã mã hóa các điểm mã khác. Điều này đang trở nên khó khăn một chút và chúng tôi thậm chí đã không đến được lớp nơi các sơ đồ mã hóa ký tự như UTF-8 được sử dụng để mã hóa các điểm mã thành các chuỗi byte.

Trong một số bối cảnh, ví dụ, một bài viết học thuật về dấu phụ , và phần riêng lẻ của một nhân vật có thể tự hiển thị trong văn bản. Trong bối cảnh đó, phần ký tự riêng lẻ có thể được coi là một ký tự, do đó, có nghĩa là tiêu chuẩn Unicode vẫn linh hoạt.

Như Mark Avery đã chỉ ra, một nhân vật có thể được sáng tác thành một thứ phức tạp hơn. Đó là, mỗi nhân vật có thể phục vụ như một đồ thị nếu muốn. Kết quả cuối cùng của tất cả các thành phần là một điều mà "người dùng nghĩ về một nhân vật". Dường như không có bất kỳ sự phản kháng thực sự nào, trong tiêu chuẩn hoặc trong cuộc thảo luận này, với ý tưởng rằng ở cấp độ cao nhất có những điều này trong văn bản mà người dùng nghĩ là các ký tự riêng lẻ. Để tránh quá tải thuật ngữ đó, chúng ta có thể sử dụng "grapheme" trong mọi trường hợp chúng ta muốn đề cập đến các phần được sử dụng để soạn một ký tự.

Đôi khi, tiêu chuẩn Unicode ở khắp mọi nơi với thuật ngữ của nó. Ví dụ, Chương 3 định nghĩa UTF-8 là "dạng mã hóa" trong khi bảng chú giải định nghĩa "dạng mã hóa" là một thứ khác và UTF-8 là "Lược đồ mã hóa ký tự". Một ví dụ khác là "Grapheme_Base" và "Grapheme_Extend", được thừa nhận là sai lầm nhưng vẫn tồn tại bởi vì thanh trừng chúng là một chút nhiệm vụ. Vẫn còn nhiều việc phải làm để thắt chặt thuật ngữ được sử dụng theo tiêu chuẩn.

Các Đề xuất bổ sung kết hợp GRAPHEME JOINER nhận nó sai khi nó tuyên bố rằng "Graphemes là trình tự của một hoặc các ký tự mã hóa hơn tương ứng với những gì người dùng nghĩ là nhân vật." Thay vào đó, nó nên đọc, "Một chuỗi gồm một hoặc nhiều biểu đồ tổng hợp những gì người dùng nghĩ về nhân vật." Sau đó, nó có thể sử dụng thuật ngữ "chuỗi grapheme" rõ ràng với thuật ngữ "chuỗi ký tự". Cả hai thuật ngữ đều hữu ích. "Chuỗi grapheme" ngụ ý gọn gàng quá trình xây dựng một nhân vật từ những mảnh nhỏ hơn. "chuỗi ký tự" có nghĩa là tất cả những gì chúng ta thường hiểu là: "Một chuỗi những thứ mà người dùng nghĩ là ký tự."

Đôi khi một lập trình viên thực sự muốn hoạt động ở mức trình tự grapheme, do đó nên có sẵn các cơ chế kiểm tra và thao tác các trình tự đó, nhưng nói chung, khi xử lý văn bản, nó đủ để hoạt động trên "chuỗi ký tự" (những gì người dùng nghĩ về như một nhân vật) và để hệ thống quản lý các chi tiết cấp thấp hơn.

Trong mọi trường hợp được đề cập cho đến nay trong cuộc thảo luận này, sẽ tốt hơn khi sử dụng "grapheme" để chỉ các thành phần không thể tách rời và "ký tự" để chỉ thực thể sáng tác. Cách sử dụng này cũng phản ánh tốt hơn các ý nghĩa lâu đời của cả hai thuật ngữ.


Một -1 thận trọng; Tôi nghĩ điều này là sai. Bạn ngụ ý rằng một nhân vật có thể bao gồm nhiều biểu đồ, nhưng luôn luôn được biểu thị bằng một glyph duy nhất; Tôi nghĩ rằng trên thực tế nó là cách khác. Các trang như en.wikipedia.org/wiki/N-diaeresis đề xuất rằng sự kết hợp của một chữ cái với một dấu phụ (ít nhất là một thay đổi ý nghĩa của nó) tạo thành một biểu đồ mới riêng biệt và bản thân dấu phụ không phải là một biểu đồ. Trong khi đó, glyphs có thể kết hợp rõ ràng s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ I̪͉̜̼̼̣̟̣ c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ d̘̭̙̪̦o̬̲̜̺ t̺̖̗̩̱h̟̟̱i̹s̹̱
Mark Amery

Tôi đánh giá cao trả lời, mà tôi vừa thấy. Tuy nhiên, tôi vẫn nghĩ rằng định nghĩa về đồ thị của bạn trên thực tế là không chính xác, hoặc ít nhất là mâu thuẫn với cách Unicode định nghĩa từ này. Bạn bác bỏ ý tưởng về một đồ thị được tạo thành từ các ký tự là "tất cả ngược", nhưng tôi đã đào một ít và tìm thấy unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htmlm mà theo nghĩa đen bắt đầu bằng câu lệnh " Đồ thị là chuỗi của một hoặc nhiều ký tự được mã hóa " .
Đánh dấu Amery

Và tuyên bố đó tiếp tục, "... tương ứng với những gì người dùng nghĩ về nhân vật." Ngay cả thuật ngữ " grapheme-joer ", cũng như cơ chế đằng sau thuật ngữ này, là minh họa cho những gì tôi đã nêu ở đầu câu trả lời của tôi: Tiêu chuẩn Unicode định nghĩa là "ký tự" thực sự là sự pha trộn giữa biểu đồ và ký tự. Sẽ sạch hơn khi gọi đồ thị là "đồ thị" và ký tự là "ký tự" thay vì phát minh ra các mâu thuẫn như " ký tự được phân tách trước " và " cụm đồ thị ".
Yorick tội nghiệp

@PoorYorick Bạn tuyên bố rằng "... một ký tự là một đơn vị văn bản riêng biệt bao gồm một hoặc nhiều biểu đồ" và "Biểu đồ là các bit và mảnh nhỏ riêng biệt. Các ký tự được phát triển hơn". Bạn có bất kỳ tài liệu tham khảo hỗ trợ các yêu cầu này? Bởi vì tôi bằng cách nào đó nghi ngờ, rằng tập đoàn Unicode đã cố tình quyết định định nghĩa tên của họ bằng cách nào đó "đảo ngược".
TS

@PoorYorick Tôi hiểu quan điểm của bạn, trước khi bạn thêm lời giải thích này, đó không phải là lý do tôi hỏi. Tôi chỉ đơn giản yêu cầu tài liệu tham khảo (từ vựng, bài báo khoa học, tiêu chuẩn kỹ thuật, ...), vì tôi không biết bất kỳ tài liệu nào, sử dụng grapheme theo cách bạn diễn giải nó. (Một vài kết quả google đầu tiên cho grapheme cũng không sử dụng từ theo cách của bạn). Bạn đã thêm một blockquote "Biểu đồ là điểm mã hoặc ký tự. [...]" - nhưng nó đến từ đâu? Cuối cùng, bạn nói "ý nghĩa lâu dài của cả hai thuật ngữ." - Nếu nó được thiết lập thì liên kết với một cái gì đó, đó là sử dụng thuật ngữ theo cách này.
TS
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.