Đây là lệnh perluniintro có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
perluniintro - Giới thiệu Perl Unicode
MÔ TẢ
Tài liệu này cung cấp một ý tưởng chung về Unicode và cách sử dụng Unicode trong Perl. Xem
"Tài nguyên bổ sung" để tham khảo các phương pháp điều trị chuyên sâu hơn của Unicode.
Unicode
Unicode là một tiêu chuẩn bộ ký tự có kế hoạch mã hóa tất cả các hệ thống chữ viết của
thế giới, cùng với nhiều biểu tượng khác.
Unicode và ISO / IEC 10646 là các tiêu chuẩn phối hợp thống nhất hầu hết các tiêu chuẩn hiện đại khác
tiêu chuẩn thiết lập ký tự, bao gồm hơn 80 hệ thống chữ viết và hàng trăm ngôn ngữ,
bao gồm tất cả các ngôn ngữ hiện đại quan trọng về mặt thương mại. Tất cả các ký tự lớn nhất
Từ điển Trung Quốc, Nhật Bản và Hàn Quốc cũng được mã hóa. Các tiêu chuẩn cuối cùng sẽ
bao gồm hầu hết các ký tự trong hơn 250 hệ thống chữ viết và hàng ngàn ngôn ngữ.
Unicode 1.0 được phát hành vào tháng 1991 năm 6.0 và 2010 vào tháng XNUMX năm XNUMX.
Một mã Unicode tính cách là một thực thể trừu tượng. Nó không bị ràng buộc với bất kỳ số nguyên cụ thể nào
chiều rộng, đặc biệt là không đối với ngôn ngữ C "char". Unicode là ngôn ngữ trung lập và hiển thị-
trung lập: nó không mã hóa ngôn ngữ của văn bản và nó không định nghĩa chung
phông chữ hoặc các chi tiết bố cục đồ họa khác. Unicode hoạt động trên các ký tự và trên văn bản được xây dựng
từ các ký tự đó.
Unicode định nghĩa các ký tự như "CHỮ VIẾT HOA LATIN A" hoặc "CHỮ NHỎ HY LẠP ALPHA" và
số duy nhất cho các ký tự, trong trường hợp này là 0x0041 và 0x03B1, tương ứng. Này
số duy nhất được gọi là mã điểm. Một điểm mã về cơ bản là vị trí của
ký tự trong tập hợp tất cả các ký tự Unicode có thể có, và do đó trong Perl, thuật ngữ
thứ tự thường được sử dụng thay thế cho nó.
Tiêu chuẩn Unicode ưu tiên sử dụng ký hiệu thập lục phân cho các điểm mã. Nếu số
như 0x0041 không quen thuộc với bạn, hãy xem phần sau, "Ký hiệu thập lục phân".
Tiêu chuẩn Unicode sử dụng ký hiệu "U + 0041 CHỮ HOA LATIN A", để cung cấp cho
điểm mã thập lục phân và tên chuẩn của nhân vật.
Unicode cũng định nghĩa nhiều tài sản cho các ký tự, như "chữ hoa" hoặc
"chữ thường", "chữ số thập phân" hoặc "dấu chấm câu"; những thuộc tính này độc lập với
tên của các nhân vật. Hơn nữa, các hoạt động khác nhau trên các ký tự như
viết hoa, viết thường và đối chiếu (sắp xếp) được xác định.
Một mã Unicode hợp lý "nhân vật" thực sự có thể bao gồm nhiều hơn một thực tế
"ký tự" hoặc điểm mã. Đối với các ngôn ngữ phương Tây, điều này được mô hình hóa đầy đủ bởi cơ sở
tính cách (như "CHỮ HOA LATIN A") theo sau bởi một hoặc nhiều bổ ngữ (như
"KẾT HỢP TÍCH CỰC CHÍNH XÁC"). Chuỗi ký tự cơ sở và bổ ngữ này được gọi là
kết hợp tính cách trình tự. Một số ngôn ngữ không phải là ngôn ngữ phương Tây yêu cầu các mô hình phức tạp hơn,
vì vậy Unicode đã tạo ra biểu đồ cụm khái niệm này, sau đó đã được hoàn thiện thêm thành
gia tăng biểu đồ cụm. Ví dụ, một âm tiết Hangul của Hàn Quốc được coi là một
ký tự lôgic, nhưng thường bao gồm ba ký tự Unicode thực tế: một ký tự đứng đầu
phụ âm theo sau là một nguyên âm bên trong và theo sau là một phụ âm cuối.
Việc gọi các cụm grapheme mở rộng này là "ký tự" hay không tùy thuộc vào quan điểm của bạn
Quang cảnh. Nếu bạn là một lập trình viên, bạn có thể sẽ có xu hướng xem từng phần tử trong
chuỗi dưới dạng một đơn vị hoặc "ký tự". Tuy nhiên theo quan điểm của người dùng, toàn bộ
trình tự có thể được coi là một "ký tự" vì đó có thể là những gì nó trông giống như trong
ngữ cảnh của ngôn ngữ của người dùng. Trong tài liệu này, chúng tôi đưa ra quan điểm của lập trình viên:
một "ký tự" là một điểm mã Unicode.
Đối với một số kết hợp của ký tự cơ sở và bổ ngữ, có thành phần trước ký tự.
Có một ký tự tương đương, ví dụ: cho chuỗi "LATIN CAPITAL
CHỮ A "theo sau là" KẾT HỢP ACCENT ACUTE ". Nó được gọi là" LATIN CAPITAL LETTER A
CÓ ACUTE ". Tuy nhiên, các ký tự được soạn sẵn này chỉ khả dụng cho một số
và chủ yếu nhằm hỗ trợ chuyển đổi khứ hồi giữa Unicode và
các tiêu chuẩn kế thừa (như ISO 8859). Sử dụng trình tự, như Unicode, cho phép
ít khối xây dựng cơ bản hơn (điểm mã) để thể hiện nhiều grapheme tiềm năng hơn
các cụm. Để hỗ trợ chuyển đổi giữa các hình thức tương đương, bình thường các hình thức đang
cũng được xác định. Do đó, "LATIN VỐN CHỮ A CÓ ACUTE" nằm trong Bình thường hóa Mẫu
Sáng tác, (viết tắt NFC), và chuỗi "CHỮ VIẾT HOA LATIN A" theo sau là
"KẾT HỢP ACCENT ACCENT ACCENT" đại diện cho cùng một ký tự trong Bình thường hóa Mẫu Bị phân hủy
(NFD).
Do khả năng tương thích ngược với các mã hóa cũ, "một số duy nhất cho mọi
ký tự "ý tưởng bị hỏng một chút: thay vào đó, có" ít nhất một số cho mỗi
ký tự ". Cùng một ký tự có thể được thể hiện khác nhau trong một số
các bảng mã. Điều ngược lại là không đúng: một số điểm mã không có ký tự được gán.
Thứ nhất, có các điểm mã chưa được phân bổ trong các khối được sử dụng khác. Thứ hai, ở đó
là các ký tự điều khiển Unicode đặc biệt không đại diện cho các ký tự thực.
Khi Unicode lần đầu tiên được hình thành, người ta cho rằng tất cả các ký tự trên thế giới đều có thể
được biểu diễn bằng cách sử dụng một từ 16-bit; đó là tối đa 0x10000 (hoặc 65,536) ký tự sẽ
cần thiết, từ 0x0000 đến 0xFFFF. Điều này sớm được chứng minh là sai và kể từ khi Unicode 2.0
(Tháng 1996 năm 21), Unicode đã được định nghĩa tối đa 0 bit (10xXNUMXFFFF), và Unicode
3.1 (tháng 2001 năm 0) xác định các ký tự đầu tiên trên 0xFFFF. 10000xXNUMX ký tự đầu tiên
được gọi là Máy bay 0, Hoặc Cơ bản Đa ngôn ngữ Máy bay (BMP). Với Unicode 3.1, 17 (vâng,
mười bảy) mặt phẳng trong tất cả đã được xác định - nhưng chúng không ở gần đầy đủ các
ký tự, chưa.
Khi một ngôn ngữ mới đang được mã hóa, Unicode thường sẽ chọn một "khối"
điểm mã chưa được phân bổ liên tiếp cho các ký tự của nó. Cho đến nay, số điểm mã
trong các khối này luôn luôn chia hết cho 16. Các phần bổ sung trong một khối, hiện không
cần thiết, không được phân bổ, để tăng trưởng trong tương lai. Nhưng đã có những trường hợp khi một
bản phát hành sau này cần nhiều điểm mã hơn các tính năng bổ sung có sẵn và một khối mới phải
được phân bổ ở một nơi khác, không tiếp giáp với nơi đầu tiên, để xử lý phần tràn.
Do đó, rõ ràng là sớm thấy rằng "khối" không phải là một hiệu trưởng tổ chức thích hợp,
và do đó, thuộc tính "Script" đã được tạo. (Sau đó, một thuộc tính tập lệnh cải tiến đã được thêm vào
tốt, thuộc tính "Script_Extensions".) Những điểm mã đó nằm trong khối tràn
vẫn có thể có cùng một tập lệnh như những bản gốc. Khái niệm tập lệnh phù hợp hơn
với ngôn ngữ tự nhiên: có chữ viết "Latinh", chữ viết "tiếng Hy Lạp", v.v.; và có
một số tập lệnh nhân tạo, chẳng hạn như "Chung" cho các ký tự được sử dụng trong nhiều
các chữ viết, chẳng hạn như các ký hiệu toán học. Các tập lệnh thường kéo dài các phần khác nhau của một số
các khối. Để biết thêm thông tin về tập lệnh, hãy xem "Tập lệnh" trong perlunicode. Các bộ phận
thành các khối tồn tại, nhưng nó gần như hoàn toàn ngẫu nhiên - một tạo tác về cách
các ký tự đã và vẫn được cấp phát. (Lưu ý rằng đoạn này có
những thứ đơn giản hóa vì mục đích đây là phần giới thiệu. Unicode không thực sự
mã hóa các ngôn ngữ, nhưng hệ thống viết cho chúng - các tập lệnh của chúng; và một tập lệnh có thể là
được sử dụng bởi nhiều ngôn ngữ. Unicode cũng mã hóa những thứ không thực sự về ngôn ngữ,
chẳng hạn như các ký hiệu như "BAGGAGE CLAIM".)
Các điểm mã Unicode chỉ là số trừu tượng. Để nhập và xuất các bản tóm tắt này
số, các số phải là mã hóa or đăng nhiều kỳ bằng cách nào đó. Unicode định nghĩa một số
tính cách mã hóa các hình thức, Trong đó UTF-8 là phổ biến nhất. UTF-8 là độ dài có thể thay đổi
mã hóa mã hóa các ký tự Unicode dưới dạng 1 đến 4 byte. Các mã hóa khác bao gồm UTF-16
và UTF-32 và các biến thể lớn và nhỏ của chúng (UTF-8 không phụ thuộc vào thứ tự byte).
ISO / IEC 10646 xác định các dạng mã hóa UCS-2 và UCS-4.
Để biết thêm thông tin về các bảng mã - ví dụ: để tìm hiểu những gì người thay thế và byte
gọi món điểm (BOM) là - xem perlunicode.
Perl's Unicode cá nhân hóa
Bắt đầu từ Perl v5.6.0, Perl đã có khả năng xử lý Unicode nguyên bản. Perl
v5.8.0, tuy nhiên, là bản phát hành đầu tiên được đề xuất cho công việc Unicode nghiêm túc. Các
bản phát hành bảo trì 5.6.1 đã khắc phục nhiều sự cố của Unicode ban đầu
triển khai, nhưng ví dụ: biểu thức chính quy vẫn không hoạt động với Unicode trong
5.6.1. Perl v5.14.0 là bản phát hành đầu tiên hỗ trợ Unicode (gần như) liền mạch
có thể tích hợp mà không có một số lỗi (ngoại lệ là một số khác biệt trong quotemeta và
đã được khắc phục bắt đầu từ Perl 5.16.0). Để kích hoạt hỗ trợ liền mạch này, bạn nên "sử dụng
tính năng 'unicode_strings' "(được chọn tự động nếu bạn" sử dụng 5.012 "trở lên).
Xem tính năng. (5.14 cũng sửa một số lỗi và lỗi khác với tiêu chuẩn Unicode.)
Trước Perl v5.8.0, việc sử dụng "use utf8" đã được sử dụng để khai báo rằng các hoạt động trong
khối hoặc tệp hiện tại sẽ được nhận dạng Unicode. Mô hình này được phát hiện là sai hoặc tại
ít vụng về nhất: "Unicodeness" hiện được mang theo dữ liệu, thay vì được gắn vào
các hoạt động. Bắt đầu với Perl v5.8.0, chỉ có một trường hợp còn lại khi sử dụng "rõ ràng
utf8 "là cần thiết: nếu bản thân tập lệnh Perl của bạn được mã hóa bằng UTF-8, bạn có thể sử dụng UTF-8 trong
tên mã định danh và trong chuỗi ký tự và biểu thức chính quy, bằng cách nói "sử dụng utf8".
Đây không phải là mặc định vì các tập lệnh có dữ liệu 8-bit kế thừa trong đó sẽ bị hỏng. Xem
utf8.
Perl's Unicode Mô hình
Perl hỗ trợ cả chuỗi trước 5.6 của byte gốc tám bit và chuỗi Unicode
nhân vật. Nguyên tắc chung là Perl cố gắng giữ dữ liệu của nó dưới dạng byte tám bit
càng lâu càng tốt, nhưng ngay khi không thể tránh được Unicodeness, dữ liệu sẽ
được nâng cấp rõ ràng lên Unicode. Trước Perl v5.14.0, việc nâng cấp không hoàn toàn
trong suốt (xem "" Lỗi Unicode "" trong mã perlunicode) và để tương thích ngược,
không đạt được tính minh bạch hoàn toàn trừ khi "sử dụng tính năng 'unicode_strings'" (xem tính năng) hoặc
"sử dụng 5.012" (hoặc cao hơn) được chọn.
Trong nội bộ, Perl hiện đang sử dụng bất kỳ bộ ký tự tám bit gốc nào của
nền tảng (ví dụ: Latin-1), mặc định là UTF-8, để mã hóa chuỗi Unicode.
Cụ thể, nếu tất cả các điểm mã trong chuỗi là 0xFF hoặc nhỏ hơn, Perl sẽ sử dụng
bộ ký tự tám bit. Nếu không, nó sử dụng UTF-8.
Người dùng Perl thường không cần biết cũng như không quan tâm đến việc Perl sẽ mã hóa nó như thế nào
chuỗi nội bộ, nhưng nó trở nên có liên quan khi xuất chuỗi Unicode vào một luồng
không có lớp PerlIO (lớp có mã hóa "mặc định"). Trong trường hợp này, các byte thô
được sử dụng nội bộ (bộ ký tự gốc hoặc UTF-8, phù hợp với từng chuỗi) sẽ
được sử dụng và cảnh báo "Ký tự rộng" sẽ được đưa ra nếu các chuỗi đó chứa
ký tự vượt quá 0x00FF.
Ví dụ,
perl -e 'print "\ x {DF} \ n", "\ x {0100} \ x {DF} \ n"'
tạo ra một hỗn hợp khá vô dụng giữa các byte gốc và UTF-8, cũng như một cảnh báo:
Ký tự rộng được in tại ...
Để xuất UTF-8, hãy sử dụng lớp đầu ra ": encoding" hoặc ": utf8". Chi tiêu trước
binmode (STDOUT, ": utf8");
chương trình mẫu này đảm bảo rằng đầu ra hoàn toàn là UTF-8 và loại bỏ
cảnh báo của chương trình.
Bạn có thể bật tự động hóa UTF-8 của các trình xử lý tệp tiêu chuẩn của mình, mặc định là "open ()"
lớp và @ARGV bằng cách sử dụng công tắc dòng lệnh "-C" hoặc "PERL_UNICODE"
biến môi trường, xem perlrun để biết tài liệu về công tắc "-C".
Lưu ý rằng điều này có nghĩa là Perl mong đợi phần mềm khác hoạt động theo cách tương tự: nếu Perl có
dẫn đến việc tin rằng STDIN phải là UTF-8, nhưng sau đó STDIN đến từ một
lệnh không phải là UTF-8, Perl có thể sẽ phàn nàn về UTF-8 không đúng định dạng.
Tất cả các tính năng kết hợp Unicode và I / O cũng yêu cầu sử dụng tính năng PerlIO mới.
Tuy nhiên, hầu hết tất cả các nền tảng Perl 5.8 đều sử dụng PerlIO: bạn có thể xem liệu nền tảng của mình có bằng
đang chạy "perl -V" và tìm kiếm "useperlio = xác định".
Unicode và EBCDIC
Perl 5.8.0 hỗ trợ thêm cho Unicode trên nền tảng EBCDIC. Hỗ trợ này được phép
mất hiệu lực trong các bản phát hành sau đó, nhưng đã được hồi sinh vào 5.22. Hỗ trợ Unicode có phần nhiều hơn
phức tạp để triển khai vì cần có các chuyển đổi bổ sung. Xem perlebcdic để biết thêm
thông tin.
Trên nền tảng EBCDIC, dạng mã hóa Unicode nội bộ là UTF-EBCDIC thay vì UTF-8.
Sự khác biệt là UTF-8 là "ASCII an toàn" trong đó các ký tự ASCII được mã hóa thành UTF-8
nguyên trạng, trong khi UTF-EBCDIC là "EBCDIC an toàn", trong đó tất cả các ký tự cơ bản (bao gồm
tất cả những thứ có ASCII tương đương (như "A", "0", "%", và vv) đều giống nhau trong cả hai
EBCDIC và UTF-EBCDIC. Thông thường, tài liệu sẽ sử dụng thuật ngữ "UTF-8" có nghĩa là UTF-EBCDIC
cũng. Đây là trường hợp trong tài liệu này.
Tạo Unicode
Phần này áp dụng đầy đủ cho Perls bắt đầu với v5.22. Các cảnh báo trước đó khác nhau
các bản phát hành nằm trong phần phụ "Cảnh báo trước với các bản phát hành" bên dưới.
Để tạo các ký tự Unicode theo nghĩa đen, hãy sử dụng ký hiệu "\ N {...}" trong dấu ngoặc kép
dây:
của tôi $ smiley_from_name = "\ N {MẶT NẠ TRẮNG NHỎ}";
của tôi $ smiley_from_code_point = "\ N {U + 263a}";
Tương tự, chúng có thể được sử dụng trong các ký tự biểu thức chính quy
$ smiley = ~ / \ N {MẶT NẠ TRẮNG NHỎ} /;
$ smiley = ~ / \ N {U + 263a} /;
Tại thời điểm chạy, bạn có thể sử dụng:
sử dụng charnames ();
$ hebrew_alef_from_name của tôi
= charnames :: string_vianame ("HEBREW LETTER ALEF");
my $ hebrew_alef_from_code_point = charnames :: string_vianame ("U + 05D0");
Đương nhiên, "ord ()" sẽ làm ngược lại: nó biến một ký tự thành một điểm mã.
Cũng có các tùy chọn thời gian chạy khác. Bạn có thể sử dụng "pack ()":
my $ hebrew_alef_from_code_point = pack ("U", 0x05d0);
Hoặc bạn có thể sử dụng "chr ()", mặc dù nó kém thuận tiện hơn trong trường hợp chung:
$ hebrew_alef_from_code_point = chr (utf8 ::unicode_to_native(0x05d0));
utf8 :: nâng cấp ($ hebrew_alef_from_code_point);
"Utf8 :: unicode_to_native ()" và "utf8 :: lift ()" không cần thiết nếu đối số là
trên 0xFF, vì vậy ở trên có thể được viết là
$ hebrew_alef_from_code_point = chr(0x05d0);
vì 0x5d0 trên 255.
"\ x {}" và "\ o {}" cũng có thể được sử dụng để chỉ định các điểm mã tại thời điểm biên dịch trong double-
chuỗi quotish, nhưng, để tương thích ngược với các Perls cũ hơn, các quy tắc tương tự được áp dụng như
với "chr ()" cho các điểm mã nhỏ hơn 256.
"utf8 :: unicode_to_native ()" được sử dụng để mã Perl có thể di động đến các nền tảng EBCDIC.
Bạn có thể bỏ qua nó nếu bạn có thật không chắc chắn rằng sẽ không ai muốn sử dụng mã của bạn trên một
Nền tảng ASCII. Bắt đầu từ Perl v5.22, các lệnh gọi đến nó trên nền tảng ASCII được tối ưu hóa,
vì vậy không có hình phạt hiệu suất nào cả khi thêm nó. Hoặc bạn có thể đơn giản sử dụng
cấu trúc không yêu cầu nó.
Xem "Tài nguyên khác" để biết cách tìm tất cả các tên và mã số này.
Sớm hơn phát hành hãy cẩn thận
Trên nền tảng EBCDIC, trước v5.22, việc sử dụng "\ N {U + ...}" không hoạt động bình thường.
Trước phiên bản 5.16, sử dụng "\ N {...}" với tên ký tự (trái ngược với điểm mã "U + ...")
yêu cầu "use charnames: full".
Trước v5.14, có một số lỗi trong "\ N {...}" với tên ký tự (trái ngược với
Điểm mã "U + ...").
"charnames :: string_vianame ()" đã được giới thiệu trong v5.14. Trước đó,
"charnames :: vianame ()" sẽ hoạt động, nhưng chỉ khi đối số có dạng "U + ...". Của bạn
đặt cược tốt nhất ở đó cho Unicode thời gian chạy theo tên ký tự có lẽ là:
sử dụng charnames ();
$ hebrew_alef_from_name của tôi
= pack ("U", charnames :: vianame ("HEBREW LETTER ALEF"));
Xử lý Unicode
Xử lý Unicode hầu hết là minh bạch: chỉ cần sử dụng các chuỗi như bình thường.
Các hàm như "index ()", "length ()", và "substr ()" sẽ hoạt động trên các ký tự Unicode;
biểu thức chính quy sẽ hoạt động trên các ký tự Unicode (xem perlunicode và perlretut).
Lưu ý rằng Perl coi các cụm grapheme là các ký tự riêng biệt, vì vậy, ví dụ:
độ dài in ("\ N {CHỮ HOA CHỮ HOA A} \ N {KẾT HỢP ACCENT ACCENT}"),
"\n";
sẽ in ra 2, không phải 1. Ngoại lệ duy nhất là biểu thức chính quy có "\ X" cho
khớp với một cụm grapheme mở rộng. (Vì vậy, "\ X" trong một biểu thức chính quy sẽ khớp với
toàn bộ chuỗi của cả các ký tự ví dụ.)
Cuộc sống không hoàn toàn minh bạch, tuy nhiên, khi làm việc với các mã hóa cũ, I / O và
một số trường hợp đặc biệt:
Legacy Mã hóa
Khi bạn kết hợp dữ liệu kế thừa và Unicode, dữ liệu kế thừa cần được nâng cấp lên Unicode.
Thông thường, dữ liệu kế thừa được giả định là ISO 8859-1 (hoặc EBCDIC, nếu có).
Mô-đun "Mã hóa" biết về nhiều mã hóa và có các giao diện để thực hiện chuyển đổi
giữa các bảng mã đó:
sử dụng Encode 'giải mã';
$ data = decode ("iso-8859-3", $ data); # chuyển đổi từ kế thừa thành utf-8
Unicode I / O
Thông thường, viết ra dữ liệu Unicode
print FH $ some_string_with_unicode, "\ n";
tạo ra các byte thô mà Perl thường sử dụng để mã hóa nội bộ chuỗi Unicode.
Mã hóa bên trong của Perl phụ thuộc vào hệ thống cũng như những ký tự xảy ra trong
chuỗi vào thời điểm đó. Nếu bất kỳ ký tự nào ở mã điểm 0x100 trở lên, bạn
sẽ nhận được một cảnh báo. Để đảm bảo rằng đầu ra được hiển thị rõ ràng trong bảng mã, bạn
mong muốn - và để tránh cảnh báo - mở luồng với mã hóa mong muốn. Một số
ví dụ:
mở FH, ">: utf8", "tệp";
mở FH, ">: encoding (ucs2)", "file";
mở FH, ">: encoding (UTF-8)", "file";
mở FH, ">: encoding (shift_jis)", "tệp";
và trên các luồng đã mở, hãy sử dụng "binmode ()":
binmode (STDOUT, ": utf8");
binmode (STDOUT, ": encoding (ucs2)");
binmode (STDOUT, ": mã hóa (UTF-8)");
binmode (STDOUT, ": encoding (shift_jis)");
Việc khớp các tên mã hóa lỏng lẻo: chữ hoa và chữ thường không quan trọng và nhiều bảng mã có
một số bí danh. Lưu ý rằng lớp ": utf8" phải luôn được chỉ định chính xác như vậy;
nó là không tùy thuộc vào sự kết hợp lỏng lẻo của các tên mã hóa. Cũng lưu ý rằng hiện tại
": utf8" không an toàn cho đầu vào vì nó chấp nhận dữ liệu mà không xác thực rằng nó là
UTF-8 thực sự hợp lệ; thay vào đó, bạn nên sử dụng ": encoding (utf-8)" (có hoặc không có dấu gạch ngang).
Xem PerlIO cho lớp ": utf8", PerlIO :: mã hóa và Mã hóa :: PerlIO cho
lớp ": encoding ()" và Encode :: Được hỗ trợ cho nhiều kiểu mã hóa được hỗ trợ bởi "Encode"
mô-đun.
Đọc trong một tệp mà bạn biết tình cờ được mã hóa bằng một trong các mã Unicode hoặc kế thừa
mã hóa không biến dữ liệu thành Unicode trong mắt Perl một cách kỳ diệu. Để làm việc đó,
chỉ định lớp thích hợp khi mở tệp
open (my $ fh, '<: encoding (utf8)', 'anything');
$ line_of_unicode của tôi = <$ fh>;
open (my $ fh, '<: encoding (Big5)', 'anything');
$ line_of_unicode của tôi = <$ fh>;
Các lớp I / O cũng có thể được chỉ định linh hoạt hơn với pragma "mở". Xem mở, hoặc
nhìn vào ví dụ sau.
sử dụng open ': encoding (utf8)'; # đầu vào / đầu ra mã hóa mặc định sẽ là
# UTF-8
mở X, "> tệp";
in X chr(0x100), "\ n";
đóng X;
mở Y, "
printf "% # x \ n", ord ( ); # cái này sẽ in 0x100
đóng Y;
Với pragma "mở", bạn có thể sử dụng lớp ": locale"
BEGIN {$ ENV {LC_ALL} = $ ENV {LANG} = 'ru_RU.KOI8-R'}
# the: locale sẽ thăm dò các biến môi trường ngôn ngữ như
#LC_ALL
sử dụng open OUT => ': locale'; # russki parusski
open (O, "> koi8");
in O chr(0x430); # Unicode CYRILLIC THƯ NHỎ A = KOI8-R 0xc1
đóng O;
mở (tôi, "
printf "% # x \ n", ord ( ), "\ n"; # cái này sẽ in ra 0xc1
đóng I;
Các phương pháp này cài đặt một bộ lọc trong suốt trên luồng I / O để chuyển đổi dữ liệu từ
mã hóa được chỉ định khi nó được đọc từ luồng. Kết quả luôn là Unicode.
Pragma mở ảnh hưởng đến tất cả các lệnh gọi "open ()" sau pragma bằng cách thiết lập các lớp mặc định.
Nếu bạn chỉ muốn ảnh hưởng đến một số luồng nhất định, hãy sử dụng các lớp rõ ràng trực tiếp trong "open ()"
gọi.
Bạn có thể chuyển đổi mã hóa trên một luồng đã mở bằng cách sử dụng "binmode ()"; xem "binmode"
bằng tri giác.
": Locale" hiện không hoạt động với "open ()" và "binmode ()", chỉ với "open"
pragma. Phương thức ": utf8" và ": encoding (...)" hoạt động với tất cả "open ()",
"binmode ()" và pragma "mở".
Tương tự, bạn có thể sử dụng các lớp I / O này trên các luồng đầu ra để tự động chuyển đổi Unicode
sang mã hóa được chỉ định khi nó được ghi vào luồng. Ví dụ như sau
đoạn mã sao chép nội dung của tệp "text.jis" (được mã hóa dưới dạng ISO-2022-JP, hay còn gọi là JIS) sang
tệp "text.utf8", được mã hóa là UTF-8:
open (my $ nihongo, '<: encoding (iso-2022-jp)', 'text.jis');
open (my $ unicode, '>: utf8', 'text.utf8');
while (<$ nihongo>) {print $ unicode $ _}
Việc đặt tên cho các bảng mã, bằng cả "open ()" và bởi pragma "open" cho phép
cả hai tên: "koi8-r" và "KOI8R" sẽ được hiểu.
Các mã hóa phổ biến được ISO, MIME, IANA và nhiều tiêu chuẩn hóa khác công nhận
tổ chức được công nhận; để biết danh sách chi tiết hơn, hãy xem Mã hóa :: Được hỗ trợ.
"read ()" đọc ký tự và trả về số ký tự. "seek ()" và "tell ()"
hoạt động trên số lượng byte, cũng như "sysread ()" và "sysseek ()".
Lưu ý rằng do hành vi mặc định của việc không thực hiện bất kỳ chuyển đổi nào khi đầu vào nếu
không có lớp mặc định, rất dễ viết nhầm mã khiến nó tiếp tục mở rộng
tệp bằng cách mã hóa dữ liệu nhiều lần:
# CẢNH BÁO MÃ XẤU
mở F, "tập tin";
địa phương $ /; ## đọc toàn bộ tệp gồm các ký tự 8 bit
$ t = ;
đóng F;
mở F, ">: encoding (utf8)", "file";
in F $ t; ## chuyển đổi thành UTF-8 trên đầu ra
đóng F;
Nếu bạn chạy mã này hai lần, nội dung của hồ sơ sẽ được mã hóa hai lần UTF-8. A "sử dụng
open ': encoding (utf8)' "sẽ tránh được lỗi hoặc mở một cách rõ ràng hồ sơ
cho đầu vào là UTF-8.
LƯU Ý: các tính năng ": utf8" và ": encoding" chỉ hoạt động nếu Perl của bạn đã được xây dựng với
PerlIO, là mặc định trên hầu hết các hệ thống.
Hiển thị Unicode As bản văn
Đôi khi bạn có thể muốn hiển thị các vô hướng Perl chứa Unicode dưới dạng ASCII đơn giản (hoặc
EBCDIC) văn bản. Chương trình con sau đây chuyển đổi đối số của nó để các ký tự Unicode
với các điểm mã lớn hơn 255 được hiển thị dưới dạng "\ x {...}", các ký tự điều khiển (như
"\ n") được hiển thị dưới dạng "\ x .." và phần còn lại của các ký tự là chính nó:
phụ nice_string {
tham gia("",
bản đồ {$ _> 255 # nếu ký tự rộng ...
? sprintf ("\\ x {% 04X}", $ _) # \ x {...}
: chr ($ _) = ~ / [[: cntrl:]] / # else nếu ký tự điều khiển ...
? sprintf ("\\ x% 02X", $ _) # \ x ..
: quotemeta (chr ($ _)) # khác được trích dẫn hoặc là chính họ
} giải nén ("W *", $ _ [0])); # giải nén các ký tự Unicode
}
Ví dụ,
Nice_string ("foo \ x {100} bar \ n")
trả về chuỗi
'foo \ x {0100} bar \ x0A'
đã sẵn sàng để in.
("\\ x {}" được sử dụng ở đây thay vì "\\ N {}", vì rất có thể bạn muốn xem
các giá trị gốc là.)
Reduct ® Khách hàng
· Toán tử bổ sung bit ~ Và vec ()
Toán tử bổ sung bit "~" có thể tạo ra kết quả đáng ngạc nhiên nếu được sử dụng trên chuỗi
chứa các ký tự có giá trị thứ tự trên 255. Trong trường hợp này, kết quả là
phù hợp với mã hóa bên trong của các ký tự, nhưng không phù hợp với nhiều mã khác. Cho nên
đừng làm vậy. Tương tự đối với "vec ()": bạn sẽ hoạt động trên mã hóa nội bộ
các mẫu bit của các ký tự Unicode, không phải trên các giá trị điểm mã, rất
có thể không phải những gì bạn muốn.
· Nhìn trộm mã hóa nội bộ của Perl
Người dùng Perl bình thường không bao giờ nên quan tâm cách Perl mã hóa bất kỳ chuỗi Unicode cụ thể nào
(bởi vì các cách thông thường để lấy nội dung của một chuỗi bằng Unicode - thông qua đầu vào
và đầu ra - phải luôn thông qua các lớp I / O được xác định rõ ràng). Nhưng nếu bạn phải,
có hai cách để xem xét hậu trường.
Một cách để nhìn vào bên trong bảng mã bên trong của các ký tự Unicode là sử dụng
"unpack (" C * ", ..." để lấy byte của bất kỳ thứ gì mà mã hóa chuỗi xảy ra, hoặc
"unpack (" U0 .. ", ...)" để lấy các byte của mã hóa UTF-8:
# này in c4 80 cho UTF-8 byte 0xc4 0x80
print join ("", unpack ("U0 (H2) *", pack ("U", 0x100))), "\ n";
Tuy nhiên, một cách khác sẽ là sử dụng mô-đun Devel :: Peek:
perl -MDevel :: Peek -e 'Dump (chr(0x100)) '
Điều đó hiển thị cờ "UTF8" trong FLAGS và cả hai byte UTF-8 và ký tự Unicode trong
"PV". Xem phần sau của tài liệu này thảo luận về "utf8 :: is_utf8 ()"
chức năng.
Nâng cao Chủ đề
· Tương đương chuỗi
Câu hỏi về sự tương đương của chuỗi hơi phức tạp trong Unicode: bạn làm gì
nghĩa là "bằng"?
("CHỮ HOA LATIN A CÓ ACUTE" có bằng "CHỮ HOA LATIN A" không?)
Câu trả lời ngắn gọn là theo mặc định Perl chỉ so sánh sự tương đương ("eq", "ne")
trên các điểm mã của các ký tự. Trong trường hợp trên, câu trả lời là không (vì 0x00C1
! = 0x0041). Nhưng đôi khi, bất kỳ CHỮ VỐN A nào của A nên được coi là bằng nhau, hoặc thậm chí
A của mọi trường hợp.
Câu trả lời dài là bạn cần xem xét việc chuẩn hóa ký tự và cách viết hoa
các vấn đề: xem Unicode :: Chuẩn hóa, Báo cáo kỹ thuật Unicode # 15, Chuẩn hóa Unicode
Các hình thứchttp://www.unicode.org/unicode/reports/tr15> và các phần về lập bản đồ trường hợp trong
tiêu chuẩn Unicodehttp://www.unicode.org>.
Kể từ Perl 5.8.0, trường hợp gấp "Đầy đủ" của Khay Ánh xạ / Đặc biệt is
được triển khai, nhưng lỗi vẫn còn trong "qr // i" với chúng, hầu hết được khắc phục trước 5.14 và
về cơ bản hoàn toàn bằng 5.18.
· Đối chiếu chuỗi
Mọi người thích thấy các chuỗi của họ được sắp xếp độc đáo - hoặc theo cách nói của Unicode, được đối chiếu.
Nhưng một lần nữa, bạn có nghĩa là gì khi đối chiếu?
("CHỮ VIẾT HOA LATIN A CÓ ACUTE" đứng trước hoặc sau "CHỮ VIẾT HOA LATIN A
CÓ CỎ "?)
Câu trả lời ngắn gọn là theo mặc định, Perl so sánh các chuỗi ("lt", "le", "cmp", "ge",
"gt") chỉ dựa trên điểm mã của các ký tự. Trong trường hợp trên, câu trả lời
là "sau", vì 0x00C1> 0x00C0.
Câu trả lời dài là "nó phụ thuộc", và một câu trả lời tốt không thể được đưa ra nếu không có
biết (ít nhất) bối cảnh ngôn ngữ. Xem Unicode :: Collate và Unicode
Đối chiếu Thuật toán <http://www.unicode.org/unicode/reports/tr10/>
hỗn hợp
· Phạm vi và lớp nhân vật
Phạm vi ký tự trong các lớp ký tự được đặt trong ngoặc biểu thức chính quy (ví dụ: "/ [az] /")
và trong toán tử "tr ///" (còn được gọi là "y ///") không nhận biết được Unicode một cách kỳ diệu.
Điều này có nghĩa là "[A-Za-z]" sẽ không bắt đầu có nghĩa kỳ diệu là "tất cả đều là bảng chữ cái
các chữ cái "(không có nghĩa là ngay cả đối với các ký tự 8 bit; đối với những ký tự đó, nếu bạn là
sử dụng ngôn ngữ (perllocale), sử dụng "/ [[: alpha:]] /"; và nếu không, hãy sử dụng 8-bit nhận biết
thuộc tính "\ p {alpha}").
Tất cả các thuộc tính bắt đầu bằng "\ p" (và nghịch đảo của nó "\ P") thực sự là ký tự
các lớp nhận biết Unicode. Có hàng chục người trong số họ, hãy xem perluniprops.
Bắt đầu từ v5.22, bạn có thể sử dụng điểm mã Unicode làm điểm cuối của
phạm vi ký tự mẫu biểu thức và phạm vi sẽ bao gồm tất cả mã Unicode
các điểm nằm giữa các điểm cuối đó, bao gồm cả.
qr / [\ N {U + 03] - \ N {U + 20}] / x
bao gồm các điểm mã "\ N {U + 03}", "\ N {U + 04}", ..., "\ N {U + 20}".
(Nó được lên kế hoạch để mở rộng hành vi này đến phạm vi trong "tr ///" trong Perl v5.24.)
· Chuyển đổi từ chuỗi thành số
Unicode xác định một số ký tự thập phân - và số - ngoài ký tự
từ 0 đến 9 quen thuộc, chẳng hạn như các chữ số Ả Rập và Ấn Độ. Perl không hỗ trợ chuỗi-
chuyển đổi sang số cho các chữ số khác ASCII 0 đến 9 (và ASCII "a" thành "f" cho
thập lục phân). Để nhận chuyển đổi an toàn từ bất kỳ chuỗi Unicode nào, hãy sử dụng "num ()"trong
Unicode :: UCD.
Câu hỏi Với câu trả lời
· Liệu kịch bản cũ của tôi có bị phá vỡ không?
Rất có thể là không. Trừ khi bạn đang tạo các ký tự Unicode bằng cách nào đó, cũ
hành vi cần được bảo tồn. Về hành vi duy nhất đã thay đổi và
có thể bắt đầu tạo Unicode là hành vi cũ của "chr ()" nơi cung cấp
đối số hơn 255 tạo ra một modulo ký tự 255. "chr(300) ", chẳng hạn, là
tương đương với "chr(45) "hoặc" - "(trong ASCII), bây giờ nó là CHỮ HOA VỐN LATIN I VỚI BREVE.
· Làm cách nào để làm cho tập lệnh của tôi hoạt động với Unicode?
Cần thực hiện rất ít công việc vì không có gì thay đổi cho đến khi bạn tạo Unicode
dữ liệu. Điều quan trọng nhất là nhận đầu vào dưới dạng Unicode; cho điều đó, hãy xem sớm hơn
Thảo luận I / O. Để nhận được hỗ trợ Unicode liền mạch đầy đủ, hãy thêm "tính năng sử dụng
'unicode_strings' "(hoặc" sử dụng 5.012 "trở lên) cho tập lệnh của bạn.
· Làm thế nào để tôi biết liệu chuỗi của tôi có trong Unicode hay không?
Bạn không cần phải quan tâm. Nhưng bạn có thể nếu Perl của bạn trước 5.14.0 hoặc bạn chưa
đã chỉ định "sử dụng tính năng 'unicode_strings'" hoặc "sử dụng 5.012" (hoặc cao hơn) vì nếu không
các quy tắc cho các điểm mã trong phạm vi 128 đến 255 là khác nhau tùy thuộc vào
liệu chuỗi chúng được chứa bên trong có phải là Unicode hay không. (Xem "Khi Unicode
Không xảy ra "trong perlunicode.)
Để xác định xem một chuỗi có phải là Unicode hay không, hãy sử dụng:
print utf8 :: is_utf8 ($ string)? 1: 0, "\ n";
Nhưng lưu ý rằng điều này không có nghĩa là bất kỳ ký tự nào trong chuỗi là cần thiết
Được mã hóa UTF-8 hoặc bất kỳ ký tự nào có điểm mã lớn hơn 0xFF (255)
hoặc thậm chí 0x80 (128), hoặc chuỗi có bất kỳ ký tự nào. Tất cả "is_utf8 ()"
là trả về giá trị của cờ "utf8ness" bên trong được gắn vào chuỗi $.
Nếu cờ tắt, các byte trong đại lượng vô hướng được hiểu là một mã hóa byte đơn.
Nếu cờ được bật, các byte trong đại lượng vô hướng được hiểu là (chiều dài thay đổi,
có thể là nhiều byte) điểm mã được mã hóa UTF-8 của các ký tự. Các byte đã được thêm vào một
Chuỗi mã hóa UTF-8 được tự động nâng cấp lên UTF-8. Nếu hỗn hợp không phải UTF-8 và
Các đại lượng vô hướng UTF-8 được hợp nhất (phép nội suy dấu ngoặc kép, phép nối rõ ràng hoặc
thay thế tham số printf / sprintf), kết quả sẽ được mã hóa UTF-8 như thể các bản sao
của chuỗi byte đã được nâng cấp lên UTF-8: ví dụ:
$ a = "ab \ x80c";
$ b = "\ x {100}";
print "$ a = $ b \ n";
chuỗi đầu ra sẽ được mã hóa UTF-8 "ab \ x80c = \ x {100} \ n", nhưng $ a sẽ là byte-
được mã hóa.
Đôi khi bạn có thể thực sự cần biết độ dài byte của một chuỗi thay vì
độ dài ký tự. Đối với điều đó, hãy sử dụng hàm "Encode :: encode_utf8 ()" hoặc
"byte" pragma và hàm "length ()":
$ unicode của tôi = chr(0x100);
chiều dài in ($ unicode), "\ n"; # sẽ in 1
yêu cầu Mã hóa;
độ dài in (Encode :: encode_utf8 ($ unicode)), "\ n"; # sẽ in 2
sử dụng byte;
chiều dài in ($ unicode), "\ n"; # cũng sẽ in 2
# (0xC4 0x80 của UTF-8)
không có byte;
· Làm cách nào để biết được mã hóa tệp có chức năng gì?
Bạn có thể thử Encode :: Guess, nhưng nó có một số hạn chế.
· Làm cách nào để phát hiện dữ liệu không hợp lệ trong một mã hóa cụ thể?
Sử dụng gói "Mã hóa" để thử chuyển đổi nó. Ví dụ,
sử dụng Mã hóa 'decode_utf8';
if (eval {decode_utf8 ($ string, Encode :: FB_CROAK); 1}) {
# $ string là utf8 hợp lệ
} Else {
# $ string không hợp lệ utf8
}
Hoặc sử dụng "giải nén" để thử giải mã nó:
cảnh báo sử dụng;
@chars = unpack ("C0U *", $ string_of_bytes_that_I_think_is_utf8);
Nếu không hợp lệ, cảnh báo "Ký tự UTF-8 không đúng định dạng" sẽ được tạo ra. Quá trình "C0" có nghĩa là "
ký tự chuỗi trên mỗi ký tự ". Nếu không có điều đó," giải nén ("U *", ...) "sẽ hoạt động
ở chế độ "U0" (mặc định nếu chuỗi định dạng bắt đầu bằng "U") và nó sẽ trả về
các byte tạo nên mã hóa UTF-8 của chuỗi đích, một cái gì đó sẽ
luôn luôn làm việc.
· Làm cách nào để tôi chuyển đổi dữ liệu nhị phân thành một dạng mã hóa cụ thể, hoặc phiên bản khác?
Điều này có lẽ không hữu ích như bạn nghĩ. Thông thường, bạn không cần phải làm như vậy.
Theo một nghĩa nào đó, những gì bạn đang hỏi không có nhiều ý nghĩa: mã hóa dành cho
ký tự và dữ liệu nhị phân không phải là "ký tự", vì vậy việc chuyển đổi "dữ liệu" thành một số
mã hóa không có ý nghĩa trừ khi bạn biết bộ ký tự nào và mã hóa
dữ liệu nhị phân đang ở, trong trường hợp đó nó không chỉ là dữ liệu nhị phân, bây giờ là nó?
Nếu bạn có một chuỗi byte thô mà bạn biết, bạn nên giải thích thông qua
mã hóa cụ thể, bạn có thể sử dụng "Mã hóa":
sử dụng Mã hóa 'from_to';
from_to ($ data, "iso-8859-1", "utf-8"); # từ latin-1 đến utf-8
Lệnh gọi tới "from_to ()" thay đổi các byte trong $ data, nhưng không có ý nghĩa gì về
bản chất của chuỗi đã thay đổi theo Perl. Cả trước và sau
lệnh gọi, chuỗi $ data chỉ chứa một loạt byte 8 bit. Theo như Perl là
có liên quan, mã hóa của chuỗi vẫn là "byte 8-bit gốc hệ thống".
Bạn có thể liên hệ điều này với một mô-đun 'Dịch' hư cấu:
Dùng dịch thuật;
$ cụm từ của tôi = "Có";
Dịch :: from_to ($ cụm từ, 'tiếng anh', 'deutsch');
## cụm từ hiện chứa "Ja"
Nội dung của chuỗi thay đổi, nhưng không thay đổi bản chất của chuỗi. Perl không
biết thêm bất kỳ điều gì sau cuộc gọi so với trước đó rằng nội dung của chuỗi cho biết
khẳng định.
Quay lại việc chuyển đổi dữ liệu. Nếu bạn có (hoặc muốn) dữ liệu trong 8-bit gốc của hệ thống
mã hóa (ví dụ: Latin-1, EBCDIC, v.v.), bạn có thể sử dụng gói / giải nén để chuyển đổi sang / từ
Bảng mã Unicode.
$ native_string = pack ("W *", unpack ("U *", $ Unicode_string));
$ Unicode_string = pack ("U *", unpack ("W *", $ native_string));
Nếu bạn có một chuỗi byte bạn Biết là UTF-8 hợp lệ, nhưng Perl chưa biết điều đó,
bạn cũng có thể khiến Perl trở thành một người tin tưởng:
sử dụng Mã hóa 'decode_utf8';
$ Unicode = decode_utf8 ($ byte);
hoặc:
$ Unicode = pack ("U0a *", $ byte);
Bạn có thể tìm các byte tạo nên chuỗi UTF-8 với
@bytes = unpack ("C *", $ Unicode_string)
và bạn có thể tạo Unicode định dạng tốt với
$ Unicode_string = pack ("U *", 0xff, ...)
· Làm cách nào để hiển thị Unicode? Làm cách nào để nhập mã Unicode?
Nhìn thấyhttp://www.alanwood.net/unicode/> và
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
· Unicode hoạt động như thế nào với các ngôn ngữ truyền thống?
Nếu ngôn ngữ của bạn là ngôn ngữ UTF-8, bắt đầu từ Perl v5.20, Perl hoạt động tốt cho tất cả
các danh mục ngoại trừ "LC_COLLATE" xử lý việc sắp xếp và toán tử "cmp".
Đối với các ngôn ngữ khác, bắt đầu từ Perl 5.16, bạn có thể chỉ định
sử dụng ngôn ngữ ': not_characters';
để Perl làm việc tốt với họ. Điều bắt buộc là bạn phải dịch từ
ký tự ngôn ngữ tự đặt thành / từ Unicode. Xem "Unicode I / O" ở trên để biết cách
sử dụng open ': locale';
để thực hiện điều này, nhưng thông tin chi tiết đầy đủ có trong "Unicode và UTF-8" ở ngôn ngữ perllocale,
bao gồm các lỗi xảy ra nếu bạn không chỉ định ": not_characters".
Hexadecimal ký hiệu
Tiêu chuẩn Unicode thích sử dụng ký hiệu thập lục phân vì điều đó thể hiện rõ ràng hơn
sự phân chia Unicode thành các khối 256 ký tự. Hệ thập lục phân cũng đơn giản là ngắn hơn
hơn số thập phân. Bạn cũng có thể sử dụng ký hiệu thập phân, nhưng chỉ cần học cách sử dụng hệ thập lục phân
làm cho cuộc sống dễ dàng hơn với tiêu chuẩn Unicode. Ký hiệu "U + HHHH" sử dụng hệ thập lục phân, cho
thí dụ.
Tiền tố "0x" có nghĩa là một số thập lục phân, các chữ số là 0-9 và af (hoặc AF, trường hợp
không thành vấn đề). Mỗi chữ số thập lục phân đại diện cho bốn bit hoặc nửa byte. "in
0x ..., "\ n" "sẽ hiển thị một số thập lục phân ở dạng thập phân và" printf "% x \ n", $ decimal "sẽ
hiển thị một số thập phân trong hệ thập lục phân. Nếu bạn chỉ có "chữ số hex" của hệ thập lục phân
số, bạn có thể sử dụng hàm "hex ()".
in 0x0009, "\ n"; # 9
in 0x000a, "\ n"; # 10
in 0x000f, "\ n"; # 15
in 0x0010, "\ n"; # 16
in 0x0011, "\ n"; # 17
in 0x0100, "\ n"; # 256
in 0x0041, "\ n"; # 65
printf "% x \ n", 65; # 41
printf "% # x \ n", 65; # 0x41
print hex ("41"), "\ n"; # 65
Xa hơn Trung Tâm Tài Liệu
· Hiệp hội Unicode
<http://www.unicode.org/>
· Câu hỏi thường gặp về Unicode
<http://www.unicode.org/unicode/faq/>
· Bảng chú giải thuật ngữ Unicode
<http://www.unicode.org/glossary/>
· Danh sách đọc đề xuất Unicode
Unicode Consortium có một danh sách các bài báo và sách, một số trong số đó cung cấp nhiều
điều trị sâu hơn về Unicode:http://unicode.org/resources/readinglist.html>
· Tài nguyên hữu ích Unicode
<http://www.unicode.org/unicode/onlinedat/resources.html>
· Hỗ trợ Unicode và đa ngôn ngữ trong HTML, Phông chữ, Trình duyệt web và các ứng dụng khác
<http://www.alanwood.net/unicode/>
· Câu hỏi thường gặp về UTF-8 và Unicode cho Unix / Linux
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
· Bộ ký tự kế thừa
<http://www.czyborra.com/>http://www.eki.ee/letter/>
· Bạn có thể khám phá các thông tin khác nhau từ các tệp dữ liệu Unicode bằng cách sử dụng
Mô-đun "Unicode :: UCD".
Unicode IN LỚN HƠN PERLS
Nếu bạn không thể nâng cấp Perl của mình lên 5.8.0 trở lên, bạn vẫn có thể thực hiện một số mã Unicode
xử lý bằng cách sử dụng các mô-đun "Unicode :: String", "Unicode :: Map8" và "Unicode :: Map",
có sẵn từ CPAN. Nếu bạn đã cài đặt mã tái lập GNU, bạn cũng có thể sử dụng Perl
front-end "Convert :: Recode" để chuyển đổi ký tự.
Sau đây là các chuyển đổi nhanh từ byte ISO 8859-1 (Latin-1) sang byte UTF-8 và
trở lại, mã hoạt động ngay cả với các phiên bản Perl 5 cũ hơn.
# ISO 8859-1 đến UTF-8
s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg;
# UTF-8 đến ISO 8859-1
s/([\xC2\xC3])([\x80-\xBF])/chr(ord($1)<<6&0xC0|ord($2)&0x3F)/eg;
Sử dụng perluniintro trực tuyến bằng các dịch vụ onworks.net