Máy tính tự nó không hiểu văn bản. Thay vào đó, mỗi ký tự được đại diện bằng một con số. Theo truyền thống, một tập số dùng để đại diện cho bảng chữ cái và các ký tự khác (gọi là hệ thống bảng mã - coding system, encoding hoặc character set) có kích thước giới hạn do những giới hạn về phần cứng của máy tính.
Phần chung nhất của bảng mã (hoặc ít ra được chấp nhận rộng rãi nhất) là ASCII (American Standard Code for Information Interchange). Có thể coi nó là chuẩn phần mềm thành công nhất từ trước đến nay. ASCII hiện đại được chuẩn hoá năm 1986 (ANSI X3.4, RFC 20, ISO/IEC 646:1991, ECMA-6) bởi American National Standards Institute (ANSI).
ASCII chỉ dùng 7 bit, nghĩa là nó chỉ dùng những số được đại diện bởi 7 chữ số nhị phân, có giá trị từ 0 đến 127 tính theo thập phân. Nó bao gồm 32 ký tự không hiển thị, dùng làm ký tự điều khiển, hầu hết nằm trong 0 đến 31, cùng với ký tự điều khiển cuối cùng, DEL hay delete, có giá trị 127. Các ký tự từ 32 đến 126 là ký tự có thể thấy: khoảng trắng, dấu chấm câu, các chữ cái Latin và các con số.
Bit thứ 8 trong ASCII ban đầu dùng làm bit kiểm tra (parity bit). Nếu không dùng, nó là 0. Nghĩa là, với ASCII, mỗi ký tự nằm trong một byte đơn.
Mặc dùng ASCII đủ để liên lạc bằng tiếng Anh hiện đại, những ngôn ngữ châu Âu khác có thêm các ký tự có dấu, mọi việc trở nên không dễ dàng. Chuẩn ISO 8859 ra đời để đáp ứng nhu cầu này. Chúng tương thích ngược với ASCII, nhưng thay vì để bit 8 là 0, bit này được dùng để thêm 127 ký tự khác vào bảng mã. Những giới hạn của ISO 8859 dần dần lộ ra, và hiện có 15 biến thể khác nhau của ISO 8859 (từ 8859-1 đến 8859-15). Những byte bên ngoài phạm vi tương thích ASCII của những bảng mã này thường có xung đột giữa ký tự đại diện cho mỗi byte. Vấn đề tương tác giữa các bảng mã còn phức tạp hơn khi Windows-1252 được dùng trong vài phiên bản của Microsoft Windows cho các ngôn ngữ châu Âu. Nó kế thừa từ ISO 8859-1 nhưng lại có nhiều khác biệt. Tuy nhiên những bảng mã này vẫn tương thích với ASCII.
Sự phát triển các bảng mã một-byte hoàn toàn khác cho các bảng chữ cái phi Latin, như EUC (Extended Unix Coding) được dùng cho tiếng Nhật và tiếng Hàn Quốc (và một phần nhỏ tiếng Trung Hoa) tạo ra thêm nhiều rắc rối, trong khi những hệ điều hành khác vẫn dùng những bảng mã khác nhau cho cùng ngôn ngữ, ví dụ, Shift-JIS và ISO-2022-JP. Người dùng muốn xem các ký tự cyrillic phải chọn giữa KOI8-R cho Nga và Bungari hoặc KOI8-U cho Ukraina, cũng như các bảng mã cyrillic khác như ISO 8859-5 và bộ Windows-1251. Các bảng mã này không giữ tính tương thích với ASCII (mặc dù KOI8 đặt các ký tự cyrillic theo đúng thứ tự Latin nên trong trường hợp bit 8 bị lượt bỏ, văn bản vẫn có thể đọc trên terminal ASCII thông qua chuyển ngữ giữ nguyên hoa thường).
Điều này dẫn đến nhiều mâu thuẫn, và còn dẫn đến không thể trao đổi đa ngôn ngữ, đặc biệt giữa các bảng mã khác nhau. Unicode vào cuộc.
Unicode loại bỏ giới hạn một byte của các bảng mã truyền thống. Nó dùng 17 "plane" 65,536 code point để mô tả 1,114,112 ký tự. Do plane đầu tiên, được biết dưới tên "Basic Multilingual Plane" hoặc BMP, chứa hầu hết những thứ cần dùng, nhiều người nhầm tưởng Unicode là bảng mã 16 bit.
Unicode được ánh xạ theo nhiều cách khác nhau, nhưng hai cách thông dụng là UTF (Unicode Transformation Format) và UCS (Universal Character Set). Con số phía sau UTF cho biết số bit được dùng cho một đơn vị, trong khi con số sau UCS cho biết số byte. Việc UTF-8 trở nên phổ biến như một chuẩn trao đổi các văn bản Unicode là kết quả của bản chất 8-bit của nó, và nó là chủ đề của tài liệu này.
UTF-8 là bảng mã ký tự có độ dài biến đổi, mà đối với UTF-8 là từ một đến bốn byte cho một ký hiệu. Vậy, byte UTF-8 đầu tiên được dùng để mã hoá ASCII, bảo đảm tính tương thích ngược hoàn toàn với ASCII. UTF-8 nghĩa là ASCII và các ký tự Latin có thể trao đổi với kích thước tăng lên một chút vì chỉ bit đầu tiên được dùng. Người dùng các bảng mã phương đông như Nhật, được gán một vùng byte cao hơn thì không vui vẻ lắm, vì nó tăng khoảng 50% kích thước dữ liệu.
UTF-8 cho phép bạn làm việc với chuẩn quốc tế được chấp nhận trong một
môi trường đa ngôn ngữ, với tính dư thừa dữ liệu tương đối thấp. UTF-8
được xem như cách yêu thích để gửi dữ liệu phi ASCII qua Internet,
thông qua Email, IRC hay các phương tiện khác. Tuy thế, nhiều người
xem dùng UTF-8 cho truyền thông trực tuyến là lạm dụng. Do vậy tốt
nhất nên nhận thức được phản ứng với UTF-8 trong một số kênh trao đổi,
mailing list hoặc Usenet trước khi dùng các ký tự UTF-8
Giờ bạn đã hiểu các nguyên tắc cơ bản của Unicode, bạn đã sẵn sàng để dùng UTF-8 trong hệ thống của bạn.
Yêu cầu bắt buộc cho UTF-8 là phải cài đặt glibc hỗ trợ national
language support. Điều này có nghĩa là tập tin
Giờ chúng ta sẽ quyết định xem locale UTF-8 nào có cho ngôn ngữ của chúng ta, hoặc sẽ tạo mới nếu cần.
(Thay "en_US" với thiết lập locale của bạn) # locale -a | grep 'en_US' en_US en_US.UTF-8
Trong phần kết quả, chúng ta cần có một kết quả có đuôi
(Thay "en_US" bằng thiết lập locale của bạn) # localedef -i en_US -f UTF-8 en_US.UTF-8
Cách khác để thêm locale UTF-8 là thêm vào tập tin
en_US.UTF-8/UTF-8
Có một biến môi trường cần đặt để dùng locale UTF-8:
Những người khác thích đặt toàn hệ thống. Một trường hợp đặt biệt mà
tác giả tài liệu này đặc biệt khuyên dùng là khi dùng
Để thiết lập locale toàn cục, nên dùng
(Như thường lệ, nhớ đổi "en_US.UTF-8" sang locale của bạn) LC_ALL="en_US.UTF-8"
Kế tiếp, môi trường phải được cập nhật các thay đổi.
# env-update >>> Regenerating /etc/ld.so.cache... * Caching service dependencies ... # source /etc/profile
Giờ chạy
# locale LANG= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=en_US.UTF-8
Tất cả chỉ có thế. Giờ bạn đang dùng locale UTF-8, và bước kế tiếp là cấu hình ứng dụng thường dùng của bạn.
Khi Unicode bắt đầu được để ý trong giới phần mềm, bảng mã nhiều byte vẫn chưa thích hợp với ngôn ngữ như C, trong khi đây lại là ngôn ngữ được dùng nhiều để viết chương trình. Ngay cả ngày nay, vày chương trình vẫn không xử lý đúng UTF-8. May mắn là hầu hết còn lại thì đúng!
Có một số tuỳ chọn NLS trong cấu hình Linux kernel, nhưng quan trong nhất là được để bị rối! Phần quan trọng nhất, điều duy nhất cần làm là tạo UTF-8 NLS support cho kernel, và thay đổi NLS mặc định sang utf8.
File Systems --> Native Language Support --> (utf8) Default NLS Option <*> NLS UTF8(Ngoài ra <*> những bảng mã khác được dùng trong hệ tập tin FAT hoặc CD-ROM Joilet.)
Nếu bạn định dùng phân vùng NTFS, bạn có thể cần xác định tuỳ chọn
File Systems --> DOS/FAT/NT Filesystems --> (437) Default codepage for fat
Tránh đặt
Để thay đổi bảng mã tên tập tin, dùng
# emerge --ask app-text/convmv(Dạng thức lệnh) # convmv -f <current-encoding> -t utf-8 <filename>(Thay iso-8859-1 bằng bảng mã cần chuyển đổi từ đó) # convmv -f iso-8859-1 -t utf-8 filename
Để thay đổi
(Thay iso-8859-1 bằng bảng mã cần chuyển đổi từ đó) (Kiểm tra kết quả có chính xác không) # iconv -f iso-8859-1 -t utf-8 filename(Chuyển đổi và lưu kết quả vào một tập tin mới) # iconv -f iso-8859-1 -t utf-8 filename > newfile
Để bật UTF-8 trên conaolw, bạn sửa tập tin
Biến
(Thay "uk" bằng layout của bạn) KEYMAP="uk"
Thêm USE flag
# emerge --update --deep --newuse world
Ngoài ra bạn cũng nên biên dịch lại những gói liên kết đến hai thư
viện này vì giờ USE flag đã thay đổi. Công cụ cần dùng
(
# revdep-rebuild --soname libncurses.so.5 # revdep-rebuild --soname libslang.so.1
Tất cả các môi trường desktop quan trọng đều hỗ trợ Unicode đầy đủ, và không cần làm gì hơn những gì đã đề cập trong tài liệu này, do các bộ công cụ bên dưới (Qt hoặc GTK+2) đều hỗ trợ UTF-8 rất tốt. Điều này dẫn đến các ứng dụng dùng các bộ công cụ này cũng hỗ trợ UTF-8 tốt.
Ngoại lệ bao gồm Xlib và GTK+1. GTK+1 cần
iso-10646-1 FontSpec trong ~/.gtkrc, ví dụ
style "user-font" { fontset="-misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1" } widget_class "*" style "user-font"
Nếu ứng dụng hỗ trợ cả Qt và GTK+2 GU, GTK+2 GUI sẽ cho kết quả Unicode tốt hơn.
Phông TrueType hỗ trợ Unicode và hầu hết các phông hiên tại trong Xorg
có một lượng ký tự ấn tượng, mặc dù dĩ nhiên, không phải tất các các
ký tự trong Unicode. Để tạo các phông chữ (bao gồm bộ Bitstream Vera)
hỗ trợ bộ ký tự Đông Á với X, thêm USE flag
Ngoài ra còn có vài phông chữ hỗ trợ Unicode trong Portage.
# emerge terminus-font intlfonts freefonts cronyx-fonts corefonts urwvn-fonts
Các trình quản lý cửa sổ dựa trên GTK hoặc Qt thường hỗ trợ Unicode rất tốt, vì chúng dùng thư viện Xft để xử lý phông chữ. Nếu trình quản lý cửa sổ của bạn không dùng Xft, bạn vẫn có thể dùng FontSpec đã đề cập trong phần trước cho phông chữ Unicode.
Terminal hỗ trợ Xft và Unicode thường khó tìm hơn. Ngoài Konsole và
gnome-terminal, những tuỳ chọn tốt nhất trong Portage là
defutf8 on
Vim hỗ trợ UTF-8 tốt, và tự động nhận dạng tập tin UTF-8. Thông tin
chi tiết, xem
Emacs 22.x về sau hỗ trợ UTF-8 tốt. Xemacs 22.x chưa hỗ trợ các ký tự tổ hợp.
Phiên bản cũ hơn của Emacs và/hoặc Xemacs có thể cần cài đặt
(require 'un-define) (require 'jisx0213) (set-language-environment "Japanese") (set-default-coding-systems 'utf-8) (set-terminal-coding-system 'utf-8)
Nano hiện thời không hỗ trợ UTF-8, mặc dù nó đã được dự định trong thời gian dài. Hy vọng nó sẽ thay đổi trong thời gian gần. Vào lúc viết tài liệu này, hỗ trợ UTF-8 trong Nano đã có trong CVS, sẽ có trong phiên bản kế tiếp.
Hiện thời
C shell,
Irssi hỗ trợ UTF-8 tốt, mặc dù cần đặt tuỳ chọn.
/set term_type UTF-8
Với các kênh trao đổi các ký tự phi ASCII theo dạng thức không phải
UTF-8, dùng
Mutt hỗ trợ Unicode rất tốt. Để dùng UTF-8 với Mutt, bạn không cần phải sửa gì tập tin cấu hình. Mutt sẽ hoạt động trong môi trường Unicode mà không cần sửa gì nếu mọi tập tin cấu hình của bạn (kể cả chữ ký) đều mã hoá UTF-8.
Thông tin chi tiết hơn có tạ
Chúng ta dùng rất nhiều
LESSCHARSET=utf-8
Các trang man là một phần không thể tách rời của Linux. Để bảo đảm bất
kỳ ký tự Unicode nào trên trang man hiển thị đúng, sửa
(Đây là dòng cũ) NROFF /usr/bin/nroff -Tascii -c -mandoc(Đây là dòng mới) NROFF /usr/bin/nroff -mandoc -c
Đây là hai trình duyệt web văn bản thông dụng, chúng ta sẽ xem cách
bật hỗ trợ UTF-8 cho chúng. Trên
(Với elinks, sửa /etc/elinks/elinks.conf hoặc ~/.elinks/elinks.conf và thêm dòng sau) set terminal.linux.utf_8_io = 1(Với links, sửa ~/.links/links.cfg và thêm dòng sau) terminal "xterm" 0 1 0 us-ascii utf-8
Có một số trang web để kiểm tra UTF-8.
Khi dùng một trong những trình duyệt web văn bản trên, nhớ dùng terminal hỗ trợ Unicode.
Nếu bạn thấy một số ký tự hiện ô vuông với con số bên trong, nghĩa là phông chữ không có ký tự đó. Bởi vậy, nó hiển thị ô vuông với mã thập lục phân của ký tự UTF-8 đó.
Để bật dead key trong X, bạn cần có một layout hỗ trợ nó. Hầu hết
layout châu Âu đã hỗ trợ dead key với nhiều mặc định khác nhau. Tuy
nhiên, điều đó không đúng với layout Bắc Mỹ. Mặc dù có một số chỗ
không thống nhất giữa các layout, cách dễ nhất là dùng layout theo mẫu
"en_US" thay vì "us" như ví dụ. Layout được đặt trong
Section "InputDevice" Identifier "Keyboard0" Driver "kbd" Option "XkbLayout" "en_US"# thay vì chỉ "us" (Tuỳ chọn Xkb khác ở đây) EndSection
Thay đổi này sẽ có tác động sau khi khởi động lại X server. Để áp dụng
thảy đổi ngay tức thời, dùng
Có lẽ dễ nhất là mô tả dead key bằng ví dụ. Mặc dù kết quả tuỳ theo locale, khái niệm vẫn giống nhau. Ví dụ chứa ký tự UTF-8, nên để có thể cần trình duyệt có thể xem UTF-8 hoặc đã cấu hình locale UTF-8.
Khi nhấn
Khi nhấn