Đây là lệnh perlunicode có thể được 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
perlunicode - Hỗ trợ Unicode trong Perl
MÔ TẢ
Nếu bạn chưa đọc, trước khi đọc tài liệu này, bạn nên làm quen với cả hai
perlunitut và perluniintro.
Unicode nhằm mục đích UNI-fy các en-MÃ-của tất cả các ký tự trên thế giới tập hợp thành một
Tiêu chuẩn. Đối với khá nhiều tiêu chuẩn mã hóa khác nhau tồn tại khi Unicode
lần đầu tiên được tạo, chuyển đổi từ mỗi mã sang Unicode về cơ bản có nghĩa là thêm một hằng số vào mỗi
điểm mã trong tiêu chuẩn ban đầu và chuyển đổi trở lại chỉ có nghĩa là trừ đi
hằng số. Đối với ASCII và ISO-8859-1, hằng số là 0. Đối với ISO-8859-5, (Cyrillic)
hằng số là 864; đối với tiếng Do Thái (ISO-8859-8), là 1488; Tiếng Thái (ISO-8859-11), 3424; và vì thế
ra ngoài. Điều này giúp dễ dàng thực hiện chuyển đổi và tạo điều kiện thuận lợi cho việc áp dụng Unicode.
Va no đa hoạt động; ngày nay, những tiêu chuẩn kế thừa đó hiếm khi được sử dụng. Hầu hết mọi người đều sử dụng
Bảng mã Unicode.
Unicode là một tiêu chuẩn toàn diện. Nó chỉ định nhiều thứ bên ngoài phạm vi của Perl,
chẳng hạn như cách hiển thị chuỗi ký tự. Để có một cuộc thảo luận đầy đủ về tất cả các khía cạnh của
Unicode, xemhttp://www.unicode.org>.
Quan trọng Hãy cẩn thận
Mặc dù một số phần này có thể bạn không hiểu khi đọc lần đầu, chúng tôi
nghĩ rằng nó đủ quan trọng để làm nổi bật một số vấn đề trước khi nghiên cứu sâu hơn, vì vậy
đây:
Hỗ trợ Unicode là một yêu cầu rộng rãi. Trong khi Perl không triển khai Unicode
tiêu chuẩn hoặc các báo cáo kỹ thuật kèm theo từ đầu đến cuối, Perl không hỗ trợ nhiều
Các tính năng của Unicode.
Ngoài ra, việc sử dụng Unicode có thể gây ra các vấn đề bảo mật không rõ ràng. Đọc Unicode
Cân nhắc về Bảo mậthttp://www.unicode.org/reports/tr36>.
An toàn nhất nếu bạn "sử dụng tính năng 'unicode_strings'"
Để duy trì khả năng tương thích ngược, Perl không bật nội bộ đầy đủ
Hỗ trợ Unicode trừ khi pragma "sử dụng tính năng 'unicode_strings'" được chỉ định. (Điều này
được chọn tự động nếu bạn "sử dụng 5.012" trở lên.) Không thực hiện được điều này có thể
kích hoạt những bất ngờ bất ngờ. Xem "" Lỗi Unicode "" bên dưới.
Pragma này không ảnh hưởng đến I / O. Nó cũng không thay đổi đại diện nội bộ của
chuỗi, chỉ diễn giải của họ. Vẫn còn một số nơi Unicode
không được hỗ trợ đầy đủ, chẳng hạn như trong tên tệp.
Các lớp đầu vào và đầu ra
Sử dụng lớp ": encoding (...)" để đọc và ghi vào các tệp xử lý bằng cách sử dụng
mã hóa được chỉ định. (Xem mở.)
Bạn nên chuyển đổi các tập lệnh Perl không phải ASCII, không phải UTF-8 của mình thành UTF-8.
Xem mã hóa.
vẫn cần "sử dụng utf8" để bật UTF-8 trong các tập lệnh
Nếu bản thân tập lệnh Perl của bạn được mã hóa bằng UTF-8, thì pragma "sử dụng utf8" phải là
được bao gồm một cách rõ ràng để cho phép nhận dạng điều đó (trong chuỗi hoặc biểu thức chính quy
nghĩa đen, hoặc trong tên định danh). T is các có thể thời gian khi nào an rõ ràng "sử dụng utf8 "
is cần thiết. (Xem utf8).
Các tập lệnh được đánh dấu "BOM" và tập lệnh UTF-16 được tự động phát hiện
Tuy nhiên, nếu một tập lệnh Perl bắt đầu bằng Unicode "BOM" (UTF-16LE, UTF16-BE, hoặc
UTF-8), hoặc nếu tập lệnh trông giống như UTF-16 được đánh dấu không phải là "BOM" của một trong hai nội dung, Perl
sẽ đọc chính xác trong tập lệnh dưới dạng bảng mã Unicode thích hợp. ("BOM"-không có
UTF-8 không thể được công nhận hoặc phân biệt một cách hiệu quả với ISO 8859-1 hoặc các tiêu chuẩn khác
mã hóa tám bit.)
byte và Nhân vật Ngữ nghĩa
Trước Unicode, hầu hết các bảng mã đều sử dụng 8 bit (một byte đơn) để mã hóa từng ký tự. Như vậy
một ký tự là một byte và một byte là một ký tự và chỉ có thể có 256 hoặc ít hơn
các ký tự có thể. "Ngữ nghĩa Byte" trong tiêu đề của phần này đề cập đến điều này
hành vi. Không cần phải phân biệt giữa "Byte" và "Character".
Sau đó, Unicode có chỗ cho hơn một triệu ký tự (và Perl cho phép
thậm chí nhiều hơn). Điều này có nghĩa là một ký tự có thể yêu cầu nhiều hơn một byte đơn để đại diện
nó, và do đó hai thuật ngữ không còn tương đương nữa. Vấn đề là các nhân vật như thế nào
toàn bộ thực thể, và thường không phải là các byte bao gồm chúng. Đó là những gì thuật ngữ
"Ngữ nghĩa ký tự" trong tiêu đề của phần này đề cập đến.
Perl đã phải thay đổi nội bộ để tách "byte" khỏi "ký tự". Điều quan trọng đó là
bạn cũng thay đổi ý tưởng của mình, nếu bạn chưa thay đổi, vì vậy "byte" và "ký tự" không
còn có nghĩa là điều tương tự trong tâm trí của bạn.
Khối xây dựng cơ bản của chuỗi Perl luôn là một "ký tự". Những thay đổi
về cơ bản, việc triển khai không còn nghĩ rằng một nhân vật luôn luôn
chỉ một byte duy nhất.
Có nhiều điều cần lưu ý:
· Các chức năng xử lý chuỗi, đối với hầu hết các phần, tiếp tục hoạt động về mặt
nhân vật. "length ()", chẳng hạn, trả về số ký tự trong một chuỗi,
giống như trước đây. Nhưng số đó không còn nhất thiết phải giống với số
byte trong chuỗi (có thể có nhiều byte hơn ký tự). Khác như vậy
các hàm bao gồm "chop ()", "chomp ()", "substr ()", "pos ()", "index ()", "rindex ()",
"sort ()", "sprintf ()" và "write ()".
Các trường hợp ngoại lệ là:
· "Vec" hướng bit
· Định dạng "pack" / "unpack" "C" theo định hướng byte
Tuy nhiên, từ chỉ định "W" hoạt động trên toàn bộ các ký tự, cũng như ký tự "U"
người chỉ định.
· Một số nhà khai thác tương tác với hệ điều hành của nền tảng
Các toán tử xử lý tên tệp là ví dụ.
· Khi các hàm được gọi từ trong phạm vi của pragma "use byte"
Có thể, bạn chỉ nên sử dụng cái này để gỡ lỗi.
· Chuỗi - bao gồm các khóa băm - và các mẫu biểu thức chính quy có thể chứa các ký tự
có giá trị thứ tự lớn hơn 255.
Nếu bạn sử dụng trình soạn thảo Unicode để chỉnh sửa chương trình của mình, các ký tự Unicode có thể xảy ra
trực tiếp trong các chuỗi ký tự trong mã hóa UTF-8 hoặc UTF-16. (Trước đây
yêu cầu "BOM" hoặc "sử dụng utf8", cái sau yêu cầu "BOM".)
"Tạo Unicode" trong perluniintro cung cấp các cách khác để đặt các ký tự không phải ASCII vào
chuỗi của bạn.
· Các hàm "chr ()" và "ord ()" hoạt động trên các ký tự nguyên.
· Biểu thức chính quy khớp với toàn bộ ký tự. Ví dụ, "." phù hợp với toàn bộ
ký tự thay vì chỉ một byte duy nhất.
· Toán tử "tr ///" dịch toàn bộ các ký tự. (Lưu ý rằng "tr /// CU"
chức năng đã bị loại bỏ. Để biết chức năng tương tự như vậy, hãy xem "pack ('U0',
...) "và" pack ('C0', ...) ").
· "Đảo ngược vô hướng ()" đảo ngược theo ký tự thay vì theo byte.
· Các toán tử chuỗi bit, "& | ^ ~" và (bắt đầu từ v5.22) "&. |. ^. ~." có thể hoạt động
trên các ký tự không vừa với một byte. Tuy nhiên, hành vi hiện tại có thể
biến đổi. Bạn không nên sử dụng các toán tử này trên các chuỗi được mã hóa bằng UTF-8. Nếu như
bạn không chắc chắn về mã hóa của một chuỗi, hãy hạ cấp nó xuống trước khi sử dụng bất kỳ
các nhà khai thác; bạn có thể sử dụng "utf8 :: utf8_downgrade ()".
Điểm mấu chốt là Perl đã luôn thực hành "Ngữ nghĩa ký tự", nhưng với
sự ra đời của Unicode, hiện đã khác với "Ngữ nghĩa Byte".
ASCII Nội quy so với Unicode Nội quy
Trước Unicode, khi một ký tự là một byte là một ký tự, Perl chỉ biết về 128
ký tự được xác định bởi ASCII, mã điểm từ 0 đến 127 (ngoại trừ trong "sử dụng ngôn ngữ").
Điều đó khiến mã có điểm 128 đến 255 là chưa được gán và có sẵn cho bất kỳ mục đích sử dụng nào
chương trình có thể muốn. Ngữ nghĩa duy nhất mà chúng có là số thứ tự của chúng và chúng
là thành viên không thuộc lớp ký tự không phủ định nào. Không có gì được coi là phù hợp
"\ w" chẳng hạn, nhưng tất cả đều khớp với "\ W".
Tất nhiên, Unicode gán cho mỗi mã đó điểm một ý nghĩa cụ thể (cùng với
những người trên 255). Để duy trì khả năng tương thích ngược, Perl chỉ sử dụng các ý nghĩa Unicode
khi có một số dấu hiệu cho thấy Unicode là những gì được dự định; nếu không thì không phải ASCII
các điểm mã vẫn được coi như chưa được gán.
Dưới đây là những cách mà Perl biết rằng một chuỗi phải được coi là Unicode:
· Trong phạm vi "sử dụng utf8"
Nếu toàn bộ chương trình là Unicode (được ký hiệu bằng cách sử dụng 8-bit Umật mã Tthông tin
Format), thì tất cả các chuỗi bên trong nó phải là Unicode.
· Trong phạm vi "sử dụng tính năng 'unicode_strings'"
Pragma này được tạo ra để bạn có thể nói rõ ràng với Perl rằng các hoạt động được thực thi
trong phạm vi của nó là sử dụng các quy tắc Unicode. Nhiều hoạt động hơn bị ảnh hưởng với mới hơn
niềm vui. Xem "" Lỗi Unicode "".
· Trong phạm vi "sử dụng 5.012" hoặc cao hơn
Điều này hoàn toàn bật "sử dụng tính năng 'unicode_strings'".
· Trong phạm vi "sử dụng ngôn ngữ 'not_characters'", hoặc "sử dụng ngôn ngữ" và hiện tại
ngôn ngữ là một ngôn ngữ UTF-8.
Trước đây được định nghĩa để ngụ ý xử lý Unicode; và cái sau chỉ ra một mã Unicode
ngôn ngữ, do đó, một giải thích Unicode của tất cả các chuỗi bên trong nó.
· Khi chuỗi chứa một điểm mã chỉ Unicode
Perl chưa bao giờ chấp nhận các điểm mã trên 255 nếu không có mã Unicode, vì vậy việc sử dụng
ngụ ý Unicode cho toàn bộ chuỗi.
· Khi chuỗi chứa điểm mã Unicode có tên "\ N {...}"
Cấu trúc "\ N {...}" đề cập đến một điểm mã Unicode một cách rõ ràng, ngay cả khi nó là một
đó cũng là trong ASCII. Do đó chuỗi chứa nó phải là Unicode.
· Khi chuỗi đến từ một nguồn bên ngoài được đánh dấu là Unicode
Tùy chọn dòng lệnh "-C" có thể chỉ định rằng một số đầu vào nhất định cho chương trình là
Unicode và các giá trị của mã này có thể được đọc bằng mã Perl của bạn, hãy xem "$ {^ UNICODE}" trong
perlvar.
· Khi chuỗi đã được nâng cấp lên UTF-8
Hàm "utf8 :: utf8_upgrade ()" có thể được sử dụng vĩnh viễn một cách rõ ràng (trừ khi
tiếp theo "utf8 :: utf8_downgrade ()" được gọi) khiến một chuỗi được coi là
Bảng mã Unicode.
· Có các phương thức bổ sung cho các mẫu biểu thức chính quy
Mẫu được biên dịch với bổ ngữ "/ u" hoặc "/ a" được coi là Unicode
(mặc dù có một số hạn chế với "/ a"). Dưới bổ ngữ "/ d" và "/ l",
có một số dấu hiệu khác cho Unicode; xem "Công cụ sửa đổi bộ ký tự" trong
xin lỗi.
Lưu ý rằng tất cả những điều trên đều bị ghi đè trong phạm vi "byte sử dụng"; nhưng bạn nên
đang sử dụng pragma này chỉ để gỡ lỗi.
Cũng lưu ý rằng một số tương tác với hệ điều hành của nền tảng không bao giờ sử dụng Unicode
quy tắc.
Khi các quy tắc Unicode có hiệu lực:
· Các toán tử dịch trường hợp sử dụng các bảng dịch trường hợp Unicode.
Lưu ý rằng "uc ()" hoặc "\ U" trong chuỗi nội suy, dịch sang chữ hoa, trong khi
"ucfirst" hoặc "\ u" trong các chuỗi được nội suy, dịch sang chữ hoa tiêu đề bằng các ngôn ngữ
phân biệt (tương đương với chữ hoa trong các ngôn ngữ không có
phân biệt).
Có một mô-đun CPAN, "Unicode :: Casing", cho phép bạn xác định
ánh xạ được sử dụng trong "lc ()", "lcfirst ()", "uc ()", "ucfirst ()" và "fc" (hoặc
các phiên bản nội dòng chuỗi được trích dẫn kép chẳng hạn như "\ U"). (Trước Perl 5.16, điều này
chức năng đã được cung cấp một phần trong lõi Perl, nhưng bị một số
những nhược điểm không thể vượt qua, vì vậy mô-đun CPAN đã được viết để thay thế.)
· Các lớp ký tự trong biểu thức chính quy khớp với nhau dựa trên các thuộc tính của ký tự
được chỉ định trong cơ sở dữ liệu thuộc tính Unicode.
Ví dụ: "\ w" có thể được sử dụng để khớp với một lý tưởng của Nhật Bản; và "[[: digit:]]" a
Số tiếng Bengali.
· Có thể sử dụng các thuộc tính, tập lệnh và phạm vi khối Unicode được đặt tên (như được đặt trong ngoặc
các lớp ký tự) bằng cách sử dụng cấu trúc "\ p {}" "đối sánh thuộc tính" và "\ P {}"
phủ định, "không khớp với thuộc tính".
Xem "Thuộc tính ký tự Unicode" để biết thêm chi tiết.
Bạn có thể xác định các thuộc tính ký tự của riêng mình và sử dụng chúng trong biểu thức chính quy
với cấu trúc "\ p {}" hoặc "\ P {}". Xem "Thuộc tính ký tự do người dùng xác định" để biết thêm
chi tiết.
Mở rộng đồ thị Cụm (Hợp lý nhân vật)
Xem xét một ký tự, nói "H". Nó có thể xuất hiện với nhiều dấu hiệu khác nhau xung quanh nó, chẳng hạn như một
dấu sắc, hoặc dấu ngoặc kép, hoặc các dấu móc, vòng tròn, mũi tên, và vv, trên, dưới, để
bên này hay bên kia, vv. Có rất nhiều khả năng trong số các ngôn ngữ trên thế giới.
Số lượng kết hợp là thiên văn và nếu có một ký tự cho mỗi
kết hợp, nó sẽ sớm làm cạn kiệt hơn một triệu ký tự có thể có của Unicode. Cho nên
Unicode thực hiện một cách tiếp cận khác: có một ký tự cho cơ sở là "H" và một ký tự
cho mỗi điểm có thể có và chúng có thể được kết hợp khác nhau để có được một lôgic cuối cùng
tính cách. Vì vậy, một ký tự logic - những gì dường như là một ký tự duy nhất - có thể là một
chuỗi nhiều hơn một ký tự riêng lẻ. Chuẩn Unicode gọi những
"cụm grapheme mở rộng" (là phiên bản cải tiến của cụm từ không còn được sử dụng nhiều nữa
"cụm grapheme"); Perl cung cấp cấu trúc biểu thức chính quy "\ X" để khớp với
trình tự trong toàn bộ của chúng.
Nhưng mục đích của Unicode là thống nhất các tiêu chuẩn và thực hành bộ ký tự hiện có, và
một số tiêu chuẩn tồn tại từ trước có các ký tự đơn có nghĩa giống như một số
những kết hợp này, như ISO-8859-1, có khá nhiều trong số chúng. Ví dụ: "LATIN
CHỮ HOA E CÓ ACUTE "đã có trong tiêu chuẩn này khi Unicode ra đời.
Do đó, Unicode đã thêm nó vào danh mục của nó dưới dạng ký tự đơn đó. Nhưng nhân vật này
được Unicode coi là tương đương với dãy bao gồm ký tự
"CHỮ VIẾT HOA LATIN E" theo sau là ký tự "KẾT HỢP TÍCH CỰC CHÍNH XÁC".
"CHỮ VIẾT HOA LATIN E CÓ ACUTE" được gọi là ký tự "soạn trước" và
tương đương với "E" và trình tự "COMBINING ACCENT" được gọi là chuẩn
sự tương đương. Tất cả các ký tự được soạn trước được cho là có sự phân hủy (thành
trình tự tương đương), và kiểu phân hủy còn được gọi là chính tắc. Một chuỗi có thể
được bao gồm nhiều nhất có thể của các ký tự được tạo sẵn, hoặc nó có thể bao gồm
các ký tự bị phân hủy hoàn toàn. Unicode gọi chúng tương ứng là "Dạng chuẩn hóa
Đã sáng tác "(NFC) và" Dạng chuẩn hóa được phân rã ". Mô-đun" Unicode :: Chuẩn hóa "
chứa các hàm chuyển đổi giữa hai. Một chuỗi cũng có thể có cả hai thành phần
ký tự và ký tự phân rã; mô-đun này có thể được sử dụng để biến tất cả thành một hoặc
khác
Bạn có thể được trình bày với các chuỗi ở bất kỳ dạng nào trong số các hình thức tương đương này. Hiện tại có
không có gì trong Perl 5 mà bỏ qua sự khác biệt. Vì vậy, bạn sẽ phải đặc biệt hanlde nó.
Lời khuyên thông thường là chuyển đổi đầu vào của bạn thành "NFD" trước khi xử lý thêm.
Để biết thêm thông tin chi tiết, hãy xemhttp://unicode.org/reports/tr15/>.
Unicode Nhân vật Bất động sản
(Lần duy nhất Perl coi một chuỗi các điểm mã riêng lẻ là một
ký tự lôgic nằm trong cấu trúc "\ X", đã được đề cập ở trên. Vì vậy
"ký tự" trong cuộc thảo luận này có nghĩa là một điểm mã Unicode.)
Gần như tất cả các thuộc tính ký tự Unicode đều có thể truy cập được thông qua các biểu thức chính quy bằng
sử dụng cấu trúc "\ p {}" "đối sánh thuộc tính" và "\ P {}" "không đối sánh thuộc tính" cho
sự phủ định của nó.
Ví dụ: "\ p {Chữ hoa}" khớp với bất kỳ ký tự đơn nào có "Chữ hoa" Unicode
thuộc tính, trong khi "\ p {L}" khớp với bất kỳ ký tự nào với "General_Category" là "L" (chữ cái)
thuộc tính (xem "General_Category" bên dưới). Dấu ngoặc đơn không bắt buộc đối với một chữ cái
tên thuộc tính, vì vậy "\ p {L}" tương đương với "\ pL".
Chính thức hơn, "\ p {Chữ hoa}" khớp với bất kỳ ký tự đơn nào có Unicode "Chữ hoa"
giá trị thuộc tính là "Đúng" và "\ P {Chữ hoa}" khớp với bất kỳ ký tự nào có "Chữ hoa"
giá trị thuộc tính là "False" và chúng có thể được viết là "\ p {Uppercase = True}" và
"\ p {Chữ hoa = Sai}", tương ứng.
Hình thức này là cần thiết khi các thuộc tính không phải là hệ nhị phân; nghĩa là, nếu họ có thể tiếp nhận nhiều hơn
giá trị hơn là chỉ "Đúng" và "Sai". Ví dụ: thuộc tính "Bidi_Class" (xem
"Các loại ký tự hai chiều" bên dưới), có thể nhận một số giá trị khác nhau, chẳng hạn như
"Left", "Right", "Whitespace" và những thứ khác. Để phù hợp với những điều này, người ta cần chỉ định cả hai
tên thuộc tính ("Bidi_Class") VÀ giá trị được so khớp với ("Left", "Right", và vv).
Điều này được thực hiện, như trong các ví dụ trên, bằng cách đặt hai thành phần được phân tách bằng dấu
dấu (hoặc thay thế cho nhau, dấu hai chấm), như "\ p {Bidi_Class: Left}".
Tất cả các thuộc tính ký tự do Unicode định nghĩa có thể được viết bằng các dạng kết hợp này của
"\P{property = value} " hoặc "\ p {giá trị tài sản}", nhưng Perl cung cấp một số thuộc tính bổ sung
chỉ được viết ở dạng duy nhất, cũng như các phím tắt dạng đơn cho tất cả các mã nhị phân
thuộc tính và một số thuộc tính khác được mô tả bên dưới, trong đó bạn có thể bỏ qua tên thuộc tính và
dấu bằng hoặc dấu hai chấm.
Hầu hết các thuộc tính ký tự Unicode có ít nhất hai từ đồng nghĩa (hoặc bí danh nếu bạn thích): a
cái ngắn dễ nhập hơn và cái dài hơn dễ mô tả hơn và do đó
Dễ hiểu. Do đó các thuộc tính "L" và "Letter" ở trên là tương đương và có thể
được sử dụng thay thế cho nhau. Tương tự như vậy, "Upper" là từ đồng nghĩa với "Uppercase" và chúng ta có thể
đã viết "\ p {Chữ hoa}" tương đương với "\ p {Chữ hoa}". Ngoài ra, thường có
các từ đồng nghĩa khác nhau cho các giá trị mà thuộc tính có thể có. Đối với thuộc tính nhị phân, "True" có 3
từ đồng nghĩa: "T", "Yes", và "Y"; và "False" có tương ứng là "F", "No" và "N". Nhưng được
cẩn thận. Một dạng ngắn gọn của một giá trị cho một thuộc tính có thể không cùng nghĩa với cùng một giá trị
dạng viết tắt của cái khác. Do đó, đối với thuộc tính "General_Category", "L" có nghĩa là "Chữ cái",
nhưng đối với thuộc tính "Bidi_Class", "L" có nghĩa là "Trái". Một danh sách đầy đủ các thuộc tính và
từ đồng nghĩa trong perluniprops.
Sự khác biệt về chữ hoa / chữ thường trong tên và giá trị thuộc tính là không liên quan; do đó "\ p {Upper}"
có nghĩa giống như "\ p {upper}" hoặc thậm chí là "\ p {UpPeR}". Tương tự, bạn có thể thêm hoặc
trừ các dấu gạch dưới ở bất kỳ vị trí nào ở giữa một từ, để các dấu này cũng tương đương
tới "\ p {U_p_p_e_r}". Và khoảng trắng không liên quan tiếp giáp với các ký tự không phải từ, chẳng hạn như
dưới dạng dấu ngoặc nhọn và dấu bằng hoặc dấu hai chấm, vì vậy "\ p {Upper}" và "\ p {Upper_case
: Y} "cũng tương đương với những điều này. Trên thực tế, khoảng trắng và thậm chí cả dấu gạch ngang thường có thể
được thêm hoặc xóa ở bất cứ đâu. Vì vậy, ngay cả "\ p {Up-per case = Yes}" cũng tương đương. Tất cả điều này
được Unicode gọi là "khớp lỏng". Một số nơi sử dụng đối sánh chặt chẽ hơn
ở giữa các số và trong thuộc tính phần mở rộng Perl bắt đầu hoặc kết thúc bằng
gạch dưới. Đối sánh chặt chẽ hơn quan tâm đến khoảng trắng (ngoại trừ tiếp giáp với không phải từ
ký tự), dấu gạch nối và dấu gạch dưới không bên trong.
Bạn cũng có thể sử dụng phủ định trong cả "\ p {}" và "\ P {}" bằng cách giới thiệu dấu mũ ("^") giữa
dấu ngoặc nhọn đầu tiên và tên thuộc tính: "\ p {^ Tamil}" bằng "\ P {Tamil}".
Hầu hết tất cả các thuộc tính đều miễn nhiễm với kết hợp không phân biệt chữ hoa chữ thường. Đó là, thêm một "/ i"
công cụ sửa đổi biểu thức chính quy không thay đổi những gì chúng khớp với nhau. Có hai bộ được
bị ảnh hưởng. Tập hợp đầu tiên là "Uppercase_Letter", "Lowercase_Letter" và
"Titlecase_Letter", tất cả đều phù hợp với "Cased_Letter" trong đối sánh "/ i". Va thu hai
tập hợp là "Chữ hoa", "Chữ thường" và "Chữ hoa tiêu đề", tất cả đều khớp với "Được viết hoa" dưới "/ i"
sự phù hợp. Bộ này cũng bao gồm các tập con của nó "PosixUpper" và "PosixLower" cả hai đều
dưới "/ i" khớp với "PosixAlpha". (Sự khác biệt giữa các bộ này là một số điều,
chẳng hạn như chữ số La Mã, có cả chữ hoa và chữ thường để chúng được "Cased", nhưng không phải
được coi là các chữ cái, vì vậy chúng không phải là "Cased_Letter".)
Xem "Ngoài các điểm mã Unicode" để biết các cân nhắc đặc biệt khi đối sánh Unicode
thuộc tính chống lại các điểm mã không phải mã Unicode.
Chung_Thể loại
Mỗi ký tự Unicode đều được gán một danh mục chung, đây là danh mục "thông thường nhất
phân loại của một ký tự "(từhttp://www.unicode.org/reports/tr44>).
Cách viết ghép của những thứ này giống như "\ p {General_Category = Number}" (viết tắt:
"\ p {gc: n}"). Nhưng Perl cung cấp các phím tắt trong đó mọi thứ đi lên thông qua bằng hoặc
dấu hai chấm bị bỏ qua. Vì vậy, thay vào đó bạn có thể chỉ cần viết "\ pN".
Dưới đây là các dạng giá trị ngắn và dài của thuộc tính "General Category" có thể có:
Ngắn dài
Chữ L
LC, L & Cased_Letter (nghĩa là: [\ p {Ll} \ p {Lu} \ p {Lt}])
Lu viết hoa_Letter
Ll Chữ thường_Letter
Lt Titlecase_Thư
Lm Modifier_Thư
Lo Khác_Thư
M đánh dấu
Mn Nonspace_Mark
Khoảng cách Mc_Mark
Tôi kèm theo_Mark
Số N
Nd Decimal_Number (cũng là chữ số)
Nl Thư_Số
Không Khác_Số
Dấu chấm câu (cũng là Dấu câu)
Đầu nối máy tính_Dấu chấm câu
Pd Dash_Dấu chấm câu
Ps Open_Dấu chấm câu
Pe Đóng_Dấu chấm câu
Pi Ban Đầu_Punctuation
(có thể hoạt động giống như Ps hoặc Pe tùy thuộc vào cách sử dụng)
Pf Cuối cùng_Dấu câu
(có thể hoạt động giống như Ps hoặc Pe tùy thuộc vào cách sử dụng)
Po Khác_ Dấu câu
Ký hiệu S
Sm Toán_Ký hiệu
Sc Tiền tệ_Symbol
Công cụ sửa đổi Sk_Symbol
Vì vậy Other_Symbol
Dấu phân tách Z
Dấu cách_Dấu cách Zs
Dấu phân cách dòng Zl
Đoạn Zp_Dấu tách
C Khác
Điều khiển Cc (cũng Cntrl)
Định dạng Cf
Cs thay thế
Co Riêng_Sử Dụng
Cn Chưa giao
Thuộc tính một chữ cái khớp với tất cả các ký tự trong bất kỳ thuộc tính con gồm hai chữ cái nào
bắt đầu bằng cùng một chữ cái. "LC" và "L &" rất đặc biệt: cả hai đều là bí danh cho tập hợp
bao gồm mọi thứ được so khớp bởi "Ll", "Lu" và "Lt".
Hai chiều Nhân vật Các loại
Bởi vì các chữ viết khác nhau về hướng của chúng (tiếng Do Thái và tiếng Ả Rập được viết phù hợp với
trái, chẳng hạn) Unicode cung cấp thuộc tính "Bidi_Class". Một số giá trị này
tài sản có thể có là:
Ý nghĩa giá trị
L Trái sang Phải
LRE Nhúng từ trái sang phải
LRO Ghi đè từ trái sang phải
R Từ phải sang trái
AL Thư Ả Rập
RLE Nhúng từ phải sang trái
Ghi đè từ phải sang trái của RLO
Định dạng PDF Pop Directional
EN số Châu Âu
Bộ tách châu Âu ES
Kẻ hủy diệt châu Âu ET
AN số Ả Rập
Dấu phân tách chung CS
Dấu không có khoảng cách NSM
BN Boundary Trung lập
B Dấu phân cách đoạn
Dấu phân tách đoạn S
Khoảng trắng WS
TRÊN các trung lập khác
Thuộc tính này luôn được viết ở dạng ghép. Ví dụ: "\ p {Bidi_Class: R}"
khớp các ký tự thường được viết từ phải sang trái. Không giống như "General_Category"
thuộc tính này, thuộc tính này có thể có nhiều giá trị được thêm vào trong một bản phát hành Unicode trong tương lai. Những thứ kia
được liệt kê ở trên bao gồm bộ hoàn chỉnh cho nhiều bản phát hành Unicode, nhưng những bản khác đã được thêm vào
trong Unicode 6.3; bạn luôn có thể tìm thấy những cái hiện tại trong perluniprops. Và
<http://www.unicode.org/reports/tr9/> mô tả cách sử dụng chúng.
Kịch bản
Các ngôn ngữ trên thế giới được viết bằng nhiều chữ viết khác nhau. Câu này (trừ khi bạn
đọc nó trong bản dịch) được viết bằng tiếng Latinh, trong khi tiếng Nga được viết bằng chữ Kirin, và
Tiếng Hy Lạp được viết bằng tiếng Hy Lạp; Tiếng Nhật chủ yếu bằng Hiragana hoặc Katakana. Có nhiều
hơn.
Thuộc tính Unicode "Script" và "Script_Extensions" cung cấp cho tập lệnh nào một ký tự nhất định
ở trong. Có thể chỉ định một trong hai thuộc tính bằng dạng kết hợp như "\ p {Script = Hebrew}"
(viết tắt: "\ p {sc = hebr}") hoặc "\ p {Script_Extensions = Javanese}" (viết tắt: "\ p {scx = java}"). Trong
Ngoài ra, Perl cung cấp các phím tắt cho tất cả các tên thuộc tính "Script". Bạn có thể bỏ qua
mọi thứ lên thông qua dấu bằng (hoặc dấu hai chấm) và chỉ cần viết "\ p {Latin}" hoặc
"\ P {Kirin}". (Điều này không đúng với "Script_Extensions", bắt buộc phải là
được viết dưới dạng hợp chất.)
Sự khác biệt giữa hai thuộc tính này liên quan đến các ký tự được sử dụng trong nhiều
các tập lệnh. Ví dụ, các chữ số '0' đến '9' được sử dụng ở nhiều nơi trên thế giới.
Chúng được đặt trong một tập lệnh có tên "Chung". Các ký tự khác chỉ được sử dụng trong một số
các tập lệnh. Ví dụ: "KATAKANA-HIRAGANA DOUBLE HYPHEN" được sử dụng trong cả tiếng Nhật
script, Katakana và Hiragana, nhưng không ở đâu khác. Thuộc tính "Script" đặt tất cả
các ký tự được sử dụng trong nhiều tập lệnh trong tập lệnh "Chung", trong khi
Thuộc tính "Script_Extensions" đặt các thuộc tính chỉ được sử dụng trong một vài tập lệnh vào mỗi
những script đó; trong khi vẫn sử dụng "Chung" cho những từ được sử dụng trong nhiều tập lệnh. Vì vậy, cả hai
trận đấu:
"0" = ~ / \ p {sc = Common} / # Kết quả phù hợp
"0" = ~ / \ p {scx = Common} / # Kết quả phù hợp
và chỉ trận đấu đầu tiên trong số những trận đấu này:
"\ N {KATAKANA-HIRAGANA DOUBLE HYPHEN}" = ~ / \ p {sc = Common} # Kết quả phù hợp
"\ N {KATAKANA-HIRAGANA DOUBLE HYPHEN}" = ~ / \ p {scx = Common} # Không phù hợp
Và chỉ có hai trận đấu cuối cùng trong số này:
"\ N {KATAKANA-HIRAGANA DOUBLE HYPHEN}" = ~ / \ p {sc = Hiragana} # Không phù hợp
"\ N {KATAKANA-HIRAGANA DOUBLE HYPHEN}" = ~ / \ p {sc = Katakana} # Không phù hợp
"\ N {KATAKANA-HIRAGANA DOUBLE HYPHEN}" = ~ / \ p {scx = Hiragana} # Kết quả phù hợp
"\ N {KATAKANA-HIRAGANA DOUBLE HYPHEN}" = ~ / \ p {scx = Katakana} # Trận đấu
Do đó, "Script_Extensions" là một "Tập lệnh" được cải tiến, trong đó có ít ký tự hơn trong
tập lệnh "Chung" và tương ứng nhiều hơn trong các tập lệnh khác. Nó là mới trong Unicode
phiên bản 6.0 và dữ liệu của nó có thể sẽ thay đổi đáng kể trong các bản phát hành sau này, vì mọi thứ
được sắp xếp ra. Mã mới có thể phải sử dụng "Script_Extensions" và không đơn giản
"Script".
(Trên thực tế, ngoài "Chung", tập lệnh "Kế thừa", chứa các ký tự được sử dụng trong
nhiều tập lệnh. Đây là các ký tự bổ trợ kế thừa giá trị tập lệnh của
nhân vật điều khiển. Một số trong số này được sử dụng trong nhiều tập lệnh, vì vậy hãy chuyển sang phần "Được kế thừa"
trong cả "Script" và "Script_Extensions". Những người khác chỉ được sử dụng trong một vài tập lệnh,
trong "Kế thừa" trong "Tập lệnh", nhưng không phải trong "Tập lệnh_Extensions".)
Cần nhấn mạnh rằng có một số bộ chữ số khác nhau trong Unicode là
tương đương với 0-9 và có thể hiểu được bằng "\ d" trong một biểu thức chính quy. Nếu chúng được sử dụng trong
chỉ một ngôn ngữ duy nhất, chúng ở "Script" và "Script_Extension" của ngôn ngữ đó. Nếu như
chúng được sử dụng trong nhiều tập lệnh, chúng sẽ ở dạng "sc = Common", nhưng chỉ khi chúng
được sử dụng trong nhiều tập lệnh nếu chúng ở dạng "scx = Common".
Danh sách đầy đủ các tập lệnh và các phím tắt của chúng có trong perluniprops.
Sử dụng of các "Là" Tiếp đầu ngữ
Để tương thích ngược (với Perl 5.6), tất cả các thuộc tính có thể ghi mà không cần sử dụng
dạng ghép được đề cập cho đến nay có thể có thêm "Is" hoặc "Is_" vào tên của chúng, vì vậy
Ví dụ: "\ P {Is_Lu}" bằng "\ P {Lu}" và "\ p {IsScript: Arabic}" bằng
"\ p {tiếng Ả Rập}".
Khối
Ngoài kịch bản, Unicode cũng định nghĩa khối của các ký tự. Sự khác biệt giữa
script và khối là khái niệm về script gần với ngôn ngữ tự nhiên hơn, trong khi
khái niệm về các khối là một nhóm nhân tạo dựa trên các nhóm Unicode
các ký tự có giá trị thứ tự liên tiếp. Ví dụ: khối "Tiếng Latinh cơ bản" là tất cả
các ký tự có thứ tự từ 0 đến 127, bao gồm cả; nói cách khác, ASCII
nhân vật. Hệ thống chữ "Latinh" chứa một số chữ cái này cũng như một số chữ cái khác
các khối, như "Phần bổ sung Latin-1", "Latin Extended-A", và vv, nhưng nó không chứa tất cả
các ký tự từ các khối đó. Ví dụ, nó không chứa các chữ số 0-9,
bởi vì những chữ số đó được chia sẻ trên nhiều tập lệnh và do đó nằm trong tập lệnh "Chung".
Để biết thêm về tập lệnh so với khối, hãy xem UAX # 24 "Thuộc tính tập lệnh Unicode":
<http://www.unicode.org/reports/tr24>
Các thuộc tính "Script" hoặc "Script_Extensions" có thể là những thuộc tính bạn muốn sử dụng
khi xử lý ngôn ngữ tự nhiên; thuộc tính "Block" đôi khi có thể hữu ích trong
làm việc với các đai ốc và bu lông của Unicode.
Tên khối được so khớp ở dạng ghép, như "\ p {Block: Arrows}" hoặc
"\ p {Blk = tiếng Do Thái}". Không giống như hầu hết các thuộc tính khác, chỉ một số tên khối có Unicode-
tên viết tắt được xác định. Nhưng Perl cung cấp một phím tắt (nhỏ, không còn được khuyến nghị):
Bạn có thể nói, chẳng hạn như "\ p {In_Arrows}" hoặc "\ p {In_Hebrew}".
Để tương thích ngược, tiền tố "In" có thể bị bỏ qua nếu không có xung đột đặt tên
bằng tập lệnh hoặc bất kỳ thuộc tính nào khác và bạn thậm chí có thể sử dụng tiền tố "Là" thay thế trong những
các trường hợp. Nhưng đừng làm điều này đối với mã mới vì mã của bạn có thể bị hỏng trong các bản phát hành mới và
điều này đã xảy ra: Đã có lúc trong các bản phát hành Unicode rất sớm khi
"\ p {Hebrew}" sẽ khớp với chặn Tiếng Do Thái; bây giờ nó không.
Cho đến nay, việc sử dụng tiền tố "In" sẽ tránh được sự mơ hồ này. Nhưng các phiên bản mới của Unicode vẫn tiếp tục
để thêm các thuộc tính mới có tên bắt đầu bằng "In". Có khả năng một trong số
một ngày nào đó chúng sẽ xung đột với cách sử dụng của bạn. Vì đây chỉ là một phần mở rộng Perl,
Tên của Unicode sẽ được ưu tiên hơn và mã của bạn sẽ bị hỏng. Ngoài ra, Unicode là
miễn phí để thêm một tập lệnh có tên bắt đầu bằng "In"; điều đó sẽ gây ra vấn đề.
Vì vậy, rõ ràng hơn và tốt nhất là sử dụng dạng phức hợp khi chỉ định các khối. Và hãy chắc chắn
đó là những gì bạn thực sự thực sự muốn làm. Trong hầu hết các trường hợp, tập lệnh là thứ bạn muốn
thay thế.
Danh sách đầy đủ các khối và phím tắt của chúng có trong perluniprops.
Nền tảng khác Bất động sản
Có nhiều thuộc tính hơn những thuộc tính rất cơ bản được mô tả ở đây. Một danh sách đầy đủ
là trong perluniprops.
Unicode xác định tất cả các thuộc tính của nó ở dạng phức hợp, vì vậy tất cả các thuộc tính ở dạng đơn là
Phần mở rộng Perl. Hầu hết chúng chỉ là từ đồng nghĩa với Unicode, nhưng một số
các phần mở rộng chính hãng, bao gồm một số phần mở rộng ở dạng phức hợp. Và khá nhiều
chúng thực sự được đề xuất bởi Unicode (tronghttp://www.unicode.org/reports/tr18>).
Phần này cung cấp một số chi tiết về tất cả các phần mở rộng không chỉ là từ đồng nghĩa với từ ghép-
hình thành thuộc tính Unicode (đối với những thuộc tính đó, bạn sẽ phải tham khảo bảng mã Unicode
Tiêu chuẩnhttp://www.unicode.org/reports/tr44>.
"\ p {Tất cả}"
Điều này phù hợp với mọi điểm mã có thể. Nó tương đương với "qr /./ s". Không giống như tất cả
đối sánh thuộc tính "\ p {}" không do người dùng xác định khác, không có cảnh báo nào được tạo nếu điều này
là thuộc tính được so khớp với điểm mã không phải Unicode (xem "Ngoài mã Unicode
điểm "dưới đây).
"\ p {Alnum}"
Điều này khớp với bất kỳ ký tự "\ p {Alphabetic}" hoặc "\ p {Decimal_Number}".
"\ p {Bất kỳ}"
Điểm này khớp với bất kỳ điểm nào trong số 1_114_112 mã Unicode. Nó là một từ đồng nghĩa với
"\ p {Unicode}".
"\ p {ASCII}"
Điều này khớp với bất kỳ ký tự nào trong số 128 ký tự trong bộ ký tự US-ASCII, là ký tự
tập hợp con của Unicode.
"\ p {Đã chỉ định}"
Điều này phù hợp với bất kỳ điểm mã được chỉ định nào; nghĩa là, bất kỳ điểm mã nào có danh mục chung
không phải là "Chưa được gán" (hoặc tương đương, không phải là "Cn").
"\ p {Trống}"
Điều này giống với "\ h" và "\ p {HorizSpace}": Một ký tự thay đổi khoảng cách
theo chiều ngang.
"\ p {Decomposition_Type: Không kinh điển}" (Viết tắt: "\ p {Dt = NonCanon}")
Khớp một ký tự có phân tách không chuẩn.
Phần "Cụm đồ thị mở rộng (Ký tự lôgic)" ở trên đã nói về
sự phân rã kinh điển. Tuy nhiên, nhiều nhân vật khác có kiểu khác
phân hủy, phân hủy "tương thích" hoặc "không chuẩn". Các trình tự
hình thành những phân tách này không được coi là tương đương về mặt kinh điển với
nhân vật sáng tác. Một ví dụ là "SUPERSCRIPT ONE". Nó giống như một
chữ số 1 thông thường, nhưng không chính xác; sự phân hủy của nó thành chữ số 1 được gọi là
phân hủy "tương thích", cụ thể là phân hủy "siêu". Có một số
sự phân tách khả năng tương thích như vậy (xemhttp://www.unicode.org/reports/tr44>),
bao gồm một loại được gọi là "compat", có nghĩa là một số loại phân hủy linh tinh
không phù hợp với các danh mục phân tách khác mà Unicode đã chọn.
Lưu ý rằng hầu hết các ký tự Unicode không có sự phân tách, vì vậy sự phân tách của chúng
loại là "Không có".
Để thuận tiện cho bạn, Perl đã thêm kiểu phân hủy "Non_Canonical" có nghĩa là
bất kỳ sự phân tách khả năng tương thích nào.
"\ p {Đồ thị}"
Khớp với bất kỳ ký tự nào có hình ảnh. Về mặt lý thuyết, điều này có nghĩa là một ký tự trên
máy in sẽ gây ra mực được sử dụng.
"\ p {HorizSpace}"
Điều này giống với "\ h" và "\ p {Blank}": một ký tự thay đổi khoảng cách
theo chiều ngang.
"\ p {Trong = *}"
Đây là từ đồng nghĩa với "\ p {Present_In = *}"
"\ p {PerlSpace}"
Điều này giống với "\ s", bị hạn chế đối với ASCII, cụ thể là "[\ f \ n \ r \ t]" và bắt đầu bằng
Perl v5.18, một tab dọc.
Mnemonic: Perl's (nguyên bản) không gian
"\ p {PerlWord}"
Điều này giống với "\ w", bị hạn chế đối với ASCII, cụ thể là "[A-Za-z0-9_]"
Ghi nhớ: Từ (nguyên bản) của Perl.
"\ p {Posix ...}"
Có một số trong số này, tương đương, sử dụng ký hiệu "\ p {}", cho
Các lớp Posix và được mô tả trong "Các Lớp Ký tự POSIX" trong perlrecharclass.
"\ p {Present_In: *} " (Viết tắt: "\ p {In = *}")
Thuộc tính này được sử dụng khi bạn cần biết một ký tự trong (các) phiên bản Unicode là gì.
"*" Ở trên là viết tắt của một số phiên bản Unicode có hai chữ số, chẳng hạn như 1.1 hoặc 4.0; hoặc là
"*" cũng có thể là "Chưa được gán". Thuộc tính này sẽ khớp với các điểm mã có
quyết định cuối cùng đã được giải quyết kể từ khi phát hành Unicode do phiên bản đưa ra
số; "\ p {Present_In: Unassigned}" sẽ khớp với các điểm mã có ý nghĩa
vẫn chưa được chỉ định.
Ví dụ: "U + 0041" "CHỮ VIẾT HOA LATIN A" đã có trong Unicode đầu tiên
bản phát hành có sẵn, là 1.1, vì vậy thuộc tính này đúng với tất cả các phiên bản "*" hợp lệ.
Mặt khác, "U + 1EFF" không được chỉ định cho đến phiên bản 5.1 khi nó trở thành "LATIN
CHỮ Y NHỎ CÓ LOOP ", vì vậy" * "duy nhất phù hợp với nó là 5.1, 5.2 và
sau đó.
Unicode cung cấp thuộc tính "Tuổi" mà từ đó nó được tạo ra. Vấn đề với Age
là một cách diễn giải chặt chẽ về nó (theo Perl) có giúp nó khớp với
giải phóng ý nghĩa của điểm mã được đưa vào. Vì vậy, "U + 0041" sẽ chỉ khớp với 1.1;
và "U + 1EFF" chỉ 5.1. Đây thường không phải là điều bạn muốn.
Một số triển khai không phải Perl của thuộc tính Age có thể thay đổi ý nghĩa của nó thành
giống như thuộc tính Perl "Present_In"; chỉ cần nhận thức về điều đó.
Một sự nhầm lẫn khác với cả hai thuộc tính này là định nghĩa không phải là
điểm mã đã được giao, nhưng ý nghĩa của điểm mã đã được
xác định. Điều này là do 66 điểm mã sẽ luôn không được gán, và do đó
"Tuổi" đối với họ là phiên bản Unicode trong đó quyết định làm cho họ như vậy đã được đưa ra.
Ví dụ: "U + FDD0" sẽ vĩnh viễn không được gán cho một ký tự và quyết định
để làm điều đó đã được thực hiện trong phiên bản 3.1, vì vậy "\ p {Age = 3.1}" cũng khớp với ký tự này
hiện "\ p {Present_In: 3.1}" trở lên.
"\ p {Print}"
Điều này khớp với bất kỳ ký tự nào có đồ họa hoặc trống, ngoại trừ các điều khiển.
"\ p {SpacePerl}"
Điều này giống với "\ s", bao gồm cả ngoài ASCII.
Mnemonic: Space, được sửa đổi bởi Perl. (Nó không bao gồm tab dọc cho đến khi
v5.18, mà cả tiêu chuẩn Posix và Unicode đều coi là khoảng trắng.)
"\ p {Title}" và "\ p {Titlecase}"
Trong đối sánh phân biệt chữ hoa chữ thường, cả hai đều khớp với cùng một điểm mã là "\ p {Chung
Category = Titlecase_Letter} "(" \ p {gc = lt} "). Sự khác biệt là trong" / i "không tính tiền
đối sánh, những đối sánh này giống với "\ p {Cased}", trong khi đối sánh "\ p {gc = lt}"
"\ p {Cased_Letter").
"\ p {Unicode}"
Điểm này khớp với bất kỳ điểm nào trong số 1_114_112 mã Unicode. "\ p {Bất kỳ}".
"\ p {VertSpace}"
Điều này giống với "\ v": Một ký tự thay đổi khoảng cách theo chiều dọc.
"\ p {Word}"
Điều này giống với "\ w", bao gồm hơn 100_000 ký tự ngoài ASCII.
"\ p {XPosix ...}"
Có một số trong số này, là các lớp Posix tiêu chuẩn được mở rộng đến toàn bộ
Dải mã Unicode. Chúng được mô tả trong "Các lớp ký tự POSIX" ở lớp perlrechar.
Đã xác định người dùng Nhân vật Bất động sản
Bạn có thể xác định các thuộc tính ký tự nhị phân của riêng mình bằng cách xác định các chương trình con có tên
bắt đầu bằng "In" hoặc "Is". (Tính năng thử nghiệm "(? [])" Trong perlre cung cấp một
thay thế cho phép các định nghĩa phức tạp hơn.) Các chương trình con có thể được định nghĩa trong bất kỳ
Bưu kiện. Các thuộc tính do người dùng xác định có thể được sử dụng trong biểu thức chính quy "\ p {}" và
Các cấu trúc "\ P {}"; nếu bạn đang sử dụng thuộc tính do người dùng xác định từ một gói khác với
bạn đang ở trong đó, bạn phải chỉ định gói của nó trong cấu trúc "\ p {}" hoặc "\ P {}".
# giả sử thuộc tính Is_Foreign được xác định trong Lang ::
gói chính; # tên gói thuộc tính bắt buộc
if ($ txt = ~ / \ p {Lang :: IsForeign} + /) {...}
gói Láng; # tên gói thuộc tính không bắt buộc
if ($ txt = ~ / \ p {IsForeign} + /) {...}
Lưu ý rằng hiệu ứng là thời gian biên dịch và bất biến sau khi được xác định. Tuy nhiên, các chương trình con
được chuyển qua một tham số duy nhất, là 0 nếu đối sánh phân biệt chữ hoa chữ thường có hiệu lực và không
XNUMX nếu kết hợp không tiền mặt đang có hiệu lực. Chương trình con có thể trả về các giá trị khác nhau
tùy thuộc vào giá trị của cờ và một bộ giá trị sẽ không thay đổi có hiệu lực đối với
tất cả các kết quả phù hợp phân biệt chữ hoa chữ thường và tập hợp khác dành cho tất cả các kết quả phù hợp không phân biệt chữ hoa chữ thường.
Lưu ý rằng nếu biểu thức chính quy bị mờ, thì Perl sẽ chết thay vì gọi
chương trình con khi tên của chương trình con được xác định bởi dữ liệu bị nhiễm bẩn.
Các chương trình con phải trả về một chuỗi có định dạng đặc biệt, với một hoặc nhiều dòng mới-
các dòng ngăn cách. Mỗi dòng phải là một trong những dòng sau:
· Một số thập lục phân duy nhất biểu thị một điểm mã cần đưa vào.
· Hai số thập lục phân cách nhau bằng khoảng trắng ngang (dấu cách hoặc dạng bảng
ký tự) biểu thị một loạt các điểm mã cần bao gồm.
· Một cái gì đó để bao gồm, tiền tố là "+": một thuộc tính ký tự có sẵn (tiền tố là
"utf8 ::") hoặc ký tự do người dùng xác định đủ điều kiện (bao gồm cả tên gói)
thuộc tính, đại diện cho tất cả các ký tự trong thuộc tính đó; hai mã thập lục phân
điểm cho một phạm vi; hoặc một điểm mã thập lục phân.
· Thứ gì đó cần loại trừ, có tiền tố là "-": thuộc tính ký tự hiện có (tiền tố là
"utf8 ::") hoặc ký tự do người dùng xác định đủ điều kiện (bao gồm cả tên gói)
thuộc tính, đại diện cho tất cả các ký tự trong thuộc tính đó; hai mã thập lục phân
điểm cho một phạm vi; hoặc một điểm mã thập lục phân.
· Một cái gì đó để phủ định, tiền tố "!": Một thuộc tính ký tự hiện có (tiền tố là
"utf8 ::") hoặc ký tự do người dùng xác định đủ điều kiện (bao gồm cả tên gói)
thuộc tính, đại diện cho tất cả các ký tự trong thuộc tính đó; hai mã thập lục phân
điểm cho một phạm vi; hoặc một điểm mã thập lục phân.
· Một cái gì đó giao nhau với, tiền tố là "&": một thuộc tính ký tự hiện có (tiền tố
bởi "utf8 ::") hoặc một ký tự hoàn toàn đủ điều kiện (bao gồm cả tên gói) do người dùng xác định
thuộc tính, cho tất cả các ký tự ngoại trừ các ký tự trong thuộc tính; hai
điểm mã thập lục phân cho một phạm vi; hoặc một điểm mã thập lục phân.
Ví dụ: để xác định một thuộc tính bao hàm cả hai âm tiết tiếng Nhật (hiragana và
katakana), bạn có thể định nghĩa
phụ InKana {
trở lại <
3040 \ t309F
30A0 \ t30FF
END
}
Hãy tưởng tượng rằng điểm đánh dấu cuối here-doc nằm ở đầu dòng. Bây giờ bạn có thể sử dụng
"\ p {InKana}" và "\ P {InKana}".
Bạn cũng có thể đã sử dụng các tên thuộc tính khối hiện có:
phụ InKana {
return << 'HẾT';
+ utf8 :: InHiragana
+ utf8 :: InKatakana
END
}
Giả sử bạn chỉ muốn đối sánh các ký tự được phân bổ, không đối sánh với các phạm vi khối thô: in
nói cách khác, bạn muốn xóa các ký tự chưa được gán:
phụ InKana {
return << 'HẾT';
+ utf8 :: InHiragana
+ utf8 :: InKatakana
-utf8 :: IsCn
END
}
Sự phủ định rất hữu ích để xác định các lớp bị phủ định (ngạc nhiên!).
phụ InNotKana {
return << 'HẾT';
! utf8 :: InHiragana
-utf8 :: InKatakana
+ utf8 :: IsCn
END
}
Điều này sẽ khớp với tất cả các điểm mã không phải Unicode, vì mọi điểm trong số chúng đều không ở Kana. Bạn
có thể sử dụng giao lộ để loại trừ những thứ này, nếu muốn, như ví dụ đã sửa đổi này cho thấy:
phụ InNotKana {
return << 'HẾT';
! utf8 :: InHiragana
-utf8 :: InKatakana
+ utf8 :: IsCn
& utf8 :: Bất kỳ
END
}
& utf8 :: Bất kỳ phải là dòng cuối cùng trong định nghĩa.
Giao điểm thường được sử dụng để lấy các ký tự chung được so khớp bởi hai (hoặc nhiều hơn)
các lớp học. Điều quan trọng cần nhớ là không sử dụng "&" cho tập hợp đầu tiên; đó sẽ là
giao nhau với không, dẫn đến một tập hợp trống.
Không giống như các đối sánh thuộc tính "\ p {}" không do người dùng xác định, không có cảnh báo nào được tạo nếu các
các thuộc tính được so khớp với điểm mã không phải Unicode (xem "Ngoài điểm mã Unicode"
dưới đây).
Đã xác định người dùng Khay Ánh xạ (Đối với nghiêm trọng tin tặc chỉ)
T tính năng có được loại bỏ as of Perl 5.16. Mô-đun CPAN "Unicode :: Casing" cung cấp
chức năng tốt hơn mà không có nhược điểm mà tính năng này có. Nếu bạn đang sử dụng Perl
sớm hơn 5.16, tính năng này đã được ghi lại đầy đủ nhất trong phiên bản 5.14 của nhóm này:
<http://perldoc.perl.org/5.14.0/perlunicode.html# Bản đồ trường hợp do người dùng xác định-% 28cho-nghiêm túc-chỉ dành cho tin tặc% 29>
Nhân vật Mã hóa cho Đầu vào và Đầu ra
Xem Mã hóa.
Unicode Đều đặn Biểu hiện Hỗ Trợ Cấp
Danh sách các tính năng được hỗ trợ Unicode cho biểu thức chính quy sau đây mô tả tất cả
các tính năng hiện được hỗ trợ trực tiếp bởi lõi Perl. Các tham chiếu đến "Cấp độ N" và
số phần tham chiếu đến Tiêu chuẩn kỹ thuật Unicode # 18, "Unicode Regular
Biểu thức ", phiên bản 13, từ tháng 2008 năm XNUMX.
· Cấp độ 1 - Hỗ trợ Unicode cơ bản
Ký hiệu Hex RL1.1 - hoàn thành [1]
Thuộc tính RL1.2 - xong [2] [3]
Thuộc tính tương thích RL1.2a - thực hiện [4]
RL1.3 Phép trừ và Giao điểm - thử nghiệm [5]
RL1.4 Ranh giới từ đơn giản - thực hiện [6]
RL1.5 Đối sánh lỏng lẻo đơn giản - thực hiện [7]
Ranh giới dòng RL1.6 - MISSING [8] [9]
RL1.7 Điểm mã bổ sung - thực hiện [10]
[1] "\ N {U + ...}" và "\ x {...}"
[2] "\ p {...}" "\ P {...}"
[3] không chỉ hỗ trợ danh sách tối thiểu mà còn hỗ trợ tất cả các thuộc tính ký tự Unicode (xem Unicode
Thuộc tính ký tự ở trên)
[4] "\ d" "\ D" "\ s" "\ S" "\ w" "\ W" "\ X" "[:chống đỡ:] " "[: ^ prop:]"
[5] Tính năng thử nghiệm bắt đầu trong v5.18 "(? [...])" thực hiện được điều này.
Xem "(? [])" Trong perlre. Nếu bạn không muốn sử dụng một tính năng thử nghiệm, bạn có thể
sử dụng một trong những cách sau:
· Biểu thức chính quy nhìn về phía trước
Bạn có thể bắt chước phép trừ lớp bằng cách sử dụng lookahead. Ví dụ, những gì UTS # 18
có thể viết là
[{Block = Greek} - [{UNASSIGNED}]]
trong Perl có thể được viết là:
(?! \ p {Chưa giao}) \ p {Block = Greek}
(? = \ p {Đã chỉ định}) \ p {Khối = Tiếng Hy Lạp}
Nhưng trong ví dụ cụ thể này, bạn có thể thực sự muốn
\ p {tiếng Hy Lạp}
sẽ khớp với các ký tự được chỉ định được biết là một phần của hệ thống chữ Hy Lạp.
· Mô-đun CPAN "Unicode :: Regex :: Set"
Nó thực hiện toàn bộ nhóm UTS # 18, giao điểm, liên kết và loại bỏ
(phép trừ).
· "Thuộc tính ký tự do người dùng xác định"
"+" cho liên hiệp, "-" để loại bỏ (set-chênh lệch), "&" cho giao lộ
[6] "\ b" "\ B"
[7] Lưu ý rằng Perl thực hiện gấp chữ hoa hoàn toàn để khớp, không phải Đơn giản:
Ví dụ: "U + 1F88" tương đương với "U + 1F00 U + 03B9", thay vì chỉ "U + 1F80".
Sự khác biệt này chủ yếu quan trọng đối với một số chữ cái viết hoa tiếng Hy Lạp nhất định với
bổ ngữ: kiểu gấp chữ hoàn chỉnh phân tách chữ cái, trong khi chữ hoa đơn giản-
gấp sẽ ánh xạ nó thành một ký tự duy nhất.
[8] Perl coi "\ n" là dấu phân cách dòng đầu và dòng cuối. Unicode chỉ định thêm
các ký tự cần được diễn giải như vậy.
Đó là:
VT U + 000B (\ v trong C)
FF U + 000C (\ f)
CR U + 000D (\ r)
NEL U + 0085
LS U + 2028
PS U + 2029
"^" và "$" trong các mẫu biểu thức chính quy phải khớp với tất cả những điều này, nhưng
đừng. Những ký tự này cũng không ảnh hưởng đến "<>" $. Và dòng script
số.
Ngoài ra, không nên tách các dòng trong "CRLF" (nghĩa là không có dòng trống giữa
"\ r" và "\ n"). Đối với "CRLF", hãy thử lớp ": crlf" (xem PerlIO).
[9] Nhưng "Unicode :: LineBreak" có sẵn.
Mô-đun này cung cấp tính năng ngắt dòng tuân theo UAX # 14 "Unicode Ngắt dòng
Thuật toán "http://www.unicode.org/reports/tr14>.
[10] UTF-8 / UTF-EBDDIC được sử dụng trong Perl không chỉ cho phép "U + 10000" thành "U + 10FFFF" mà còn
ngoài "U + 10FFFF"
· Cấp độ 2 - Hỗ trợ Unicode mở rộng
Tương đương hợp quy RL2.1 - MISSING [10] [11]
RL2.2 Các cụm đồ thị mặc định - MISSING [12]
RL2.3 Ranh giới từ mặc định - XONG [14]
RL2.4 Đối sánh lỏng lẻo mặc định - MISSING [15]
Thuộc tính tên RL2.5 - XONG
Thuộc tính ký tự đại diện RL2.6 - MISSING
[10] xem UAX # 15 "Biểu mẫu chuẩn hóa Unicode"
[11] có Unicode :: Normalize nhưng không được tích hợp vào regexes
[12] có \ X và \ b {gcb} nhưng chúng tôi không có "Cụm đồ thị
Chế độ"
[14] xem UAX # 29, Ranh giới từ
[15] Điều này được đề cập trong Chương 3.13 (trong Unicode 6.0)
· Cấp độ 3 - Hỗ trợ phù hợp
RL3.1 Dấu câu phù hợp - MISSING
RL3.2 Các cụm đồ thị được điều chỉnh - MISSING [17] [18]
RL3.3 Ranh giới từ được điều chỉnh - MISSING
RL3.4 Phù hợp với lỏng lẻo được thiết kế riêng - MISSING
RL3.5 Phạm vi điều chỉnh - MISSING
RL3.6 Khớp theo ngữ cảnh - MISSING [19]
RL3.7 Kết hợp tăng dần - MISSING
(Chia sẻ bộ Unicode RL3.8)
RL3.9 Bộ đối sánh có thể có - MISSING
RL3.10 Kết hợp gấp - MISSING [20]
RL3.11 Submatchers - BỎ LỠ
[17] xem UAX # 10 "Các thuật toán đối chiếu Unicode"
[18] có Unicode :: Collate nhưng không được tích hợp vào regexes
[19] có (? <= X) và (? = X), nhưng nhìn trước hoặc nhìn sau
nên nhìn thấy bên ngoài của chuỗi con mục tiêu
[20] cần đối sánh không nhạy cảm đối với các đặc điểm ngôn ngữ khác
hơn trường hợp; ví dụ, từ hiragana sang katakana, rộng và
từ Hán giản thể, hẹp sang Hán phồn thể (xem UTR # 30
"Gấp ký tự")
Unicode Mã hóa
Các ký tự Unicode được gán cho mã điểm, là những con số trừu tượng. Để sử dụng những
số, các bảng mã khác nhau là cần thiết.
· UTF-8
UTF-8 là kiểu mã hóa độc lập có độ dài thay đổi (1 đến 4 byte), thứ tự byte. Trong hầu hết các
trong tài liệu của Perl, bao gồm cả những nơi khác trong tài liệu này, thuật ngữ "UTF-8" có nghĩa là
cũng là "UTF-EBCDIC". Nhưng trong phần này, "UTF-8" chỉ đề cập đến mã hóa được sử dụng trên
Nền tảng ASCII. Nó là một tập siêu của US-ASCII 7-bit, vì vậy bất kỳ thứ gì được mã hóa trong ASCII đều có
biểu diễn giống hệt nhau khi được mã hóa trong UTF-8.
Bảng sau đây là từ Unicode 3.2.
Mã điểm 1 Byte thứ 2 Byte thứ 3 Byte thứ 4
U + 0000..U + 007F 00..7F
U + 0080..U + 07FF * C2..DF 80..BF
U + 0800..U + 0FFF E0 * A0..BF 80..BF
U + 1000..U + CFFF E1..EC 80..BF 80..BF
U + D000..U + D7FF ED 80..9F 80..BF
U + D800..U + DFFF +++++ utf16 thay thế, không phải utf8 +++++ hợp pháp
U + E000..U + FFFF EE..EF 80..BF 80..BF
U + 10000..U + 3FFFF F0 * 90..BF 80..BF 80..BF
U + 40000..U + FFFFF F1..F3 80..BF 80..BF 80..BF
U + 100000..U + 10FFFF F4 80..8F 80..BF 80..BF
Lưu ý các khoảng trống được đánh dấu bằng "*" trước một số mục byte ở trên. đó là
gây ra bởi UTF-8 hợp pháp tránh các mã hóa không ngắn nhất: về mặt kỹ thuật, có thể
UTF-8-mã hóa một điểm mã theo những cách khác nhau, nhưng điều đó bị cấm rõ ràng,
và mã hóa ngắn nhất có thể luôn được sử dụng (và đó là những gì Perl làm).
Một cách khác để xem xét nó là qua các bit:
Mã điểm 1 Byte thứ 2 Byte thứ 3 Byte thứ 4
0aaaaaa 0aaaaaaaaa
00000bbbbbaaaaaa 110bbbbb 10aaaaaa
ccccbbbbbbaaaaaa 1110cccc 10bbbbbb 10aaaaaa
00000dddccccccbbbbbbaaaaaa 11110ddd 10cccccc 10bbbbbb 10aaaaaa
Như bạn có thể thấy, các byte tiếp theo đều bắt đầu bằng "10" và các bit đầu của
byte bắt đầu cho biết có bao nhiêu byte trong ký tự được mã hóa.
Đặc điểm kỹ thuật UTF-8 ban đầu cho phép lên đến 6 byte, để cho phép mã hóa các số
tối đa "0x7FFF_FFFF". Perl tiếp tục cho phép những điều đó và đã mở rộng điều đó lên đến 13
byte để mã hóa mã trỏ đến những gì có thể phù hợp với một từ 64 bit. Tuy nhiên, Perl sẽ
cảnh báo nếu bạn xuất bất kỳ tệp nào trong số này là không di động; và theo đầu vào UTF-8 nghiêm ngặt
giao thức, chúng bị cấm.
· UTF-EBCDIC
Giống như UTF-8, nhưng EBCDIC an toàn, theo cách mà UTF-8 là ASCII an toàn. Điều này có nghĩa là tất cả
các ký tự cơ bản (bao gồm tất cả những ký tự có ASCII tương đương (như "A",
"0", "%", và vv) giống nhau trong cả EBCDIC và UTF-EBCDIC.)
UTF-EBCDIC được sử dụng trên nền tảng EBCDIC. Các điểm mã Unicode lớn nhất chiếm 5 byte
để đại diện (thay vì 4 trong UTF-8) và Perl mở rộng nó lên tối đa 7 byte để
mã hóa pode trỏ đến những gì có thể phù hợp với một từ 32 bit (thay vì 13 byte và một
Từ 64 bit trong UTF-8).
· UTF-16, UTF-16BE, UTF-16LE, Vật thay thế và "BOM" (Dấu thứ tự Byte)
Các mục sau đây chủ yếu là để tham khảo và kiến thức Unicode chung, Perl
không sử dụng các cấu trúc này trong nội bộ.
Giống như UTF-8, UTF-16 là mã hóa có độ rộng thay đổi, nhưng UTF-8 sử dụng mã 8 bit
đơn vị, UTF-16 sử dụng đơn vị mã 16 bit. Tất cả các điểm mã chiếm 2 hoặc 4 byte trong
UTF-16: điểm mã "U + 0000..U + FFFF" được lưu trữ trong một đơn vị 16 bit duy nhất và mã
điểm "U + 10000..U + 10FFFF" trong hai đơn vị 16 bit. Trường hợp thứ hai đang sử dụng người thay thế,
đơn vị 16 bit đầu tiên là cao thay thế, và thứ hai là thấp
thay thế.
Đại diện là các điểm mã được thiết lập để mã hóa phạm vi "U + 10000..U + 10FFFF" của
Mã Unicode điểm theo cặp đơn vị 16 bit. Các cao người thay thế là phạm vi
"U + D800..U + DBFF" và thấp người thay thế là phạm vi "U + DC00..U + DFFF". Người đại diện
mã hóa là
$ hi = ($ uni - 0x10000) / 0x400 + 0xD800;
$ lo = ($ uni - 0x10000)% 0x400 + 0xDC00;
và giải mã là
$ uni = 0x10000 + ($ hi - 0xD800) * 0x400 + ($ lo - 0xDC00);
Do có 16 bit, UTF-16 phụ thuộc vào thứ tự byte. Bản thân UTF-16 có thể được sử dụng
cho các tính toán trong bộ nhớ, nhưng nếu yêu cầu lưu trữ hoặc chuyển giao thì UTF-16BE
Các mã hóa (big-endian) hoặc UTF-16LE (little-endian) phải được chọn.
Điều này dẫn đến một vấn đề khác: điều gì sẽ xảy ra nếu bạn chỉ biết rằng dữ liệu của mình là UTF-16, nhưng
bạn không biết độ bền nào? Byte Order Marks, hoặc "BOM", là một giải pháp cho
điều này. Một ký tự đặc biệt đã được dành riêng trong Unicode để hoạt động như một thứ tự byte
điểm đánh dấu: ký tự có mã điểm "U + FEFF" là "BOM".
Bí quyết là nếu bạn đọc "BOM", bạn sẽ biết thứ tự byte, vì nếu nó là
được viết trên nền tảng big-endian, bạn sẽ đọc các byte "0xFE 0xFF", nhưng nếu nó là
được viết trên nền tảng little-endian, bạn sẽ đọc các byte "0xFF 0xFE". (Và nếu
nền tảng ban đầu được viết bằng nền tảng ASCII UTF-8, bạn sẽ đọc các byte
"0xEF 0xBB 0xBF".)
Cách thức hoạt động của thủ thuật này là ký tự có điểm mã "U + FFFE" không phải là
được cho là trong các luồng đầu vào, vì vậy chuỗi byte "0xFF 0xFE" rõ ràng là
"" BOM ", được biểu diễn ở định dạng little-endian" và không được là "U + FFFE", được biểu thị bằng
định dạng big-endian ".
Các đại diện không có ý nghĩa trong Unicode ngoài việc sử dụng chúng theo cặp để đại diện cho các
điểm mã. Tuy nhiên, Perl cho phép chúng được đại diện riêng lẻ trong nội bộ, vì
ví dụ bằng cách nói "chr(0xD801) ", để tất cả các điểm mã, không chỉ những điểm hợp lệ cho
trao đổi mở, có thể đại diện được. Unicode xác định ngữ nghĩa cho chúng, chẳng hạn như
"General_Category" của họ là "Cs". Nhưng vì việc sử dụng chúng có phần nguy hiểm, Perl
sẽ cảnh báo (sử dụng danh mục cảnh báo "thay thế", là một danh mục phụ của "utf8")
nếu một nỗ lực được thực hiện để làm những việc như viết thường của một hoặc so khớp chữ hoa-
một cách vô cảm, hoặc để xuất chúng. (Nhưng đừng thử điều này trên Perls trước 5.14.)
· UTF-32, UTF-32BE, UTF-32LE
Họ UTF-32 khá giống họ UTF-16, ngoại trừ các đơn vị
32-bit, và do đó, lược đồ thay thế không cần thiết. UTF-32 là chiều rộng cố định
mã hóa. Chữ ký "BOM" là "0x00 0x00 0xFE 0xFF" cho BE và "0xFF 0xFE 0x00
0x00 "cho LE.
· UCS-2, UCS-4
Các mã hóa kế thừa, có độ rộng cố định được xác định bởi tiêu chuẩn ISO 10646. UCS-2 là 16-bit
mã hóa. Không giống như UTF-16, UCS-2 không thể mở rộng ngoài "U + FFFF", vì nó không
sử dụng đại diện. UCS-4 là mã hóa 32 bit, có chức năng giống với UTF-32 (
sự khác biệt là UCS-4 không cấm đại diện hoặc điểm mã lớn hơn
"0x10_FFFF").
· UTF-7
Mã hóa an toàn bảy bit (không phải tám bit), rất hữu ích nếu vận chuyển hoặc lưu trữ
không an toàn tám-bit. Được xác định bởi RFC 2152.
Không ký tự mã điểm
66 điểm mã được đặt riêng trong Unicode như "điểm mã không ký tự". Tất cả đều có
"Chưa được gán" ("Cn") "General_Category" và sẽ không có nhân vật nào được chỉ định cho bất kỳ
họ. Chúng là 32 điểm mã giữa "U + FDD0" và "U + FDEF", và 34
điểm mã:
U + FFFE U + FFFF
U + 1FFFE U + 1FFFF
U + 2FFFE U + 2FFFF
...
U + EFFFE U + EFFFF
U + FFFFE U + FFFFF
U + 10FFFE U + 10FFFF
Cho đến Unicode 7.0, các ký tự không phải là "cấm để sử dụng trong trao đổi mở của
Dữ liệu văn bản Unicode ", để mã đã xử lý các luồng đó có thể sử dụng các điểm mã này
dưới dạng các vệ tinh có thể được trộn lẫn với dữ liệu ký tự và sẽ luôn là
có thể phân biệt được với dữ liệu đó. (Nhấn mạnh ở trên và trong đoạn tiếp theo được thêm vào
tài liệu này.)
Unicode 7.0 đã thay đổi từ ngữ để chúng là "không đề nghị để sử dụng mở
trao đổi dữ liệu văn bản Unicode ". Tiêu chuẩn 7.0 tiếp tục nói:
"Nếu một ký tự không được nhận trong trao đổi mở, một ứng dụng không bắt buộc
giải thích nó theo bất kỳ cách nào. Tuy nhiên, đó là một thực tiễn tốt để công nhận nó là một
noncharacter và thực hiện hành động thích hợp, chẳng hạn như thay thế nó bằng "U + FFFD"
ký tự thay thế, để chỉ ra vấn đề trong văn bản. Nó không được khuyến khích
chỉ cần xóa các điểm mã không ký tự khỏi văn bản như vậy, vì tiềm năng
các vấn đề bảo mật do xóa các ký tự không được thông dịch. (Xem điều khoản tuân thủ
C7 trong Phần 3.2, Yêu cầu Tuân thủ và Báo cáo Kỹ thuật Unicode # 36,
"Cân nhắc về Bảo mật Unicode"
<http://www.unicode.org/reports/tr36/#Substituting_for_Ill_Formed_Subsequences>). "
Thay đổi này được thực hiện vì nhận thấy rằng nhiều công cụ thương mại khác nhau như trình chỉnh sửa hoặc
đối với những thứ như kiểm soát mã nguồn, đã được viết để chúng không xử lý
các tệp chương trình đã sử dụng các điểm mã này, loại trừ hiệu quả việc sử dụng chúng gần như
toàn bộ! Và đó không bao giờ là mục đích. Chúng luôn luôn được sử dụng trong
một ứng dụng, hoặc tập hợp các ứng dụng hợp tác, tùy ý.
Nếu bạn đang viết mã, chẳng hạn như một trình soạn thảo, nó được cho là có thể xử lý bất kỳ
Dữ liệu văn bản Unicode, thì bạn không nên tự sử dụng các điểm mã này, thay vào đó
cho phép chúng trong đầu vào. Nếu bạn cần lính canh, thay vào đó họ phải là thứ gì đó
không phải là Unicode hợp pháp. Đối với dữ liệu UTF-8, bạn có thể sử dụng các byte 0xC1 và 0xC2 làm các vệ tinh, như
chúng không bao giờ xuất hiện trong UTF-8 được định hình tốt. (Có các tương đương cho UTF-EBCDIC). Bạn có thể
cũng lưu trữ các điểm mã Unicode của bạn trong các biến số nguyên và sử dụng các giá trị âm như
lính canh.
Nếu bạn không viết một công cụ như vậy, thì việc bạn có chấp nhận các ký tự không khi đầu vào hay không là tùy thuộc vào
bạn (mặc dù Tiêu chuẩn khuyến nghị bạn không). Nếu bạn kiểm tra luồng đầu vào nghiêm ngặt
với Perl, những điểm mã này tiếp tục bị cấm. Điều này là để duy trì sự lạc hậu
khả năng tương thích (nếu không, các lỗ hổng bảo mật tiềm ẩn có thể mở ra, như một điều không nghi ngờ
ứng dụng đã được viết với giả định rằng các ký tự không phải là ký tự sẽ được lọc ra trước đó
nhận được nó, bây giờ có thể, mà không cần cảnh báo, bắt đầu nhận được chúng). Để kiểm tra nghiêm ngặt,
bạn có thể sử dụng lớp ": encoding ('UTF-8')".
Perl tiếp tục cảnh báo (sử dụng danh mục cảnh báo "nonchar", là một danh mục phụ của
"utf8") nếu một nỗ lực được thực hiện để xuất ra các ký tự không phải.
Ngoài Unicode mã điểm
Điểm mã Unicode tối đa là "U + 10FFFF" và Unicode chỉ xác định các hoạt động trên mã
điểm qua đó. Nhưng Perl hoạt động trên các điểm mã lên đến mức tối đa cho phép
số không dấu có sẵn trên nền tảng. Tuy nhiên, Perl sẽ không chấp nhận những điều này từ đầu vào
luồng trừ khi các quy tắc lỏng lẻo đang được sử dụng và sẽ cảnh báo (sử dụng danh mục cảnh báo
"non_unicode", là một danh mục con của "utf8") nếu có là đầu ra.
Vì các quy tắc Unicode không được xác định trên các điểm mã này, nếu một hoạt động do Unicode xác định
được thực hiện trên chúng, Perl sử dụng những gì chúng tôi tin là các quy tắc hợp lý, đồng thời cảnh báo chung,
sử dụng danh mục "non_unicode". Ví dụ: "uc (" \ x {11_0000} ")" sẽ tạo ra một
cảnh báo, trả về tham số đầu vào là kết quả của nó, vì Perl xác định chữ hoa của
mọi điểm mã không phải Unicode là điểm mã của chính nó. (Tất cả các trường hợp thay đổi
các phép toán, không chỉ viết hoa, hoạt động theo cách này.)
Tình huống khớp với các thuộc tính Unicode trong biểu thức chính quy, "\ p {}" và
Các cấu trúc "\ P {}" so với các điểm mã này không rõ ràng như thế nào và chúng như thế nào
đã thay đổi vì chúng tôi đã có kinh nghiệm.
Một khả năng là coi bất kỳ trận đấu nào với các điểm mã này là không xác định. Nhưng kể từ khi
Perl không có khái niệm về một trận đấu là không xác định, nó chuyển điều này thành không thành công hoặc
"SAI". Đây gần như là, nhưng không hoàn toàn, những gì Perl đã làm từ v5.14 (khi sử dụng những đoạn mã này
các điểm thường trở nên đáng tin cậy) thông qua v5.18. Sự khác biệt là Perl đã đối xử với tất cả
"\ p {}" khớp là không thành công, nhưng tất cả "\ P {}" khớp là thành công.
Một vấn đề với điều này là nó dẫn đến các kết quả không mong muốn và khó hiểu trong một số
các trường hợp:
chr(0x110000) = ~ \ p {ASCII_Hex_Digit = True} # Không thành công trên <= v5.18
chr(0x110000) = ~ \ p {ASCII_Hex_Digit = False} # Không thành công! trên <= v5.18
Có nghĩa là, nó coi cả hai kết quả trùng khớp là không xác định và chuyển đổi giá trị đó thành sai (nâng
cảnh báo trên mỗi). Trường hợp đầu tiên là kết quả mong đợi, nhưng trường hợp thứ hai có khả năng
phản trực giác: "Làm thế nào cả hai có thể sai khi chúng là bổ sung?" Một vấn đề khác
là việc triển khai đã tối ưu hóa nhiều thuộc tính Unicode phù hợp với
hiện có các hoạt động đơn giản hơn, nhanh hơn, không làm tăng cảnh báo. Chúng tôi đã chọn để không từ bỏ
những tối ưu hóa đó, giúp ích cho phần lớn các trận đấu, chỉ để tạo ra một cảnh báo
đối với trường hợp không chắc chắn rằng một điểm mã Unicode trên đang được so khớp với.
Do những vấn đề này, bắt đầu từ v5.20, những gì Perl làm là xử lý
mã chỉ là các ký tự Unicode chưa được gán điển hình và khớp tương ứng.
(Lưu ý: Unicode có các điểm mã chưa được gán không điển hình. Ví dụ: nó có mã không ký tự
điểm và những điểm mà khi chúng được chỉ định sẽ được ghi là Quyền được thực hiện
trái, như tiếng Ả Rập và tiếng Do Thái. Perl giả định rằng không có điểm mã không phải Unicode nào có
thuộc tính không điển hình.)
Perl, trong hầu hết các trường hợp, sẽ đưa ra cảnh báo khi khớp với điểm mã Unicode trên
chống lại thuộc tính Unicode khi kết quả là "TRUE" cho "\ p {}" và "FALSE" cho "\ P {}".
Ví dụ:
chr(0x110000) = ~ \ p {ASCII_Hex_Digit = True} # Lỗi, không có cảnh báo
chr(0x110000) = ~ \ p {ASCII_Hex_Digit = False} # Thành công, có cảnh báo
Trong cả hai ví dụ này, ký tự được so khớp không phải là Unicode, vì vậy Unicode không
xác định nó phải khớp như thế nào. Nó rõ ràng không phải là một chữ số lục phân ASCII, vì vậy ví dụ đầu tiên
rõ ràng sẽ thất bại, và vì vậy nó xảy ra, không có cảnh báo. Nhưng có thể cho rằng thứ hai
ví dụ phải có một kết quả không xác định, do đó "FALSE",. Vì vậy, một cảnh báo được đưa ra cho nó.
Do đó, cảnh báo được đưa ra đối với ít trường hợp hơn ở Perls trước đó và chỉ khi những gì
kết quả là có thể được tranh luận. Nó chỉ ra rằng không có tối ưu hóa nào được thực hiện bởi Perl
(hoặc có khả năng được thực hiện) khiến cảnh báo bị bỏ qua, vì vậy nó giải quyết được cả hai
vấn đề của cách tiếp cận trước đó của Perl. Thuộc tính được sử dụng phổ biến nhất bị ảnh hưởng bởi
thay đổi này là "\ p {Unassigned}", là một dạng viết tắt của
"\ p {General_Category = Unassigned}". Bắt đầu từ v5.20, tất cả các điểm mã không phải Unicode là
được coi là "Chưa được chỉ định". Trong các bản phát hành trước đó, các trận đấu không thành công vì kết quả là
được coi là không xác định.
Nơi duy nhất mà cảnh báo không được đưa ra khi đáng lẽ phải xảy ra là nếu
tối ưu hóa khiến cho toàn bộ mẫu đối sánh thậm chí không được thử. Ví dụ, Perl
có thể tìm ra rằng để một chuỗi khớp với một mẫu biểu thức chính quy nhất định, chuỗi
phải chứa chuỗi con "foobar". Trước khi thử trận đấu, Perl có thể tìm kiếm
chuỗi con đó, và nếu không được tìm thấy, ngay lập tức thất bại so khớp mà không thực sự thử nó;
vì vậy không có cảnh báo nào được tạo ngay cả khi chuỗi chứa điểm mã Unicode ở trên.
Hành vi này mang tính "Làm theo ý tôi" hơn trong Perls trước đó cho hầu hết các ứng dụng. Nhưng
nó bắt ít vấn đề hơn đối với mã cần tuân thủ nghiêm ngặt Unicode. Vì vậy
có một chế độ hoạt động bổ sung có sẵn để phù hợp với mã như vậy. Chế độ này là
được bật nếu một mẫu biểu thức chính quy được biên dịch trong phạm vi từ vựng trong đó
lớp cảnh báo "non_unicode" đã được thực hiện nghiêm trọng, giả sử bởi:
sử dụng cảnh báo FATAL => "non_unicode"
(xem cảnh báo). Ở chế độ hoạt động này, Perl sẽ nâng cảnh báo cho tất cả các trận đấu
chống lại một điểm mã không phải Unicode (không chỉ những điểm đáng tranh cãi) và nó bỏ qua
tối ưu hóa có thể khiến cảnh báo không được xuất ra. (Hiện tại nó vẫn không
cảnh báo nếu trận đấu thậm chí không được cố gắng, như trong ví dụ "foobar" ở trên.)
Tóm lại, Perl hiện nay thường coi các điểm mã không phải Unicode là Unicode điển hình chưa được gán
điểm mã cho các đối sánh biểu thức chính quy, chỉ đưa ra cảnh báo khi có thể tranh luận được
kết quả sẽ như thế nào. Tuy nhiên, nếu cảnh báo này đã được thực hiện nghiêm trọng, nó không
bỏ qua.
Có một ngoại lệ cho tất cả điều này. "\ p {All}" trông giống như một thuộc tính Unicode, nhưng nó là một
Phần mở rộng Perl được xác định là đúng cho tất cả các điểm mã có thể có, Unicode hoặc không, vì vậy
không có cảnh báo nào được tạo ra khi đối sánh điểm này với điểm mã không phải Unicode. (Trước
sang v5.20, nó là từ đồng nghĩa chính xác với "\ p {Any}", khớp mã từ 0 đến 0x10FFFF.)
Bảo mật Những gợi ý of Unicode
Đầu tiên, hãy đọc Cân nhắc về bảo mật Unicodehttp://www.unicode.org/reports/tr36>.
Ngoài ra, hãy lưu ý những điều sau:
· UTF-8 không đúng định dạng
Thật không may, đặc điểm kỹ thuật ban đầu của UTF-8 để lại một số chỗ để giải thích
trong số bao nhiêu byte đầu ra được mã hóa mà người ta sẽ tạo ra từ một Unicode đầu vào
tính cách. Nói một cách chính xác, trình tự ngắn nhất có thể có của các byte UTF-8 phải là
được tạo ra, bởi vì nếu không có khả năng xảy ra tràn bộ đệm đầu vào tại
nhận cuối của kết nối UTF-8. Perl luôn tạo độ dài ngắn nhất UTF-8,
và khi bật cảnh báo, Perl sẽ cảnh báo về độ dài không ngắn nhất UTF-8 cùng với các
các dị dạng, chẳng hạn như các đại diện, không phải là điểm mã Unicode hợp lệ cho
trao đổi.
· Đối sánh mẫu biểu thức chính quy có thể làm bạn ngạc nhiên nếu bạn không quen với
Bảng mã Unicode. Bắt đầu từ Perl 5.14, một số công cụ sửa đổi mẫu có sẵn để kiểm soát
cái này, được gọi là bộ sửa đổi bộ ký tự. Chi tiết được đưa ra trong "Bộ ký tự
bổ ngữ "trong perlre.
Như đã thảo luận ở những nơi khác, Perl có một chân (hai móng guốc?) Được trồng ở mỗi thế giới:
thế giới cũ của ASCII và ngôn ngữ byte đơn, và thế giới mới của Unicode, nâng cấp khi
cần thiết. Nếu mã kế thừa của bạn không sử dụng Unicode một cách rõ ràng, không có chuyển đổi tự động
sang Unicode sẽ xảy ra.
Unicode in Perl on EBCDIC
Unicode được hỗ trợ trên nền tảng EBCDIC. Xem perlebcdic.
Trừ khi các vấn đề ASCII so với EBCDIC đang được thảo luận cụ thể, các tham chiếu đến UTF-8
mã hóa trong tài liệu này và các nơi khác nên được đọc là UTF-EBCDIC trên EBCDIC
nền tảng. Xem "Unicode và UTF" trong perlebcdic.
Bởi vì UTF-EBCDIC rất giống với UTF-8, những điểm khác biệt chủ yếu bị bạn che giấu;
"use utf8" (và KHÔNG phải cái gì đó giống như "use utfebcdic") tuyên bố tập lệnh nằm trong
mã hóa 8 bit "nguyên gốc" của nền tảng Unicode. (Tương tự cho lớp ": utf8".)
địa phương
Xem "Unicode và UTF-8" trong perllocale
Thời Gian Unicode Liệu Không Xảy ra
Vẫn còn nhiều nơi mà Unicode (trong một số bảng mã hoặc cách khác) có thể được cung cấp như
đối số hoặc nhận được dưới dạng kết quả, hoặc cả hai trong Perl, nhưng không phải vậy, mặc dù Perl có
các cách mở rộng để nhập và xuất bằng Unicode, và một số "điểm nhập" khác như
Mảng @ARGV (đôi khi có thể được hiểu là UTF-8).
Sau đây là các giao diện như vậy. Ngoài ra, hãy xem "" Lỗi Unicode "". Đối với tất cả những điều này
giao diện Perl hiện tại (kể từ v5.16.0) chỉ đơn giản giả sử các chuỗi byte cả hai như là các đối số
và kết quả hoặc chuỗi UTF-8 nếu pragma "mã hóa" (không được dùng nữa) đã được sử dụng.
Một lý do mà Perl không cố gắng giải quyết vai trò của Unicode trong những tình huống này
là câu trả lời phụ thuộc nhiều vào hệ điều hành và (các) hệ thống tệp.
Ví dụ: liệu tên tệp có thể ở dạng Unicode và ở dạng mã hóa chính xác hay không, là
không chính xác là một khái niệm di động. Tương tự đối với "qx" và "system":
"giao diện dòng lệnh" (và cái nào trong số đó?) xử lý Unicode?
· "Chdir", "chmod", "chown", "chroot", "executive", "link", "lstat", "mkdir", "rename",
"rmdir", "stat", "symlink", "truncate", "unlink", "utime", "-X"
·% ENV
· "Cầu" (hay còn gọi là "<*>")
· "Open", "opendir", "sysopen"
· "Qx" (hay còn gọi là toán tử backtick), "hệ thống"
· "Readdir", "readlink"
Sản phẩm "Unicode Sâu bọ"
Thuật ngữ "lỗi Unicode" đã được áp dụng cho sự không nhất quán với các điểm mã trong
Khối "Phần bổ sung Latin-1", nghĩa là từ 128 đến 255. Không có ngôn ngữ được chỉ định,
không giống như tất cả các ký tự hoặc điểm mã khác, những ký tự này có thể có
ngữ nghĩa tùy thuộc vào các quy tắc có hiệu lực. (Nhân vật có điểm mã trên 255
buộc các quy tắc Unicode; trong khi các quy tắc cho các ký tự ASCII giống nhau trong cả ASCII
và các quy tắc Unicode.)
Theo quy tắc Unicode, các ký tự Latinh1 phía trên này được hiểu là các điểm mã Unicode,
có nghĩa là chúng có cùng ngữ nghĩa với các điều khiển Latin-1 (ISO-8859-1) và C1.
Như đã giải thích trong "Quy tắc ASCII so với Quy tắc Unicode", theo quy tắc ASCII, chúng được coi là
là các ký tự chưa được gán.
Điều này có thể dẫn đến kết quả không mong muốn. Ví dụ, ngữ nghĩa của một chuỗi có thể đột ngột
thay đổi nếu một điểm mã trên 255 được nối vào nó, điều này sẽ thay đổi các quy tắc từ ASCII thành
Bảng mã Unicode. Ví dụ, hãy xem xét chương trình sau và đầu ra của nó:
$ perl -le '
không có tính năng 'unicode_strings';
$ s1 = "\ xC2";
$ s2 = "\ x {2660}";
cho ($ s1, $ s2, $ s1. $ s2) {
print / \ w / || Số 0;
}
'
0
0
1
Nếu không có "\ w" trong "s1" hoặc trong "s2", tại sao nối của chúng lại có một?
Sự bất thường này bắt nguồn từ nỗ lực của Perl để không làm phiền các chương trình cũ không sử dụng
Unicode, cùng với mong muốn của Perl để thêm hỗ trợ Unicode một cách liền mạch. Nhưng kết quả
hóa ra không được liền mạch. (Nhân tiện, bạn có thể chọn được cảnh báo khi những thứ như
điều này xảy ra. Xem "mã hóa :: cảnh báo".)
"use feature 'unicode_strings'" đã được thêm vào, bắt đầu từ Perl v5.12, để giải quyết vấn đề này
vấn đề. Nó ảnh hưởng đến những điều này:
· Thay đổi trường hợp của đại lượng vô hướng, nghĩa là, sử dụng "uc ()", "ucfirst ()", "lc ()", và
"lcfirst ()" hoặc "\ L", "\ U", "\ u" và "\ l" trong ngữ cảnh kép, chẳng hạn như thông thường
thay thế biểu thức.
Dưới "unicode_strings" bắt đầu trong Perl 5.12.0, các quy tắc Unicode thường được sử dụng.
Xem "lc" trong perlfunc để biết chi tiết về cách thức hoạt động của tính năng này kết hợp với các
thực dụng.
· Sử dụng so khớp biểu thức chính quy caseless ("/ i").
Bắt đầu từ Perl 5.14.0, các biểu thức chính quy được biên dịch trong phạm vi của
"unicode_strings" sử dụng các quy tắc Unicode ngay cả khi được thực thi hoặc biên dịch thành thông thường lớn hơn
biểu thức bên ngoài phạm vi.
· Đối sánh bất kỳ thuộc tính nào trong số các thuộc tính trong biểu thức chính quy.
Các thuộc tính này là "\ b" (không có dấu ngoặc nhọn), "\ B" (không có dấu ngoặc nhọn), "\ s", "\ S", "\ w",
"\ W" và tất cả các lớp ký tự Posix ngoại trừ "[[: ascii:]]".
Bắt đầu từ Perl 5.14.0, các biểu thức chính quy được biên dịch trong phạm vi của
"unicode_strings" sử dụng các quy tắc Unicode ngay cả khi được thực thi hoặc biên dịch thành thông thường lớn hơn
biểu thức bên ngoài phạm vi.
· Trong "quotemeta" hoặc tương đương trong dòng của nó "\ Q".
Bắt đầu từ Perl 5.16.0, các quy tắc trích dẫn nhất quán được sử dụng trong phạm vi
"unicode_strings", như được mô tả trong "quotemeta" trong perlfunc. Trước đó, hoặc bên ngoài
phạm vi của nó, không có điểm mã nào trên 127 được trích dẫn trong chuỗi mã hóa UTF-8, nhưng ở dạng byte
các chuỗi được mã hóa, các điểm mã trong khoảng từ 128-255 luôn được trích dẫn.
Bạn có thể thấy ở trên rằng hiệu ứng của "unicode_strings" đã tăng lên qua một số
Perl phát hành. (Và sự hỗ trợ của Perl dành cho Unicode tiếp tục được cải thiện; tốt nhất là sử dụng
bản phát hành mới nhất hiện có để có được kết quả đầy đủ và chính xác nhất có thể.)
Lưu ý rằng "unicode_strings" được tự động chọn nếu bạn "sử dụng 5.012" trở lên.
Đối với Perls sớm hơn những Perls được mô tả ở trên hoặc khi một chuỗi được chuyển đến một hàm
ngoài phạm vi của "unicode_strings", hãy xem phần tiếp theo.
Buộc Unicode in Perl (Hoặc là Không ép buộc Unicode in Perl)
Đôi khi (xem "Khi Unicode không xảy ra" hoặc "" Lỗi Unicode "") có những tình huống
trong đó bạn chỉ cần buộc một chuỗi byte thành UTF-8 hoặc ngược lại. Chuẩn mực
Mã hóa mô-đun có thể được sử dụng cho việc này hoặc các lệnh gọi cấp thấp "utf8 :: nâng cấp ($ bytestring)"
và "utf8 :: downgrade ($ utf8string [, FAIL_OK])".
Lưu ý rằng "utf8 :: downgrade ()" có thể không thành công nếu chuỗi chứa các ký tự không vừa
thành một byte.
Gọi một trong hai hàm trên một chuỗi đã ở trạng thái mong muốn là một điều không cần thiết.
"Quy tắc ASCII so với Quy tắc Unicode" cung cấp tất cả các cách mà một chuỗi được tạo ra để sử dụng Unicode
quy tắc.
Sử dụng Unicode in XS
Xem "Hỗ trợ Unicode" trong perlguts để biết phần giới thiệu về Unicode ở cấp XS và
"Hỗ trợ Unicode" trong perlapi để biết chi tiết về API.
hack Perl đến công việc on sớm hơn Unicode phiên bản (Đối với rất nghiêm trọng tin tặc chỉ)
Perl theo mặc định đi kèm với phiên bản Unicode được hỗ trợ mới nhất được tích hợp sẵn, nhưng mục tiêu là
để cho phép bạn thay đổi để sử dụng bất kỳ cái nào trước đó. Tuy nhiên, trong Perls v5.20 và v5.22,
phiên bản có thể sử dụng sớm nhất là Unicode 5.1. Perl v5.18 có thể xử lý tất cả sớm hơn
phiên bản.
Tải xuống các tệp trong phiên bản Unicode mong muốn từ trang web Unicode
<http://www.unicode.org>). Các tệp này sẽ thay thế các tệp hiện có trong lib / unicore trong
Cây nguồn Perl. Làm theo hướng dẫn trong README.perl trong thư mục đó để thay đổi một số
tên của họ, và sau đó xây dựng perl (xem CÀI ĐẶT).
Chuyển mã từ perl-5.6X
Perls bắt đầu từ 5.8 có mô hình Unicode khác với 5.6. Trong 5.6 lập trình viên đã
bắt buộc phải sử dụng pragma "utf8" để tuyên bố rằng một phạm vi nhất định dự kiến sẽ xử lý
Dữ liệu Unicode và phải đảm bảo rằng chỉ có dữ liệu Unicode đạt được phạm vi đó. nếu bạn
có mã đang hoạt động với 5.6, bạn sẽ cần một số điều chỉnh sau để
ma cua ban. Các ví dụ được viết sao cho mã sẽ tiếp tục hoạt động trong phiên bản 5.6, vì vậy
bạn nên an toàn để thử chúng.
· Một bộ xử lý tệp có thể đọc hoặc ghi UTF-8
nếu ($]> 5.008) {
binmode $ fh, ": encoding (utf8)";
}
· Một đại lượng vô hướng sẽ được chuyển cho một số phần mở rộng
Có thể là "Compress :: Zlib", "Apache :: Request" hoặc bất kỳ tiện ích mở rộng nào không đề cập đến
Unicode trong manpage, bạn cần đảm bảo rằng cờ UTF8 đã được gỡ bỏ. Ghi chú
rằng tại thời điểm viết bài này (tháng 2012 năm XNUMX), các mô-đun được đề cập không
UTF-8-nhận biết. Vui lòng kiểm tra tài liệu để xác minh xem điều này có còn đúng không.
nếu ($]> 5.008) {
yêu cầu Mã hóa;
$ val = Mã hóa :: encode_utf8 ($ val); # tạo các octet
}
· Một đại lượng vô hướng mà chúng tôi nhận được từ một tiện ích mở rộng
Nếu bạn tin rằng vô hướng quay trở lại là UTF-8, bạn rất có thể sẽ muốn có cờ UTF8
đã khôi phục:
nếu ($]> 5.008) {
yêu cầu Mã hóa;
$ val = Mã hóa :: decode_utf8 ($ val);
}
· Tương tự, nếu bạn thực sự chắc chắn đó là UTF-8
nếu ($]> 5.008) {
yêu cầu Mã hóa;
Mã hóa :: _ utf8_on ($ val);
}
· Một trình bao bọc cho DBI "fetchrow_array" và "fetchrow_hashref"
Khi cơ sở dữ liệu chỉ chứa UTF-8, một hàm hoặc phương thức trình bao bọc là một cách thuận tiện
để thay thế tất cả các lệnh gọi "fetchrow_array" và "fetchrow_hashref" của bạn. Một hàm trình bao bọc
cũng sẽ giúp bạn dễ dàng thích ứng với các cải tiến trong tương lai trong trình điều khiển cơ sở dữ liệu của bạn. Ghi chú
rằng tại thời điểm viết bài này (tháng 2012 năm XNUMX), DBI không có cách nào được tiêu chuẩn hóa để
xử lý dữ liệu UTF-8. Vui lòng kiểm tra tài liệu DBI để xác minh xem vẫn còn
sự thật.
tìm nạp phụ {
# $ một trong số fetchrow_ {array, hashref} là gì
của tôi ($ self, $ sth, $ cái gì) = @_;
nếu ($] <5.008) {
return $ sth -> $ cái gì;
} Else {
yêu cầu Mã hóa;
if (nến muốn) {
my @arr = $ sth -> $ cái gì;
cho (@arr) {
được định nghĩa && / [^ \ 000- \ 177] / && Mã hóa :: _ utf8_on ($ _);
}
trả về @arr;
} Else {
của tôi $ ret = $ sth -> $ cái gì;
if (ref $ ret) {
cho $ k của tôi (các khóa% $ ret) {
xác định
&& / [^ \ 000- \ 177] /
&& Mã hóa :: _ utf8_on ($ _) cho $ ret -> {$ k};
}
trả về $ ret;
} Else {
được định nghĩa && / [^ \ 000- \ 177] / && Mã hóa :: _ utf8_on ($ _) cho $ ret;
trả về $ ret;
}
}
}
}
· Một đại lượng vô hướng lớn mà bạn biết chỉ có thể chứa ASCII
Các vô hướng chỉ chứa ASCII và được đánh dấu là UTF-8 đôi khi là một lực cản đối với
chương trình. Nếu bạn nhận ra tình huống như vậy, chỉ cần xóa cờ UTF8:
utf8 :: downgrade ($ val) nếu $]> 5.008;
Sử dụng perlunicode trực tuyến bằng các dịch vụ onworks.net