perllocale - Trực tuyến trên đám mây

Đây là perllocale lệnh 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


perllocale - Xử lý ngôn ngữ Perl (quốc tế hóa và bản địa hóa)

MÔ TẢ


Ban đầu có ASCII, "Bộ luật thông tin tiêu chuẩn của Mỹ
Interchange ", hoạt động khá tốt đối với người Mỹ với bảng chữ cái tiếng Anh và đô la của họ-
mệnh giá tiền tệ. Nhưng nó không hoạt động tốt ngay cả đối với những người nói tiếng Anh khác, những người
có thể sử dụng các loại tiền tệ khác nhau, chẳng hạn như đồng bảng Anh (làm biểu tượng cho đơn vị tiền tệ đó
không có trong ASCII); và nó vô vọng không đủ cho nhiều người trong số hàng nghìn người trên thế giới
những ngôn ngữ khác.

Để giải quyết những thiếu sót này, khái niệm ngôn ngữ đã được phát minh (chính thức là ISO C,
XPG4, POSIX 1.c "hệ thống ngôn ngữ"). Và các ứng dụng đã và đang được viết sử dụng
cơ chế ngôn ngữ. Quá trình tạo một ứng dụng như vậy có tính đến
sở thích của người dùng trong những loại vấn đề này được gọi là quốc tế hóa (thường xuyên
Được viết tắt là I18n); nói với một ứng dụng như vậy về một tập hợp các tùy chọn cụ thể là
được biết như nội địa hoá (L10n).

Perl đã được mở rộng để hỗ trợ hệ thống ngôn ngữ. Điều này được kiểm soát cho mỗi ứng dụng
bằng cách sử dụng một pragma, một lệnh gọi hàm và một số biến môi trường.

Thật không may, có một số khiếm khuyết trong thiết kế (và thường là
triển khai) của các ngôn ngữ. Unicode đã được phát minh (xem perlunitut để biết phần giới thiệu về
đó) một phần để giải quyết những khiếm khuyết về thiết kế này, và ngày nay, có một loạt
"Ngôn ngữ UTF-8", dựa trên Unicode. Đây là những ngôn ngữ có bộ ký tự là Unicode,
được mã hóa bằng UTF-8. Bắt đầu từ v5.20, Perl hỗ trợ đầy đủ các ngôn ngữ UTF-8, ngoại trừ
phân loại và so sánh chuỗi. (Sử dụng Unicode :: Collate cho những thứ này.) Perl tiếp tục
cũng hỗ trợ các ngôn ngữ cũ không phải UTF-8. Hiện không có ngôn ngữ UTF-8 nào cho
Nền tảng EBCDIC.

(Unicode cũng đang tạo "CLDR", "Kho lưu trữ dữ liệu ngôn ngữ chung",
<http://cldr.unicode.org/> bao gồm nhiều loại thông tin hơn là có sẵn trong
hệ thống ngôn ngữ POSIX. Tại thời điểm viết bài này, không có mô-đun CPAN nào
cung cấp quyền truy cập vào dữ liệu được mã hóa bằng XML này. Tuy nhiên, nhiều ngôn ngữ của nó có POSIX-
chỉ dữ liệu được trích xuất và có sẵn dưới dạng ngôn ngữ UTF-8 tại
<http://unicode.org/Public/cldr/latest/>.)

IS A ĐỊA ĐIỂM


Ngôn ngữ là một tập hợp dữ liệu mô tả các khía cạnh khác nhau về cách các cộng đồng khác nhau trong
thế giới phân loại thế giới của họ. Các danh mục này được chia thành các loại sau
(một số trong số đó bao gồm một ghi chú ngắn gọn ở đây):

Danh mục "LC_NUMERIC": Định dạng số
Điều này cho biết cách các số nên được định dạng để con người có thể đọc được, ví dụ:
ký tự được sử dụng làm dấu thập phân.

Danh mục "LC_MONETARY": Định dạng số tiền

Danh mục "LC_TIME": Định dạng ngày / giờ

Danh mục "LC_MESSAGES": Lỗi và các thông báo khác
Điều này được chính Perl sử dụng chỉ để truy cập các thông báo lỗi của hệ điều hành qua $!
và $ ^ E.

Danh mục "LC_COLLATE": Đối chiếu
Điều này cho biết thứ tự của các chữ cái để so sánh và sắp xếp. Trong Latin
bảng chữ cái, ví dụ, "b", thường theo sau "a".

Danh mục "LC_CTYPE": Loại ký tự
Điều này cho biết, chẳng hạn nếu một ký tự là một chữ cái viết hoa.

Các loại khác
Một số nền tảng có các danh mục khác, xử lý những thứ như đơn vị đo lường
và các khổ giấy. Không ai trong số này được sử dụng trực tiếp bởi Perl, nhưng các hoạt động bên ngoài
Perl tương tác với có thể sử dụng những. Xem phần "Không thuộc phạm vi" sử dụng ngôn ngữ "" bên dưới.

Dưới đây là chi tiết về các danh mục được Perl sử dụng trong "DANH MỤC ĐỊA ĐIỂM".

Cùng với nhau, các danh mục này sẽ đi một chặng đường dài hướng tới việc có thể tùy chỉnh một chương trình duy nhất
để chạy ở nhiều địa điểm khác nhau. Nhưng có những thiếu sót, vì vậy hãy tiếp tục đọc.

CHUẨN BỊ ĐẾN SỬ DỤNG ĐỊA ĐIỂM


Bản thân Perl (bên ngoài mô-đun POSIX) sẽ không sử dụng ngôn ngữ trừ khi được yêu cầu cụ thể
để (nhưng một lần nữa lưu ý rằng Perl có thể tương tác với mã sử dụng chúng). Ngay cả khi có
một yêu cầu như vậy, tất cả các những điều sau đây phải đúng để nó hoạt động bình thường:

· trên màn hình hoạt động hệ thống phải hỗ trợ các miền địa phương hệ thống. Nếu có, bạn nên tìm
rằng hàm "setlocale ()" là một phần được tài liệu hóa trong thư viện C của nó.

· Định nghĩa cho địa phương việc này bạn sử dụng phải be cài đặt. Bạn hoặc hệ thống của bạn
quản trị viên, phải chắc chắn rằng đây là trường hợp. Các ngôn ngữ có sẵn,
vị trí mà chúng được lưu giữ và cách thức cài đặt chúng đều khác nhau
từ hệ thống này sang hệ thống khác. Một số hệ thống chỉ cung cấp một số ngôn ngữ có dây cứng và không
cho phép nhiều hơn được thêm vào. Những người khác cho phép bạn thêm các ngôn ngữ "đóng hộp" được cung cấp bởi
nhà cung cấp hệ thống. Vẫn còn những người khác cho phép bạn hoặc quản trị viên hệ thống xác định và thêm
miền địa phương tùy ý. (Bạn có thể phải yêu cầu nhà cung cấp của mình cung cấp các ngôn ngữ đóng hộp
không được cung cấp cùng với hệ điều hành của bạn.) Đọc tài liệu hệ thống của bạn để
tiếp tục chiếu sáng.

· Perl phải Tin việc này các miền địa phương hệ thống is hỗ trợ. Nếu đúng, "perl
-V: d_setlocale "sẽ nói rằng giá trị cho" d_setlocale "là" xác định ".

Nếu bạn muốn một ứng dụng Perl xử lý và trình bày dữ liệu của bạn theo một
ngôn ngữ, mã ứng dụng phải bao gồm pragma "sử dụng ngôn ngữ" (xem "" Sử dụng ngôn ngữ "
pragma ") khi thích hợp, và at ít nhất một những điều sau đây phải đúng:

1. xác định ngôn ngữ môi trường biến (xem "MÔI TRƯỜNG") phải be đúng định
up tại thời điểm ứng dụng được khởi động, do chính bạn hoặc bất kỳ ai thiết lập
tài khoản hệ thống của bạn; hoặc

2. ứng dụng phải định của nó riêng miền địa phương sử dụng phương pháp được mô tả trong "The setlocale
hàm số".

SỬ DỤNG ĐỊA ĐIỂM


"sử dụng ngôn ngữ " thực dụng
Theo mặc định, chính Perl (bên ngoài mô-đun POSIX) bỏ qua ngôn ngữ hiện tại. Các
pragma "sử dụng ngôn ngữ" pragma yêu cầu Perl sử dụng ngôn ngữ hiện tại cho một số hoạt động. Bắt đầu từ
v5.16, có các tham số tùy chọn cho pragma này, được mô tả bên dưới, hạn chế
hoạt động bị ảnh hưởng bởi nó.

Ngôn ngữ hiện tại được đặt tại thời điểm thực thi bằng setlocale () được mô tả dưới đây. Nếu điều đó
chức năng chưa được gọi trong quá trình thực thi chương trình, hiện tại
ngôn ngữ là ngôn ngữ được xác định bởi "ENVIRONMENT" có hiệu lực khi bắt đầu
chương trình. Nếu không có môi trường hợp lệ, ngôn ngữ hiện tại là bất kỳ hệ thống nào
mặc định đã được đặt thành. Trên hệ thống POSIX, có thể, nhưng không nhất thiết, chữ "C"
ngôn ngữ. Trên Windows, mặc định được đặt thông qua máy tính
"Bảng Điều khiển-> Tùy chọn Khu vực và Ngôn ngữ" (hoặc tương đương hiện tại của nó).

Các hoạt động bị ảnh hưởng bởi ngôn ngữ là:

Không ở trong các phạm vi of "sử dụng ngôn ngữ "
Chỉ một số hoạt động nhất định có nguồn gốc bên ngoài Perl mới bị ảnh hưởng, như sau:

· Ngôn ngữ hiện tại được sử dụng khi đi ra ngoài Perl với các hoạt động như
hệ thống () hoặc qx //, nếu các hoạt động đó nhạy cảm với ngôn ngữ.

· Ngoài ra Perl cho phép truy cập vào các chức năng thư viện C khác nhau thông qua mô-đun POSIX.
Một số chức năng đó luôn bị ảnh hưởng bởi ngôn ngữ hiện tại. Ví dụ,
"POSIX :: strftime ()" sử dụng "LC_TIME"; "POSIX :: strtod ()" sử dụng "LC_NUMERIC";
"POSIX :: strcoll ()" và "POSIX :: strxfrm ()" sử dụng "LC_COLLATE"; và nhân vật
các hàm phân loại như "POSIX :: isalnum ()" sử dụng "LC_CTYPE". Tất cả như vậy
các chức năng sẽ hoạt động theo ngôn ngữ cơ bản hiện tại, ngay cả khi
ngôn ngữ không được tiếp xúc với không gian Perl.

· Mô-đun XS cho tất cả các danh mục nhưng "LC_NUMERIC" nhận được ngôn ngữ cơ bản và
do đó bất kỳ hàm thư viện C nào mà chúng gọi sẽ sử dụng ngôn ngữ cơ bản đó. Để biết thêm
thảo luận, xem "CAVEATS" trong perlxs.

Lưu ý rằng tất cả các chương trình C (bao gồm cả trình thông dịch perl, được viết bằng C)
luôn có một ngôn ngữ cơ bản. Ngôn ngữ đó là ngôn ngữ "C" trừ khi được thay đổi bởi
gọi tới setlocale (). Khi Perl khởi động, nó sẽ thay đổi ngôn ngữ cơ bản thành
được chỉ ra bởi "ENVIRONMENT". Khi sử dụng mô-đun POSIX hoặc viết XS
mã, điều quan trọng cần lưu ý là ngôn ngữ cơ bản có thể là một cái gì đó
khác với "C", ngay cả khi chương trình không thay đổi nó một cách rõ ràng.

Chần chừ hiệu ứng of "sử dụng ngôn ngữ "
Các hoạt động Perl nhất định được thiết lập trong phạm vi "ngôn ngữ sử dụng" sẽ giữ lại
hiệu lực ngay cả bên ngoài phạm vi. Bao gồm các:

· Định dạng đầu ra của một ghi () được xác định bởi một khai báo định dạng trước đó
("định dạng" trong perlfunc), vì vậy đầu ra có bị ảnh hưởng bởi ngôn ngữ hay không là
được xác định bởi liệu "format ()" có nằm trong phạm vi của "sử dụng ngôn ngữ" hay không, chứ không phải liệu
"write ()" là.

· Các mẫu biểu thức chính quy có thể được biên dịch bằng qr // với đối sánh thực tế
hoãn lại sau. Một lần nữa, đó là việc biên dịch có được thực hiện trong
phạm vi "sử dụng ngôn ngữ" xác định hành vi đối sánh, không phải nếu đối sánh
được thực hiện trong phạm vi như vậy hay không.

Theo ""sử dụng ngôn ngữ ";"
· Tất cả các hoạt động trên

· Định dạng tờ khai ("định dạng" trong perlfunc) và do đó bất kỳ lần sử dụng "write ()" nào tiếp theo
"LC_NUMERIC".

· sự xâu chuỗi đầu ra sử dụng "LC_NUMERIC". Chúng bao gồm các kết quả của
"print ()", "printf ()", "say ()" và "sprintf ()".

· sự so sánh khai thác ("lt", "le", "cmp", "ge" và "gt") sử dụng "LC_COLLATE".
"sort ()" cũng bị ảnh hưởng nếu được sử dụng mà không có hàm so sánh rõ ràng, bởi vì
nó sử dụng "cmp" theo mặc định.

Lưu ý: "eq" và "ne" không bị ảnh hưởng bởi ngôn ngữ: chúng luôn thực hiện một char-by-char
so sánh các toán hạng vô hướng của chúng. Hơn nữa, nếu "cmp" thấy rằng
toán hạng bằng nhau theo trình tự đối chiếu được chỉ định bởi dòng điện
ngôn ngữ, nó tiếp tục thực hiện so sánh char-by-char và chỉ trả về 0
(bằng nhau) nếu các toán hạng là char-for-char giống hệt nhau. Nếu bạn thực sự muốn biết
liệu hai chuỗi - mà "eq" và "cmp" có thể coi là khác nhau - có bằng nhau không
vì liên quan đến đối chiếu trong ngôn ngữ, hãy xem thảo luận trong "Danh mục
"LC_COLLATE": Đối chiếu ".

· Đều đặn biểu thức sửa đổi trường hợp chức năng ("uc ()", "lc ()", "ucfirst ()",
và "lcfirst ()") sử dụng "LC_CTYPE"

· biến $! (và các từ đồng nghĩa của nó $ ERRNO và $ OS_ERROR) $ ^ E (và từ đồng nghĩa của nó
$ EXTENDED_OS_ERROR) khi được sử dụng làm chuỗi, hãy sử dụng "LC_MESSAGES".

Hành vi mặc định được khôi phục với pragma "không có ngôn ngữ" hoặc khi đạt đến cuối
khối bao quanh "sử dụng ngôn ngữ". Lưu ý rằng các cuộc gọi "sử dụng ngôn ngữ" có thể được lồng vào nhau và
những gì có hiệu lực trong phạm vi bên trong sẽ trở lại các quy tắc của phạm vi bên ngoài ở cuối
của phạm vi bên trong.

Kết quả chuỗi của bất kỳ thao tác nào sử dụng thông tin ngôn ngữ đều bị nhiễm bẩn, như nó vốn có
có thể cho một ngôn ngữ là không đáng tin cậy. Xem "BẢO MẬT".

Bắt đầu trong Perl v5.16 một cách rất hạn chế và nói chung là trong v5.22, bạn có thể
hạn chế danh mục hoặc các danh mục được kích hoạt bởi phiên bản cụ thể này của
pragma bằng cách thêm các tham số vào nó. Ví dụ,

sử dụng locale qw (: ctype: numeric);

cho phép nhận biết ngôn ngữ trong phạm vi của nó chỉ với những hoạt động (được liệt kê ở trên)
bị ảnh hưởng bởi "LC_CTYPE" và "LC_NUMERIC".

Các danh mục có thể có là: ": collate", ": ctype", ": messages", ": currency", ": numeric",
": time" và danh mục giả ": ký tự" (được mô tả bên dưới).

Vì vậy, bạn có thể nói

sử dụng ngôn ngữ ': tin nhắn';

và chỉ $! và $ ^ E sẽ nhận biết được ngôn ngữ. Mọi thứ khác không bị ảnh hưởng.

Vì Perl hiện không làm gì với danh mục "LC_MONETARY", chỉ định
": money" thực sự không có tác dụng gì. Một số hệ thống có các danh mục khác, chẳng hạn như
"LC_PAPER_SIZE", nhưng Perl cũng không biết gì về họ và không có cách nào để
chỉ định chúng trong các đối số của pragma này.

Bạn cũng có thể dễ dàng nói sử dụng tất cả các danh mục, trừ một trong hai, ví dụ:

sử dụng ngôn ngữ ':! ctype';
sử dụng ngôn ngữ ': not_ctype';

cả hai đều có nghĩa là bật tính năng cảnh báo ngôn ngữ của tất cả các danh mục trừ "LC_CTYPE". Chỉ một
đối số danh mục có thể được chỉ định trong "sử dụng ngôn ngữ" nếu nó ở dạng phủ định.

Trước v5.22, chỉ có một dạng pragma với các đối số có sẵn:

sử dụng ngôn ngữ ': not_characters';

(và bạn phải nói "not_"; bạn không thể sử dụng dạng bang "!"). Thể loại giả này là một
viết tắt để chỉ định cả ": collate" và ": ctype". Do đó, ở dạng phủ định, nó là
gần giống như nói

sử dụng locale qw (: tin nhắn: tiền tệ: số: thời gian);

Chúng tôi sử dụng thuật ngữ "gần như", vì ": not_characters" cũng bật
"use feature 'unicode_strings'" trong phạm vi của nó. Biểu mẫu này ít hữu ích hơn trong v5.20 và
sau đó, và được mô tả đầy đủ trong "Unicode và UTF-8", nhưng ngắn gọn, nó nói với Perl không
sử dụng các phần ký tự của định nghĩa ngôn ngữ, đó là "LC_CTYPE" và
Danh mục "LC_COLLATE". Thay vào đó, nó sẽ sử dụng bộ ký tự gốc (được mở rộng bởi
Unicode). Khi sử dụng tham số này, bạn có trách nhiệm lấy
bộ ký tự được dịch sang bộ ký tự gốc / Unicode (nó sẽ là nếu nó là
một trong những ngôn ngữ UTF-8 ngày càng phổ biến). Có nhiều cách thuận tiện để làm điều này,
như được mô tả trong "Unicode và UTF-8".

định vị chức năng
Bạn có thể chuyển đổi ngôn ngữ thường xuyên như bạn muốn tại thời gian chạy với "POSIX :: setlocale ()"
chức năng:

# Nhập bộ công cụ xử lý ngôn ngữ từ mô-đun POSIX.
# Ví dụ này sử dụng: setlocale - lệnh gọi hàm
# LC_CTYPE - giải thích bên dưới
# (Hiển thị thử nghiệm thành công / thất bại của các hoạt động là
# bỏ qua trong các ví dụ này để tránh làm mất tập trung vào chính
# chỉ trỏ)

sử dụng POSIX qw (locale_h);
sử dụng ngôn ngữ;
$ old_locale của tôi;

# truy vấn và lưu ngôn ngữ cũ
$ old_locale = setlocale (LC_CTYPE);

setlocale (LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE hiện có bằng ngôn ngữ "Pháp, Canada, bộ mã ISO 8859-1"

setlocale (LC_CTYPE, "");
# LC_CTYPE hiện được đặt lại về mặc định được xác định bởi
# Biến môi trường LC_ALL / LC_CTYPE / LANG hoặc hệ thống
# vỡ nợ. Xem tài liệu bên dưới.

# khôi phục ngôn ngữ cũ
setlocale (LC_CTYPE, $ old_locale);

Điều này đồng thời ảnh hưởng đến tất cả các luồng của chương trình, vì vậy có thể có vấn đề khi sử dụng
ngôn ngữ trong các ứng dụng luồng ngoại trừ trường hợp có một ngôn ngữ duy nhất áp dụng cho tất cả
chủ đề.

Đối số đầu tiên của "setlocale ()" cho thể loại, thứ hai miền địa phương. Các
danh mục cho biết khía cạnh xử lý dữ liệu mà bạn muốn áp dụng các quy tắc theo ngôn ngữ cụ thể.
Tên danh mục được thảo luận trong "DANH MỤC ĐỊA ĐIỂM" và "MÔI TRƯỜNG". Ngôn ngữ là
tên của một bộ sưu tập thông tin tùy chỉnh tương ứng với một
sự kết hợp của ngôn ngữ, quốc gia hoặc lãnh thổ và bộ mã. Đọc tiếp để biết các gợi ý về
đặt tên miền: không phải tất cả hệ thống đều đặt tên miền như trong ví dụ.

Nếu không có đối số thứ hai được cung cấp và danh mục không phải là "LC_ALL", thì
hàm trả về một chuỗi đặt tên ngôn ngữ hiện tại cho danh mục. Bạn có thể sử dụng cái này
giá trị làm đối số thứ hai trong một lệnh gọi tiếp theo tới "setlocale ()", nhưng trên một số nền tảng
chuỗi không rõ ràng, không phải là thứ mà hầu hết mọi người có thể giải mã được
ngôn ngữ nó có nghĩa là.

Nếu không có đối số thứ hai được cung cấp và danh mục là "LC_ALL", kết quả là
phụ thuộc vào thực thi. Nó có thể là một chuỗi các tên miền được ghép nối (dấu phân tách cũng
phụ thuộc vào triển khai) hoặc một tên ngôn ngữ duy nhất. Hãy tham khảo ý kiến ​​của bạn định vị(3) người đàn ông
trang để biết chi tiết.

Nếu đối số thứ hai được đưa ra và nó tương ứng với một ngôn ngữ hợp lệ, thì ngôn ngữ cho
danh mục được đặt thành giá trị đó và hàm trả về giá trị ngôn ngữ hiện tại. Bạn
sau đó có thể sử dụng điều này trong một cuộc gọi khác tới "setlocale ()". (Trong một số triển khai,
giá trị trả về đôi khi có thể khác với giá trị bạn đã cung cấp làm đối số thứ hai - hãy nghĩ đến
nó như một bí danh cho giá trị bạn đã cung cấp.)

Như ví dụ cho thấy, nếu đối số thứ hai là một chuỗi rỗng, ngôn ngữ của danh mục là
được trả về mặc định được chỉ định bởi các biến môi trường tương ứng. Nói chung,
điều này dẫn đến việc trả về mặc định có hiệu lực khi Perl khởi động: thay đổi thành
môi trường được tạo bởi ứng dụng sau khi khởi động có thể được nhận thấy hoặc không, tùy thuộc vào
trên thư viện C của hệ thống của bạn.

Lưu ý rằng khi một dạng "sử dụng ngôn ngữ" không bao gồm tất cả các danh mục được chỉ định,
Perl bỏ qua các danh mục bị loại trừ.

Nếu "set_locale ()" không thành công vì lý do nào đó (ví dụ: cố gắng đặt thành một ngôn ngữ
hệ thống không xác định), ngôn ngữ cho danh mục không bị thay đổi và chức năng
trả về "undef".

Để biết thêm thông tin về các danh mục, hãy tham khảo định vị(3).

Tìm kiếm địa phương
Đối với các ngôn ngữ có sẵn trong hệ thống của bạn, hãy tham khảo thêm định vị(3) để xem liệu nó có dẫn đến
danh sách các ngôn ngữ có sẵn (tìm kiếm XEM CŨNG THẾ phần). Nếu không thành công, hãy thử
các dòng lệnh sau:

miền địa phương -a

nlsthông tin

ls / usr / lib / nls / loc

ls / usr / lib / locale

ls / usr / lib / nls

ls / usr / share / locale

và xem liệu họ có liệt kê thứ gì đó giống với những

en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
vi_US.iso88591 de_DE.iso88591 ru_RU.iso88595
en_US de_DE ru_RU
en de ru
tiếng anh đức nga
tiếng anh.iso88591 tiếng đức.iso88591 tiếng nga.iso88595
tiếng anh.roman8 tiếng nga.koi8r

Đáng buồn thay, mặc dù giao diện gọi cho "setlocale ()" đã được chuẩn hóa, tên của
ngôn ngữ và các thư mục chưa có cấu hình. Các hình thức cơ bản
tên là lãnh thổ ngôn ngữ.bộ mã, nhưng các phần sau sau Ngôn ngữ không
luôn luôn hiện diện. Các Ngôn ngữđất nước thường là từ các tiêu chuẩn ISO 3166ISO
639, hai chữ cái viết tắt của các quốc gia và ngôn ngữ trên thế giới,
tương ứng. Các bộ mã một phần thường đề cập đến một số ISO 8859 bộ ký tự, tiếng Latinh
các bộ mã. Ví dụ: "ISO 8859-1" là cái gọi là "bộ mã Tây Âu" có thể
được sử dụng để mã hóa hầu hết các ngôn ngữ Tây Âu một cách thích hợp. Một lần nữa, có một số
cách viết ngay cả tên của một tiêu chuẩn đó. Thật đáng tiếc.

Hai ngôn ngữ đặc biệt đáng được đề cập đến: "C" và "POSIX". Hiện tại đây là
thực tế là cùng một ngôn ngữ: sự khác biệt chủ yếu là ngôn ngữ đầu tiên được xác định bởi
Tiêu chuẩn C, tiêu chuẩn thứ hai theo tiêu chuẩn POSIX. Họ xác định mặc định miền địa phương trong đó
mọi chương trình bắt đầu trong trường hợp không có thông tin ngôn ngữ trong môi trường của nó. (Các
mặc định ngôn ngữ mặc định, nếu bạn muốn.) Ngôn ngữ của nó là (Mỹ) tiếng Anh và
bộ mã ký tự ASCII hoặc hiếm khi là bộ siêu của chúng (chẳng hạn như "DEC Multinational
Bộ ký tự (DEC-MCS) "). Cảnh báo. Ngôn ngữ C do một số nhà cung cấp phân phối có thể không
thực sự khớp chính xác với những gì tiêu chuẩn C yêu cầu. Cẩn thận.

LƯU Ý: Không phải tất cả các hệ thống đều có ngôn ngữ "POSIX" (không phải tất cả các hệ thống đều tuân theo POSIX), vì vậy
sử dụng "C" khi bạn cần xác định rõ ràng ngôn ngữ mặc định này.

ĐỊA ĐIỂM VẤN ĐỀ
Bạn có thể gặp thông báo cảnh báo sau khi khởi động Perl:

perl: cảnh báo: Không thể đặt ngôn ngữ.
perl: cảnh báo: Vui lòng kiểm tra xem cài đặt ngôn ngữ của bạn:
LC_ALL = "En_US",
LANG = (chưa đặt)
được hỗ trợ và cài đặt trên hệ thống của bạn.
perl: cảnh báo: Quay lại ngôn ngữ chuẩn ("C").

Điều này có nghĩa là cài đặt ngôn ngữ của bạn đã đặt "LC_ALL" thành "En_US" và LANG tồn tại nhưng có
không có giá trị. Perl cố gắng tin bạn nhưng không thể. Thay vào đó, Perl đã bỏ cuộc và quay trở lại
đến ngôn ngữ "C", ngôn ngữ mặc định được cho là hoạt động bất kể điều gì. (Trên
Windows, trước tiên nó cố gắng quay trở lại ngôn ngữ mặc định của hệ thống.) Điều này thường có nghĩa là
cài đặt ngôn ngữ của bạn bị sai, chúng đề cập đến các ngôn ngữ mà hệ thống của bạn chưa bao giờ nghe nói đến, hoặc
cài đặt ngôn ngữ trong hệ thống của bạn có vấn đề (ví dụ: một số tệp hệ thống
bị hỏng hoặc mất tích). Có các bản sửa lỗi nhanh chóng và tạm thời cho những sự cố này, cũng như
sửa chữa triệt để và lâu dài hơn.

Kiểm tra cho bị phá vỡ địa phương
Nếu bạn đang xây dựng Perl từ nguồn, tệp bộ thử nghiệm Perl lib / locale.t có thể được sử dụng để
kiểm tra ngôn ngữ trên hệ thống của bạn. Đặt biến môi trường "PERL_DEBUG_FULL_TEST"
đến 1 sẽ làm cho nó xuất ra kết quả chi tiết. Ví dụ, trên Linux, bạn có thể nói

PERL_DEBUG_FULL_TEST = 1 ./perl -T -Ilib lib / locale.t> locale.log 2> & 1

Bên cạnh nhiều thử nghiệm khác, nó sẽ kiểm tra mọi ngôn ngữ mà nó tìm thấy trên hệ thống của bạn để xem liệu chúng có
phù hợp với tiêu chuẩn POSIX. Nếu có lỗi, nó sẽ bao gồm một bản tóm tắt ở gần cuối
đầu ra có ngôn ngữ nào đã vượt qua tất cả các bài kiểm tra của nó, và ngôn ngữ nào không thành công và tại sao.

Tạm thời sửa chữa miền địa phương vấn đề
Hai bản sửa lỗi nhanh nhất là làm cho Perl im lặng về bất kỳ sự mâu thuẫn ngôn ngữ nào
hoặc để chạy Perl theo ngôn ngữ mặc định "C".

Tiếng rên rỉ của Perl về các vấn đề ngôn ngữ có thể được im lặng bằng cách đặt biến môi trường
"PERL_BADLANG" thành "0" hoặc "". Phương pháp này thực sự chỉ quét sạch vấn đề dưới tấm thảm:
bạn bảo Perl im lặng ngay cả khi Perl thấy rằng có điều gì đó không ổn. Đừng ngạc nhiên
nếu sau này có điều gì đó phụ thuộc vào ngôn ngữ hoạt động sai.

Perl có thể được chạy trong ngôn ngữ "C" bằng cách đặt biến môi trường "LC_ALL" thành "C".
Phương pháp này có lẽ văn minh hơn một chút so với phương pháp "PERL_BADLANG", nhưng cài đặt
"LC_ALL" (hoặc các biến ngôn ngữ khác) cũng có thể ảnh hưởng đến các chương trình khác, không chỉ Perl. Trong
đặc biệt, các chương trình bên ngoài chạy từ bên trong Perl sẽ thấy những thay đổi này. Nếu bạn thực hiện
cài đặt mới vĩnh viễn (đọc tiếp), tất cả các chương trình bạn chạy đều thấy những thay đổi. Nhìn thấy
"MÔI TRƯỜNG" cho danh sách đầy đủ các biến môi trường có liên quan và "VỊ TRÍ SỬ DỤNG" cho
hiệu ứng của chúng trong Perl. Hiệu ứng trong các chương trình khác có thể dễ dàng suy luận. Ví dụ,
biến "LC_COLLATE" có thể ảnh hưởng đến loại chương trình (hoặc bất kỳ chương trình nào
sắp xếp "bản ghi" theo thứ tự bảng chữ cái trong hệ thống của bạn được gọi).

Bạn có thể kiểm tra việc thay đổi các biến này tạm thời và nếu các cài đặt mới dường như
trợ giúp, đưa các cài đặt đó vào tệp khởi động shell của bạn. Tham khảo tài liệu địa phương của bạn
để biết chi tiết chính xác. Đối với vỏ giống Bourne (sh, ksh, bash, zsh):

LC_ALL = vi_VN.ISO8859-1
xuất LC_ALL

Điều này giả định rằng chúng ta đã thấy ngôn ngữ "en_US.ISO8859-1" bằng cách sử dụng các lệnh được thảo luận ở trên.
Chúng tôi quyết định thử điều đó thay vì ngôn ngữ bị lỗi ở trên "En_US" - và trong trình bao Cshish
(csh, tcsh)

setenv LC_ALL en_US.ISO8859-1

hoặc nếu bạn có ứng dụng "env", bạn có thể làm (trong bất kỳ trình bao nào)

vi LC_ALL = vi_US.ISO8859-1 perl ...

Nếu bạn không biết mình có shell nào, hãy tham khảo bộ phận trợ giúp tại địa phương của bạn hoặc nơi tương đương.

Vĩnh viễn sửa chữa miền địa phương vấn đề
Các bản sửa lỗi chậm hơn nhưng ưu việt hơn là khi bạn có thể tự mình sửa lỗi
định cấu hình sai các biến môi trường của riêng bạn. Cấu hình sai (hát) của
ngôn ngữ của toàn bộ hệ thống thường yêu cầu sự trợ giúp của quản trị viên hệ thống thân thiện của bạn.

Trước tiên, hãy xem phần trước trong tài liệu này về "Tìm ngôn ngữ". Điều đó cho biết làm thế nào để tìm thấy
ngôn ngữ thực sự được hỗ trợ - và quan trọng hơn là được cài đặt - trên hệ thống của bạn. Trong của chúng tôi
thông báo lỗi ví dụ, các biến môi trường ảnh hưởng đến ngôn ngữ được liệt kê theo thứ tự
tầm quan trọng giảm dần (và các biến chưa đặt không quan trọng). Do đó, có LC_ALL
đặt thành "En_US" hẳn là lựa chọn không tốt, như được hiển thị trong thông báo lỗi. Lần thử đầu tiên
sửa cài đặt ngôn ngữ được liệt kê đầu tiên.

Thứ hai, nếu sử dụng các lệnh được liệt kê, bạn thấy điều gì đó chính xác (các trận đấu tiền tố không
đếm và trường hợp thường tính) như "En_US" không có dấu ngoặc kép, thì bạn sẽ ổn
bởi vì bạn đang sử dụng tên ngôn ngữ cần được cài đặt và có sẵn trong hệ thống của bạn.
Trong trường hợp này, hãy xem "Sửa vĩnh viễn cấu hình ngôn ngữ hệ thống của bạn".

Vĩnh viễn sửa chữa qua một vài thao tác đơn giản về hệ thống miền địa phương cấu hình
Đây là khi bạn nhìn thấy một cái gì đó như:

perl: cảnh báo: Vui lòng kiểm tra xem cài đặt ngôn ngữ của bạn:
LC_ALL = "En_US",
LANG = (chưa đặt)
được hỗ trợ và cài đặt trên hệ thống của bạn.

nhưng sau đó không thể thấy rằng "En_US" được liệt kê bởi các lệnh nêu trên. Bạn có thể thấy
những thứ như "en_US.ISO8859-1", nhưng điều đó không giống nhau. Trong trường hợp này, hãy thử chạy theo
ngôn ngữ mà bạn có thể liệt kê và bằng cách nào đó phù hợp với những gì bạn đã thử. Các quy tắc để đối sánh
tên miền có một chút mơ hồ vì tiêu chuẩn hóa còn yếu trong lĩnh vực này. Xem lại
"Tìm ngôn ngữ" về các quy tắc chung.

Sửa chữa hệ thống miền địa phương cấu hình
Liên hệ với quản trị viên hệ thống (tốt nhất là của chính bạn) và báo cáo thông báo lỗi chính xác
bạn nhận được, và yêu cầu họ đọc cùng tài liệu này mà bạn đang đọc. Họ nên
có thể kiểm tra xem có điều gì sai với cấu hình ngôn ngữ của
hệ thống. Rất tiếc, phần "Tìm ngôn ngữ" hơi mơ hồ về chính xác
lệnh và địa điểm bởi vì những thứ này không được tiêu chuẩn hóa.

localeconv chức năng
Hàm "POSIX :: localeconv ()" cho phép bạn lấy thông tin chi tiết về ngôn ngữ phụ thuộc
thông tin định dạng số được chỉ định bởi "LC_NUMERIC" cơ bản hiện tại và
Các ngôn ngữ "LC_MONETARY" (bất kể có được gọi từ trong phạm vi "sử dụng ngôn ngữ" hay không
hay không). (Nếu bạn chỉ muốn tên của ngôn ngữ hiện tại cho một danh mục cụ thể, hãy sử dụng
"POSIX :: setlocale ()" với một tham số - xem "Hàm setlocale".)

sử dụng POSIX qw (locale_h);

# Nhận tham chiếu đến một băm thông tin phụ thuộc vào ngôn ngữ
$ locale_values ​​= localeconv ();

# Đầu ra danh sách các giá trị được sắp xếp
for (sắp xếp các khóa% $ locale_values) {
printf "% -20s =% s \ n", $ _, $ locale_values ​​-> {$ _}
}

"localeconv ()" không có đối số và trả về a tài liệu tham khảo đến một hàm băm. Chìa khóa của điều này
băm là các tên biến để định dạng, chẳng hạn như "decimal_point" và "nghìn_sep". Các
giá trị là các giá trị tương ứng. Xem "localeconv" trong POSIX để biết ví dụ dài hơn
liệt kê các danh mục mà một triển khai có thể sẽ cung cấp; một số cung cấp nhiều hơn
và những người khác ít hơn. Bạn không cần "sử dụng ngôn ngữ" rõ ràng, bởi vì "localeconv ()" luôn luôn
quan sát ngôn ngữ hiện tại.

Đây là một chương trình ví dụ đơn giản viết lại các tham số dòng lệnh của nó dưới dạng
các số nguyên được định dạng đúng theo ngôn ngữ hiện tại:

sử dụng POSIX qw (locale_h);

# Nhận một số tham số định dạng số của ngôn ngữ
của tôi ($ nghìn_sep, $ grouping) =
@ {localeconv ()} {'Thousand_sep', 'grouping'};

# Áp dụng các giá trị mặc định nếu thiếu các giá trị
$ nghìn_sep = ',' trừ khi $ nghìn_sep;

# grouping và mon_grouping là danh sách được đóng gói
# trong số các số nguyên nhỏ (ký tự) cho biết
# grouping (nghìn_seps và mon_thollions_seps
# là các ngăn chia nhóm) của các số và
# đại lượng tiền tệ. Ý nghĩa của số nguyên:
# 255 nghĩa là không nhóm nữa, 0 nghĩa là lặp lại
# nhóm trước, 1-254 có nghĩa là sử dụng
# làm nhóm hiện tại. Nhóm đi từ
# từ phải sang trái (chữ số từ thấp đến cao). bên trong
# dưới đây chúng tôi gian lận một chút bằng cách không bao giờ sử dụng bất kỳ thứ gì
# khác với nhóm đầu tiên (bất kể đó là gì).
if ($ grouping) {
@grouping = unpack ("C *", $ grouping);
} Else {
@grouping = (3);
}

# Định dạng tham số dòng lệnh cho ngôn ngữ hiện tại
cho (@ARGV) {
$ _ = int; # Chop phần không phải số nguyên
1 trong khi
s / (\ d) (\ d {$ grouping [0]} ($ | $ nghìn_sep)) / $ 1 $ nghìn_sep $ 2 /;
in "$ _";
}
in "\ n";

Lưu ý rằng nếu nền tảng không có sẵn "LC_NUMERIC" và / hoặc "LC_MONETARY" hoặc
được kích hoạt, các phần tử tương ứng của hàm băm sẽ bị thiếu.

I18N :: Langinfo
Một giao diện khác để truy vấn thông tin phụ thuộc vào ngôn ngữ là
Hàm "I18N :: Langinfo :: langinfo ()", có sẵn ít nhất trong các hệ thống giống Unix và VMS.

Ví dụ sau sẽ nhập chính hàm "langinfo ()" và ba hằng số vào
được sử dụng làm đối số cho "langinfo ()": một hằng số cho ngày đầu tiên được viết tắt của tuần
(đánh số bắt đầu từ Chủ nhật = 1) và hai hằng số nữa cho câu khẳng định và
câu trả lời phủ định cho câu hỏi có / không ở ngôn ngữ hiện tại.

sử dụng I18N :: Langinfo qw (langinfo ABDAY_1 YESSTR NOSTR);

của tôi ($ abday_1, $ yesstr, $ nostr)
= map {langinfo} qw (ABDAY_1 YESSTR NOSTR);

in "$ abday_1? [$ yesstr / $ nostr]";

Nói cách khác, trong ngôn ngữ "C" (hoặc tiếng Anh) ở trên có thể sẽ in ra một thứ gì đó
như:

Mặt trời? [có không]

Xem I18N :: Langinfo để biết thêm thông tin.

ĐỊA ĐIỂM THỂ LOẠI


Các phần phụ sau đây mô tả các danh mục ngôn ngữ cơ bản. Ngoài những điều này, một số
các danh mục kết hợp cho phép thao tác nhiều hơn một danh mục cơ bản tại một thời điểm. Nhìn thấy
"MÔI TRƯỜNG" để thảo luận về những điều này.

Phân loại "LC_COLLATE": Đối chiếu
Trong phạm vi của biểu mẫu "sử dụng ngôn ngữ" bao gồm đối chiếu, Perl xem xét
Biến môi trường "LC_COLLATE" để xác định quan điểm của ứng dụng về đối chiếu
(thứ tự) của các ký tự. Ví dụ: "b" theo sau "a" trong bảng chữ cái Latinh, nhưng ở đâu
"a" và "aa" thuộc về? Và trong khi "color" theo sau "chocolate" trong tiếng Anh, thì trong tiếng Anh thì sao
tiếng Tây Ban Nha truyền thống?

Tất cả các đối chiếu sau đây đều có ý nghĩa và bạn có thể gặp bất kỳ đối tượng nào trong số chúng nếu bạn "sử dụng ngôn ngữ".

ABCDE abcde
A a B b C c D d E e
a A b B c C d D e E
abcde ABCDE

Đây là đoạn mã để cho biết các ký tự "từ" ở ngôn ngữ hiện tại, trong đó
thứ tự của ngôn ngữ:

sử dụng ngôn ngữ;
print + (sắp xếp grep / \ w /, map {chr} 0..255), "\ n";

So sánh điều này với các ký tự mà bạn thấy và thứ tự của chúng nếu bạn nói rõ rằng
ngôn ngữ nên được bỏ qua:

không có ngôn ngữ;
print + (sắp xếp grep / \ w /, map {chr} 0..255), "\ n";

Đối chiếu gốc máy này (là những gì bạn nhận được trừ khi "sử dụng ngôn ngữ" xuất hiện
trước đó trong cùng một khối) phải được sử dụng để sắp xếp dữ liệu nhị phân thô, trong khi ngôn ngữ-
đối chiếu phụ thuộc của ví dụ đầu tiên rất hữu ích cho văn bản tự nhiên.

Như đã lưu ý trong "SỬ DỤNG VỊ TRÍ", "cmp" so sánh theo ngôn ngữ đối chiếu hiện tại khi
"sử dụng ngôn ngữ" đang có hiệu lực, nhưng trở lại so sánh char-by-char cho các chuỗi
ngôn ngữ nói là bình đẳng. Bạn có thể sử dụng "POSIX :: strcoll ()" nếu bạn không muốn vào mùa thu này-
trở lại:

sử dụng POSIX qw (strcoll);
$ bằng_in_locale =
! strcoll ("bỏ qua khoảng trắng và chữ hoa", "SpaceAndCaseIgnored");

$ equal_in_locale sẽ đúng nếu ngôn ngữ đối chiếu chỉ định một thứ tự giống như từ điển
bỏ qua hoàn toàn các ký tự khoảng trắng và ký tự gấp.

Perl hiện chỉ hỗ trợ các ngôn ngữ byte đơn cho "LC_COLLATE". Điều này có nghĩa là một
Ngôn ngữ UTF-8 có thể sẽ chỉ cung cấp cho bạn thứ tự bản địa của máy. Sử dụng Unicode :: Collate cho
việc triển khai đầy đủ Thuật toán đối chiếu Unicode.

Nếu bạn có một chuỗi đơn lẻ mà bạn muốn kiểm tra xem có "bình đẳng về ngôn ngữ" hay không
một số người khác, bạn có thể nghĩ rằng bạn có thể đạt được một chút hiệu quả bằng cách sử dụng
"POSIX :: strxfrm ()" kết hợp với "eq":

sử dụng POSIX qw (strxfrm);
$ xfrm_string = strxfrm ("Chuỗi chữ hoa hỗn hợp");
print "đối chiếu ngôn ngữ bỏ qua khoảng trắng \ n"
if $ xfrm_string eq strxfrm ("Phân cấp hỗn hợp");
print "đối chiếu ngôn ngữ bỏ qua dấu gạch nối \ n"
if $ xfrm_string eq strxfrm ("Chuỗi chữ hoa hỗn hợp");
print "đối chiếu ngôn ngữ bỏ qua chữ hoa chữ thường \ n"
if $ xfrm_string eq strxfrm ("chuỗi trường hợp hỗn hợp");

"strxfrm ()" nhận một chuỗi và ánh xạ nó thành một chuỗi được biến đổi để sử dụng trong char-by-char
so sánh với các chuỗi đã biến đổi khác trong quá trình đối chiếu. "Under the hood", ngôn ngữ-
Các toán tử so sánh Perl bị ảnh hưởng gọi "strxfrm ()" cho cả hai toán hạng, sau đó thực hiện một char-by-
so sánh char của các chuỗi được biến đổi. Bằng cách gọi "strxfrm ()" một cách rõ ràng và sử dụng
so sánh không bị ảnh hưởng bởi ngôn ngữ, ví dụ cố gắng lưu một vài phép biến đổi.
Nhưng trên thực tế, nó không tiết kiệm được gì cả: Phép thuật Perl (xem "Biến ảo" trong perlguts)
tạo phiên bản được chuyển đổi của một chuỗi vào lần đầu tiên cần so sánh,
sau đó giữ phiên bản này trong trường hợp nó cần một lần nữa. Một ví dụ được viết lại dễ dàng
với "cmp" chạy nhanh như nhau. Nó cũng đối phó với các ký tự rỗng được nhúng vào
dây; nếu bạn gọi trực tiếp "strxfrm ()", nó sẽ xử lý giá trị null đầu tiên mà nó tìm thấy là
Kẻ hủy diệt. đừng mong đợi các chuỗi đã biến đổi mà nó tạo ra có thể di động qua
hệ thống - hoặc thậm chí từ bản sửa đổi hệ điều hành của bạn sang bản tiếp theo. Tóm lại, đừng
gọi trực tiếp "strxfrm ()": hãy để Perl làm việc đó cho bạn.

Lưu ý: "sử dụng ngôn ngữ" không được hiển thị trong một số ví dụ sau vì nó không cần thiết:
"strcoll ()" và "strxfrm ()" là các hàm POSIX sử dụng hệ thống tiêu chuẩn do hệ thống cung cấp
các hàm "libc" luôn tuân theo ngôn ngữ "LC_COLLATE" hiện tại.

Phân loại "LC_CTYPE": Nhân vật Các loại
Trong phạm vi của biểu mẫu "sử dụng ngôn ngữ" bao gồm "LC_CTYPE", Perl tuân theo "LC_CTYPE"
cài đặt ngôn ngữ. Điều này kiểm soát khái niệm của ứng dụng về các ký tự
bảng chữ cái, số, dấu câu, vv. Điều này ảnh hưởng đến biểu thức chính quy "\ w" của Perl
metanotation, viết tắt của các ký tự chữ và số - nghĩa là chữ cái, số và
dấu gạch dưới gốc của nền tảng. (Tham khảo ý kiến ​​perlre để biết thêm thông tin về
biểu thức.) Nhờ "LC_CTYPE", tùy thuộc vào cài đặt ngôn ngữ của bạn, các ký tự như
"ae", "` "," ss "và" o "có thể được hiểu là các ký tự" \ w ". Nó cũng ảnh hưởng đến những thứ
như "\ s", "\ D" và các lớp ký tự POSIX, như "[[: graph:]]". (Nhìn thấy
perlrecharclass để biết thêm thông tin về tất cả những thứ này.)

Ngôn ngữ "LC_CTYPE" cũng cung cấp bản đồ được sử dụng để chuyển ngữ các ký tự giữa
viết thường và viết hoa. Điều này ảnh hưởng đến các hàm ánh xạ chữ hoa chữ thường - "fc ()", "lc ()",
"lcfirst ()", "uc ()" và "ucfirst ()"; nội suy ánh xạ trường hợp với "\ F", "\ l", "\ L",
"\ u" hoặc "\ U" trong chuỗi được trích dẫn kép và thay thế "s ///"; và không phụ thuộc vào chữ hoa chữ thường
đối sánh mẫu biểu thức chính quy bằng cách sử dụng công cụ sửa đổi "i".

Cuối cùng, "LC_CTYPE" ảnh hưởng đến bài kiểm tra lớp ký tự POSIX (không được dùng nữa)
các hàm - "POSIX :: isalpha ()", "POSIX :: islower ()", v.v. Ví dụ, nếu bạn di chuyển
từ ngôn ngữ "C" sang ngôn ngữ ISO 7 646-bit, bạn có thể thấy - có thể khiến bạn ngạc nhiên - rằng
"|" chuyển từ lớp "POSIX :: ispunct ()" sang "POSIX :: isalpha ()". Thật không may, điều này
tạo ra các vấn đề lớn cho các biểu thức chính quy. "|" vẫn có nghĩa là luân phiên mặc dù nó
khớp với "\ w". Bắt đầu từ v5.22, cảnh báo sẽ được đưa ra khi ngôn ngữ đó được chuyển
vào trong. Thêm chi tiết được đưa ra một số đoạn văn dưới đây.

Bắt đầu từ v5.20, Perl hỗ trợ các ngôn ngữ UTF-8 cho "LC_CTYPE", nhưng nếu không thì chỉ Perl
hỗ trợ các ngôn ngữ byte đơn, chẳng hạn như sê-ri ISO 8859. Điều này có nghĩa là ký tự rộng
ngôn ngữ, ví dụ như ngôn ngữ Châu Á, không được hỗ trợ tốt. (Nếu nền tảng có
khả năng để Perl phát hiện một ngôn ngữ như vậy, bắt đầu từ Perl v5.22, Perl sẽ cảnh báo,
được bật mặc định, sử dụng danh mục cảnh báo "ngôn ngữ", bất cứ khi nào một ngôn ngữ như vậy được chuyển
thành.) Hỗ trợ ngôn ngữ UTF-8 thực sự là một tập hợp siêu ngôn ngữ POSIX, bởi vì nó là
hành vi Unicode thực sự đầy đủ như thể không có ngôn ngữ "LC_CTYPE" nào có hiệu lực (ngoại trừ
nhiễm độc; xem "BẢO MẬT"). Các ngôn ngữ POSIX, thậm chí cả các ngôn ngữ UTF-8, đang thiếu một số khái niệm nhất định
trong Unicode, chẳng hạn như ý tưởng rằng việc thay đổi trường hợp của một ký tự có thể mở rộng để
nhiều hơn một ký tự. Perl trong một ngôn ngữ UTF-8, sẽ cung cấp cho bạn sự mở rộng đó. Trước
v5.20, Perl đã xử lý ngôn ngữ UTF-8 trên một số nền tảng như ISO 8859-1, với một số
hạn chế và trên các nền tảng khác giống như ngôn ngữ "C". Đối với các bản phát hành v5.16 và
v5.18, "sử dụng ngôn ngữ 'not_characters" có thể được sử dụng như một giải pháp thay thế cho việc này (xem "Unicode
và UTF-8 ").

Lưu ý rằng có khá nhiều thứ không bị ảnh hưởng bởi ngôn ngữ hiện tại. Không tí nào
ký tự chữ là ký tự gốc cho nền tảng nhất định. Do đó 'A' có nghĩa là
ký tự tại điểm mã 65 trên nền tảng ASCII và 193 trên EBCDIC. Điều đó có thể có hoặc có thể không
một 'A' trong ngôn ngữ hiện tại, nếu ngôn ngữ đó thậm chí có một 'A'. Tương tự như vậy, tất cả các cuộc chạy trốn
chuỗi cho các ký tự cụ thể, chẳng hạn như "\ n", luôn có nghĩa là gốc của nền tảng
một. Ví dụ: điều này có nghĩa là "\ N" trong biểu thức chính quy (mọi ký tự trừ ký tự mới-
dòng) hoạt động trên bộ ký tự nền tảng.

Bắt đầu từ v5.22, Perl theo mặc định sẽ cảnh báo khi chuyển sang ngôn ngữ xác định lại
mọi ký tự ASCII có thể in được (cộng với "\ t" và "\ n") vào một lớp khác với mong đợi.
Điều này có khả năng xảy ra trên các ngôn ngữ hiện đại chỉ trên các nền tảng EBCDIC, ví dụ:
Ngôn ngữ CCSID 0037 trên máy CCSID 1047 di chuyển "[", nhưng nó có thể xảy ra trên nền tảng ASCII
với ISO 646 và các ngôn ngữ 7-bit khác về cơ bản đã lỗi thời. Mọi thứ vẫn có thể
hoạt động, tùy thuộc vào các tính năng của Perl được chương trình sử dụng. Ví dụ, trong
ví dụ từ phía trên trong đó "|" trở thành "\ w" và không có biểu thức chính quy nào
vấn đề này, chương trình vẫn có thể hoạt động bình thường. Cảnh báo liệt kê tất cả các ký tự
mà nó có thể xác định có thể bị ảnh hưởng bất lợi.

Lưu ý: Định nghĩa ngôn ngữ "LC_CTYPE" bị hỏng hoặc độc hại có thể dẫn đến rõ ràng là không đủ điều kiện
các ký tự được ứng dụng của bạn coi là chữ và số. Để đối sánh chặt chẽ
trong số các chữ cái và chữ số ASCII (thông thường) - ví dụ: trong chuỗi lệnh - nhận biết ngôn ngữ
các ứng dụng nên sử dụng "\ w" với "/ a" sửa đổi biểu thức chính quy. Xem "BẢO MẬT".

Phân loại "LC_NUMERIC": Numeric Định dạng
Sau lệnh gọi "POSIX :: setlocale ()" thích hợp và trong phạm vi của biểu mẫu "sử dụng ngôn ngữ"
bao gồm các số, Perl tuân theo thông tin ngôn ngữ "LC_NUMERIC", kiểm soát một
ý tưởng của ứng dụng về cách các con số nên được định dạng để con người có thể đọc được. Ở hầu hết các
triển khai tác dụng duy nhất là thay đổi ký tự được sử dụng cho số thập phân
điểm - có lẽ từ "." đến ",". Các chức năng không nhận thức được những thứ tốt đẹp như hàng nghìn
sự tách biệt và như vậy. (Xem "Hàm localeconv" nếu bạn quan tâm đến những điều này.)

sử dụng POSIX qw (strtod setlocale LC_NUMERIC);
sử dụng ngôn ngữ;

setlocale LC_NUMERIC, "";

$ n = 5/2; # Gán số 2.5 cho $ n

$ a = "$ n"; # Chuyển đổi phụ thuộc vào ngôn ngữ thành chuỗi

print "nửa năm là $ n \ n"; # Đầu ra phụ thuộc vào ngôn ngữ

printf "nửa năm là% g \ n", $ n; # Đầu ra phụ thuộc vào ngôn ngữ

in "DECIMAL POINT IS COMMA \ n"
if $ n == (strtod ("2,5")) [0]; # Chuyển đổi phụ thuộc vào ngôn ngữ

Xem thêm I18N :: Langinfo và "RADIXCHAR".

Phân loại "LC_MONETARY": Định dạng of tiền tệ số lượng
Tiêu chuẩn C xác định danh mục "LC_MONETARY", nhưng không phải là một chức năng bị ảnh hưởng bởi
Nội dung của nó. (Những người có kinh nghiệm về các ủy ban tiêu chuẩn sẽ nhận ra rằng
nhóm làm việc đã quyết định phản đối vấn đề này.) Do đó, Perl về cơ bản không có
thông báo về nó. Nếu bạn thực sự muốn sử dụng "LC_MONETARY", bạn có thể truy vấn nội dung của nó - xem
"Hàm localeconv" - và sử dụng thông tin mà nó trả về trong ứng dụng của bạn
định dạng riêng của số lượng tiền tệ. Tuy nhiên, bạn có thể thấy rằng thông tin,
đồ sộ và phức tạp mặc dù có thể có nhưng vẫn không hoàn toàn đáp ứng được yêu cầu của bạn:
định dạng tiền tệ là một vấn đề khó bẻ khóa.

Xem thêm I18N :: Langinfo và "CRNCYSTR".

"LC_TIME"
Đầu ra được tạo ra bởi "POSIX :: strftime ()", tạo ra một ngày / giờ được định dạng mà con người có thể đọc được
chuỗi, bị ảnh hưởng bởi ngôn ngữ "LC_TIME" hiện tại. Do đó, ở ngôn ngữ Pháp, đầu ra
được tạo bởi phần tử định dạng% B (tên tháng đầy đủ) cho tháng đầu tiên của năm sẽ
là "janvier". Đây là cách lấy danh sách các tên tháng dài trong ngôn ngữ hiện tại:

sử dụng POSIX qw (strftime);
cho (0..11) {
$ long_month_name [$ _] =
strftime ("% B", 0, 0, 0, 1, $ _, 96);
}

Lưu ý: "use locale" không cần thiết trong ví dụ này: "strftime ()" là một hàm POSIX
sử dụng chức năng "libc" tiêu chuẩn do hệ thống cung cấp luôn tuân theo "LC_TIME" hiện tại
địa phương.

Xem thêm I18N :: Langinfo và "ABDAY_1" .. "ABDAY_7", "DAY_1" .. "DAY_7", "ABMON_1" .. "ABMON_12",
và "ABMON_1" .. "ABMON_12".

Khác đố
Các danh mục ngôn ngữ còn lại hiện không được Perl sử dụng. Nhưng một lần nữa lưu ý
mà những thứ Perl tương tác có thể sử dụng những thứ này, bao gồm cả các tiện ích mở rộng ngoài tiêu chuẩn
Phân phối Perl, và bởi hệ điều hành và các tiện ích của nó. Đặc biệt lưu ý rằng
giá trị chuỗi $! và các thông báo lỗi do các tiện ích bên ngoài đưa ra có thể bị thay đổi
bởi "LC_MESSAGES". Nếu bạn muốn có mã lỗi di động, hãy sử dụng "%!". Xem Errno.

AN NINH


Mặc dù thảo luận chính về các vấn đề bảo mật của Perl có thể được tìm thấy trong perlsec, một cuộc thảo luận
việc xử lý ngôn ngữ của Perl sẽ không hoàn chỉnh nếu nó không thu hút sự chú ý của bạn đến ngôn ngữ-
các vấn đề bảo mật phụ thuộc. Ngôn ngữ - đặc biệt là trên các hệ thống cho phép người dùng không có đặc quyền
để xây dựng ngôn ngữ của riêng họ - không đáng tin cậy. Một ngôn ngữ độc hại (hoặc chỉ đơn giản là bị hỏng)
có thể làm cho một ứng dụng nhận biết ngôn ngữ mang lại kết quả bất ngờ. Ở đây có một ít
khả năng:

· Biểu thức chính quy kiểm tra tên tệp hoặc địa chỉ thư an toàn bằng cách sử dụng "\ w" có thể
giả mạo bởi một ngôn ngữ "LC_CTYPE" tuyên bố rằng các ký tự như ">" và "|" là
chữ và số.

· Nội suy chuỗi với ánh xạ chữ hoa chữ thường, chẳng hạn như trong, "$ dest =" C: \ U $ name. $ Ext "", có thể
tạo ra kết quả nguy hiểm nếu bảng ánh xạ trường hợp "LC_CTYPE" không có thật đang có hiệu lực.

· Ngôn ngữ "LC_COLLATE" lén lút có thể dẫn đến tên của các sinh viên có điểm "D"
xuất hiện trước những người có "A" s.

· Một ứng dụng gặp khó khăn khi sử dụng thông tin trong "LC_MONETARY" có thể định dạng
ghi nợ như thể chúng là tín dụng và ngược lại nếu ngôn ngữ đó đã bị lật đổ. Hoặc
nó có thể thực hiện thanh toán bằng đô la Mỹ thay vì đô la Hồng Kông.

· Tên ngày và ngày trong các ngày được định dạng bởi "strftime ()" có thể được điều khiển thành
lợi dụng bởi một người dùng độc hại có thể lật đổ ngôn ngữ "LC_DATE". ("Nhìn kìa - nó nói rằng tôi
không có trong tòa nhà vào Chủ nhật. ")

Những nguy hiểm như vậy không đặc biệt đối với hệ thống ngôn ngữ: bất kỳ khía cạnh nào của ứng dụng
môi trường có thể bị sửa đổi một cách độc hại cũng gây ra những thách thức tương tự. Tương tự,
chúng không dành riêng cho Perl: bất kỳ ngôn ngữ lập trình nào cho phép bạn viết chương trình
có tính đến môi trường của họ khiến bạn gặp phải những vấn đề này.

Perl không thể bảo vệ bạn khỏi tất cả các khả năng được hiển thị trong các ví dụ - không có
thay thế cho sự cảnh giác của chính bạn - nhưng, khi "sử dụng ngôn ngữ" có hiệu lực, Perl sử dụng
cơ chế làm bẩn (xem perlsec) để đánh dấu các kết quả chuỗi trở nên phụ thuộc vào ngôn ngữ và
do đó có thể không đáng tin cậy. Đây là bản tóm tắt về hành vi nhiễm độc của
toán tử và chức năng có thể bị ảnh hưởng bởi ngôn ngữ:

· sự so sánh khai thác ("lt", "le", "ge", "gt" và "cmp"):

Kết quả vô hướng true / false (hoặc nhỏ hơn / bằng / lớn hơn) không bao giờ bị nhiễm bẩn.

· Lập bản đồ trường hợp phép nội suy (với "\ l", "\ L", "\ u", "\ U" hoặc "\ F")

Chuỗi kết quả chứa vật liệu nội suy bị mờ nếu dạng "sử dụng ngôn ngữ"
bao gồm "LC_CTYPE" đang có hiệu lực.

· Phù hợp nhà điều hành ("NS//"):

Kết quả đúng / sai vô hướng không bao giờ bị hỏng.

Tất cả các bài toán con, được phân phối dưới dạng kết quả ngữ cảnh danh sách hoặc dưới dạng $ 1 vv., bị nhiễm bẩn
nếu biểu mẫu "sử dụng ngôn ngữ" bao gồm "LC_CTYPE" đang có hiệu lực và
biểu thức chính quy chứa một cấu trúc phụ thuộc ngôn ngữ. Các cấu trúc này bao gồm
"\ w" (để khớp với một ký tự chữ và số), "\ W" (ký tự không phải chữ và số), "\ b" và
"\ B" (từ-ranh giới và không giới hạn, phụ thuộc vào những gì "\ w" và "\ W" khớp với nhau), "\ s"
(ký tự khoảng trắng), "\ S" (ký tự không có khoảng trắng), "\ d" và "\ D" (các chữ số và
không phải chữ số) và các lớp ký tự POSIX, chẳng hạn như "[: alpha:]" (xem "POSIX
Các lớp nhân vật "trong perlrecharclass).

Cũng có khả năng bị ố nếu mẫu được đối sánh không phân biệt chữ hoa chữ thường (thông qua "/ i").
Ngoại lệ là nếu tất cả các điểm mã được khớp theo cách này trên 255 và
không có các nếp gấp theo quy tắc Unicode xuống dưới 256. Việc làm mờ không được thực hiện cho những
bởi vì Perl chỉ sử dụng các quy tắc Unicode cho các điểm mã đó và những quy tắc đó là
giống nhau bất kể ngôn ngữ hiện tại là gì.

Các biến của mẫu đã so khớp, $ &, "$` "(kết hợp trước)," $ '"(kết hợp sau) và $ + (cuối cùng
trận đấu) cũng bị nhiễm độc.

· Thay thế nhà điều hành ("NS///"):

Có cùng hành vi với toán tử so khớp. Ngoài ra, toán hạng bên trái của "= ~" trở thành
bị nhiễm bẩn khi biểu mẫu "sử dụng ngôn ngữ" bao gồm "LC_CTYPE" đang có hiệu lực, nếu được sửa đổi thành
kết quả của sự thay thế dựa trên kết quả so khớp biểu thức chính quy liên quan đến bất kỳ
những thứ được đề cập trong mục trước hoặc về ánh xạ chữ hoa chữ thường, chẳng hạn như "\ l", "\ L", "\ u",
"\ U" hoặc "\ F".

· Đầu ra định dạng chức năng ("printf ()" và "write ()"):

Kết quả không bao giờ bị nhiễm bẩn bởi vì nếu không, thậm chí đầu ra từ bản in, ví dụ
"print (1/7)", nên bị mờ nếu "sử dụng ngôn ngữ" đang có hiệu lực.

· Lập bản đồ trường hợp chức năng ("lc ()", "lcfirst ()", "uc ()", "ucfirst ()"):

Kết quả bị mờ nếu biểu mẫu "sử dụng ngôn ngữ" bao gồm "LC_CTYPE" đang có hiệu lực.

· POSIX phụ thuộc vào ngôn ngữ chức năng ("localeconv ()", "strcoll ()", "strftime ()",
"strxfrm ()"):

Kết quả không bao giờ bị ô nhiễm.

· POSIX tính cách tốt nghiệp lớp XNUMX kiểm tra ("POSIX :: isalnum ()", "POSIX :: isalpha ()",
"POSIX :: isdigit ()", "POSIX :: isgraph ()", "POSIX :: islower ()", "POSIX :: isprint ()",
"POSIX :: ispunct ()", "POSIX :: isspace ()", "POSIX :: isupper ()", "POSIX :: isxdigit ()"):

Kết quả đúng / sai không bao giờ bị ô nhiễm.

Ba ví dụ minh họa sự nhiễm bẩn phụ thuộc vào ngôn ngữ. Chương trình đầu tiên bỏ qua
ngôn ngữ, sẽ không chạy: một giá trị được lấy trực tiếp từ dòng lệnh có thể không được sử dụng để đặt tên cho một
tập tin đầu ra khi kiểm tra taint được kích hoạt.

# / usr / local / bin / perl -T
# Chạy với kiểm tra vết bẩn

# Đã bỏ qua kiểm tra độ tỉnh táo của dòng lệnh ...
$ tainted_output_file = shift;

mở (F, "> $ tainted_output_file")
hoặc cảnh báo "Không mở được $ tainted_output_file: $! \ n";

Chương trình có thể được thực hiện để chạy bằng cách "rửa" giá trị bị nhiễm bẩn thông qua một
biểu thức: ví dụ thứ hai - vẫn bỏ qua thông tin ngôn ngữ - chạy, tạo
tệp có tên trên dòng lệnh của nó nếu nó có thể.

# / usr / local / bin / perl -T

$ tainted_output_file = shift;
$ tainted_output_file = ~ m% [\ w /] +%;
$ unsainted_output_file = $ &;

mở (F, "> $ unsainted_output_file")
hoặc cảnh báo "Không mở được $ unsainted_output_file: $! \ n";

So sánh điều này với một chương trình tương tự nhưng nhận biết được ngôn ngữ:

# / usr / local / bin / perl -T

$ tainted_output_file = shift;
sử dụng ngôn ngữ;
$ tainted_output_file = ~ m% [\ w /] +%;
$ localized_output_file = $ &;

mở (F, "> $ localized_output_file")
hoặc cảnh báo "Không mở được $ localized_output_file: $! \ n";

Chương trình thứ ba này không chạy được vì $ & bị nhiễm độc: đó là kết quả của một trận đấu
liên quan đến "\ w" trong khi "sử dụng ngôn ngữ" đang có hiệu lực.

MÔI TRƯỜNG


PERL_SKIP_LOCALE_INIT
Biến môi trường này, có sẵn bắt đầu trong Perl v5.20, nếu được đặt (thành bất kỳ
value), yêu cầu Perl không sử dụng phần còn lại của các biến môi trường để
khởi tạo với. Thay vào đó, Perl sử dụng bất kỳ cài đặt ngôn ngữ hiện tại nào.
Điều này đặc biệt hữu ích trong môi trường nhúng, hãy xem "Sử dụng Perl nhúng
với các ngôn ngữ POSIX "được in perlembed.

PERL_BADLANG
Một chuỗi có thể ngăn cảnh báo của Perl về cài đặt ngôn ngữ không thành công tại
khởi động. Lỗi có thể xảy ra nếu hỗ trợ ngôn ngữ trong hệ điều hành
thiếu (bị hỏng) theo một cách nào đó - hoặc nếu bạn nhập sai tên của một ngôn ngữ khi bạn
thiết lập môi trường của bạn. Nếu biến môi trường này không có hoặc có
giá trị khác "0" hoặc "", Perl sẽ phàn nàn về lỗi cài đặt ngôn ngữ.

LƯU Ý: "PERL_BADLANG" chỉ cung cấp cho bạn một cách để ẩn thông báo cảnh báo. Các
thông báo cho biết về một số vấn đề trong hỗ trợ ngôn ngữ của hệ thống của bạn và bạn
nên điều tra vấn đề là gì.

DPKG_RUNNING_VERSION
Trên hệ thống Debian, nếu biến môi trường DPKG_RUNNING_VERSION được đặt (thành
bất kỳ giá trị nào), cảnh báo lỗi ngôn ngữ sẽ bị loại bỏ giống như với
không có cài đặt PERL_BADLANG. Điều này được thực hiện để tránh lũ lụt các cảnh báo giả mạo
trong quá trình nâng cấp hệ thống. Nhìn thấyhttp://bugs.debian.org/508764>.

Các biến môi trường sau đây không dành riêng cho Perl: Chúng là một phần của
(ISO C, XPG4, POSIX 1.c) phương pháp "setlocale ()" được tiêu chuẩn hóa để kiểm soát một
ý kiến ​​của ứng dụng về dữ liệu. Windows không phải là POSIX, nhưng Perl sắp xếp cho những điều sau
để hoạt động như được mô tả. Nếu ngôn ngữ được cung cấp bởi một biến môi trường không hợp lệ,
Perl thử cái thấp hơn tiếp theo trong mức độ ưu tiên. Nếu không có giá trị nào hợp lệ, trên Windows, hệ thống
ngôn ngữ mặc định sau đó được thử. Nếu vẫn thất bại, ngôn ngữ "C" sẽ được sử dụng. Nếu ngay cả điều đó
không hoạt động, một cái gì đó đã bị hỏng nặng, nhưng Perl cố gắng vượt qua bằng bất cứ điều gì
cài đặt ngôn ngữ có thể được.

"LC_ALL" "LC_ALL" là biến môi trường ngôn ngữ "ghi đè tất cả". Nếu được thiết lập, nó
ghi đè tất cả phần còn lại của các biến môi trường ngôn ngữ.

"NGÔN NGỮ" LƯU Ý: "LANGUAGE" là một tiện ích mở rộng GNU, nó chỉ ảnh hưởng đến bạn nếu bạn đang sử dụng
GNU libc. Đây là trường hợp nếu bạn đang sử dụng ví dụ như Linux. Nếu bạn đang sử dụng
Unix "thương mại" mà bạn có thể là không sử dụng GNU libc và bạn có thể
bỏ qua "LANGUAGE".

Tuy nhiên, trong trường hợp bạn đang sử dụng "LANGUAGE": nó ảnh hưởng đến ngôn ngữ của
thông báo thông tin, cảnh báo và thông báo lỗi xuất ra bằng lệnh (nói cách khác,
nó giống như "LC_MESSAGES") nhưng nó có mức độ ưu tiên cao hơn "LC_ALL". Hơn thế nữa,
nó không phải là một giá trị duy nhất mà thay vào đó là một "đường dẫn" (":" - danh sách được phân tách) của ngôn ngữ
(không phải ngôn ngữ). Xem tài liệu thư viện GNU "gettext" để biết thêm
thông tin.

"LC_CTYPE" Trong trường hợp không có "LC_ALL", "LC_CTYPE" chọn ngôn ngữ loại ký tự. Trong
sự vắng mặt của cả "LC_ALL" và "LC_CTYPE", "LANG" chọn loại ký tự
địa phương.

"LC_COLLATE"
Trong trường hợp không có "LC_ALL", "LC_COLLATE" chọn đối chiếu (sắp xếp)
ngôn ngữ. Trong trường hợp không có cả "LC_ALL" và "LC_COLLATE", "LANG" chọn
ngôn ngữ đối chiếu.

"LC_MONETARY"
Trong trường hợp không có "LC_ALL", "LC_MONETARY" chọn định dạng tiền tệ
ngôn ngữ. Trong trường hợp không có cả "LC_ALL" và "LC_MONETARY", "LANG" chọn
ngôn ngữ định dạng tiền tệ.

"LC_NUMERIC"
Trong trường hợp không có "LC_ALL", "LC_NUMERIC" chọn ngôn ngữ định dạng số.
Trong trường hợp không có cả "LC_ALL" và "LC_NUMERIC", "LANG" chọn số
định dạng.

"LC_TIME" Trong trường hợp không có "LC_ALL", "LC_TIME" chọn định dạng ngày và giờ
ngôn ngữ. Trong trường hợp không có cả "LC_ALL" và "LC_TIME", "LANG" chọn
ngôn ngữ định dạng ngày và giờ.

"LANG" "LANG" là biến môi trường ngôn ngữ "bắt tất cả". Nếu nó được thiết lập, nó là
được sử dụng làm phương sách cuối cùng sau "LC_ALL" tổng thể và danh mục cụ thể
"LC_foo ".

Các ví dụ
"LC_NUMERIC" kiểm soát đầu ra số:

sử dụng ngôn ngữ;
sử dụng POSIX qw (locale_h); # Nhập setlocale () và hằng số LC_.
setlocale (LC_NUMERIC, "fr_FR") hoặc chết "Pardon";
printf "% g \ n", 1.23; # Nếu "fr_FR" thành công, có thể hiển thị 1,23.

và cả cách các chuỗi được phân tích cú pháp bởi "POSIX :: strtod ()" thành số:

sử dụng ngôn ngữ;
sử dụng POSIX qw (locale_h strtod);
setlocale (LC_NUMERIC, "de_DE") hoặc chết "Entschuldigung";
của tôi $ x = strtod ("2,34") + 5;
print $ x, "\ n"; # Có thể hiển thị 7,34.

GHI CHÚ


Chuỗi "eval" "LC_NUMERIC"
Một chuỗi đánh giá phân tích biểu thức của nó dưới dạng Perl chuẩn. Do đó, nó đang mong đợi
dấu thập phân thành một dấu chấm. Nếu "LC_NUMERIC" được đặt thành dấu phẩy thay thế, thì
phân tích cú pháp sẽ bị nhầm lẫn, có lẽ là âm thầm.

sử dụng ngôn ngữ;
sử dụng POSIX qw (locale_h);
setlocale (LC_NUMERIC, "fr_FR") hoặc chết "Pardon";
của tôi $ a = 1.2;
in eval "$ a + 1.5";
in "\ n";

in "13,5". Điều này là do trong ngôn ngữ đó, dấu phẩy là ký tự dấu thập phân.
Do đó, "eval" mở rộng thành:

eval "1,2 + 1.5"

và kết quả không như bạn mong đợi. Không có cảnh báo nào được tạo ra. Nếu bạn làm
string "eval" trong phạm vi "sử dụng ngôn ngữ", thay vào đó bạn nên thay đổi "eval"
dòng để làm một cái gì đó như:

print eval "no locale; $ a + 1.5";

Bản in này 2.7.

Bạn cũng có thể loại trừ "LC_NUMERIC", nếu bạn không cần, bằng cách

sử dụng ngôn ngữ ':! numeric';

Lạc hậu khả năng tương thích
Các phiên bản của Perl trước 5.004 chủ yếu thông tin ngôn ngữ bị bỏ qua, thường hoạt động như
nếu một cái gì đó tương tự với ngôn ngữ "C" luôn có hiệu lực, ngay cả khi chương trình
môi trường được đề xuất khác (xem "Hàm setlocale"). Theo mặc định, Perl vẫn
hoạt động theo cách này để tương thích ngược. Nếu bạn muốn một ứng dụng Perl phải trả tiền
chú ý đến thông tin ngôn ngữ, bạn phải sử dụng pragma "sử dụng ngôn ngữ" (xem "Sử dụng"
ngôn ngữ "pragma") hoặc, trong trường hợp không chắc chắn rằng bạn muốn làm như vậy cho chỉ mẫu
đối sánh, công cụ sửa đổi biểu thức chính quy "/ l" (xem "Công cụ sửa đổi bộ ký tự" trong perlre)
để hướng dẫn nó làm như vậy.

Các phiên bản Perl từ 5.002 đến 5.003 đã sử dụng thông tin "LC_CTYPE" nếu có; điều đó
là, "\ w" đã hiểu thế nào là các chữ cái theo môi trường ngôn ngữ
biến. Vấn đề là người dùng không có quyền kiểm soát tính năng: nếu C
các ngôn ngữ được hỗ trợ thư viện, Perl đã sử dụng chúng.

I18N: Đối chiếu lỗi thời
Trong các phiên bản của Perl trước 5.004, có thể đối chiếu theo ngôn ngữ bằng cách sử dụng
Mô-đun thư viện "I18N :: Collate". Mô-đun này hiện đã lỗi thời một chút và nên tránh
trong các ứng dụng mới. Chức năng "LC_COLLATE" hiện được tích hợp vào lõi Perl
ngôn ngữ: Người ta có thể sử dụng dữ liệu vô hướng theo ngôn ngữ cụ thể một cách hoàn toàn bình thường với "sử dụng ngôn ngữ",
vì vậy không còn cần phải tung hứng với các tham chiếu vô hướng của "I18N :: Collate".

Sắp xếp tốc độ trí nhớ sử dụng tác động
So sánh và sắp xếp theo ngôn ngữ thường chậm hơn so với sắp xếp mặc định; sự chậm lại của
hai đến bốn lần đã được quan sát. Nó cũng sẽ tiêu tốn nhiều bộ nhớ hơn: mỗi lần một Perl
biến vô hướng đã tham gia vào bất kỳ thao tác sắp xếp hoặc so sánh chuỗi nào tuân theo
quy tắc đối chiếu địa phương, nó sẽ tốn bộ nhớ gấp 3-15 lần so với trước đây. (Chính xác
hệ số phụ thuộc vào nội dung của chuỗi, hệ điều hành và ngôn ngữ.)
nhược điểm được quyết định nhiều hơn bởi việc triển khai hệ thống ngôn ngữ của hệ điều hành
hơn bởi Perl.

Tự do có sẵn miền địa phương các định nghĩa
Dự án Unicode CLDR trích xuất phần POSIX của nhiều ngôn ngữ của nó, có sẵn tại

http://unicode.org/Public/cldr/latest/

Có một bộ sưu tập lớn các định nghĩa ngôn ngữ tại:

http://std.dkuug.dk/i18n/WG15-collection/locales/

Bạn nên biết rằng nó không được hỗ trợ và không được khẳng định là phù hợp cho bất kỳ mục đích nào.
Nếu hệ thống của bạn cho phép cài đặt các ngôn ngữ tùy ý, bạn có thể tìm thấy các định nghĩa
hữu ích như chúng vốn có, hoặc làm cơ sở cho việc phát triển các ngôn ngữ của riêng bạn.

i18n L10n
"Quốc tế hóa" thường được viết tắt là I18n bởi vì các chữ cái đầu tiên và cuối cùng của nó là
cách nhau mười tám người khác. (Bạn có thể đoán tại sao nội bộ ... nội bộ ... i18n
có xu hướng được viết tắt.) Theo cách tương tự, "bản địa hóa" thường được viết tắt thành L10n.

An không hoàn hảo Tiêu chuẩn
Quốc tế hóa, như được định nghĩa trong tiêu chuẩn C và POSIX, có thể bị chỉ trích là
không đầy đủ, vô duyên và có độ chi tiết quá lớn. (Ngôn ngữ áp dụng cho toàn bộ
quy trình, khi được cho là sẽ hữu ích hơn nếu chúng áp dụng cho một chủ đề duy nhất,
nhóm cửa sổ, hoặc bất cứ điều gì.) Họ cũng có xu hướng, giống như các nhóm tiêu chuẩn, phân chia
thế giới thành các quốc gia, khi tất cả chúng ta đều biết rằng thế giới có thể được chia thành
nhân viên ngân hàng, người đi xe đạp, người chơi game, v.v.

Unicode UTF-8


Hỗ trợ Unicode mới bắt đầu từ phiên bản Perl v5.6 và được triển khai đầy đủ hơn
trong phiên bản v5.8 trở lên. Xem perluniintro.

Bắt đầu từ Perl v5.20, các ngôn ngữ UTF-8 được hỗ trợ trong Perl, ngoại trừ "LC_COLLATE" (sử dụng
Unicode :: Đối chiếu thay thế). Nếu bạn có Perl v5.16 hoặc v5.18 và không thể nâng cấp, bạn có thể sử dụng

sử dụng ngôn ngữ ': not_characters';

Khi dạng pragma này được sử dụng, chỉ những phần không phải ký tự của ngôn ngữ mới được sử dụng
bởi Perl, ví dụ "LC_NUMERIC". Perl giả định rằng bạn đã dịch tất cả
các ký tự mà nó sẽ hoạt động thành Unicode (thực sự là bộ ký tự gốc của nền tảng
(ASCII hoặc EBCDIC) cộng với Unicode). Đối với dữ liệu trong tệp, điều này có thể được thực hiện một cách thuận tiện bằng cách
xác định

sử dụng open ': locale';

Pragma này sắp xếp cho tất cả các đầu vào từ các tệp được dịch sang Unicode từ
ngôn ngữ hiện tại như được chỉ định trong môi trường (xem "ENVIRONMENT") và tất cả các kết quả đầu ra cho
các tệp sẽ được dịch lại sang ngôn ngữ. (Xem mở). Trên cơ sở mỗi lần xử lý tệp, bạn
thay vào đó có thể sử dụng mô-đun PerlIO :: locale hoặc mô-đun Encode :: Locale, cả hai đều có sẵn
từ CPAN. Mô-đun thứ hai cũng có các phương pháp để dễ dàng xử lý "ARGV" và
biến môi trường và có thể được sử dụng trên các chuỗi riêng lẻ. Nếu bạn biết rằng tất cả
ngôn ngữ sẽ là UTF-8, như nhiều ngày này, bạn có thể sử dụng -C chuyển đổi dòng lệnh.

Dạng pragma này về cơ bản cho phép xử lý liền mạch các ngôn ngữ với Unicode. Các
thứ tự đối chiếu sẽ theo thứ tự điểm mã Unicode. Chúng tôi đặc biệt khuyến nghị rằng khi
bạn cần đặt hàng và sắp xếp các chuỗi mà bạn sử dụng mô-đun chuẩn Unicode :: Collate
mang lại kết quả tốt hơn nhiều trong nhiều trường hợp so với những gì bạn có thể nhận được với ngôn ngữ kiểu cũ
sự điều khiển.

Tất cả các mô-đun và công tắc vừa được mô tả có thể được sử dụng trong v5.20 chỉ với "sử dụng đơn giản
ngôn ngữ "và, nếu các ngôn ngữ đầu vào không phải là UTF-8, bạn sẽ nhận được
hành vi, được mô tả bên dưới, mà bạn nhận được với Perls trước v5.16 hoặc khi bạn sử dụng ngôn ngữ
pragma không có tham số ": not_characters" trong v5.16 và v5.18. Nếu bạn đang sử dụng
các ngôn ngữ UTF-8 độc quyền trong v5.20 trở lên, phần còn lại của phần này không áp dụng cho
bạn.

Có hai trường hợp, địa phương nhiều byte và một byte. Nhiều byte đầu tiên:

Ngôn ngữ nhiều byte (hoặc ký tự rộng) duy nhất mà Perl có thể hỗ trợ là
UTF-8. Điều này là do khó thực hiện, thực tế là chất lượng cao UTF-8
ngôn ngữ hiện được xuất bản cho mọi khu vực trên thế giới
(<http://unicode.org/Public/cldr/latest/>), và điều đó không thành công tất cả những gì bạn có thể sử dụng
Mã hóa mô-đun để dịch sang / từ ngôn ngữ của bạn. Vì vậy, bạn sẽ phải làm một trong những điều đó
nếu bạn đang sử dụng một trong các ngôn ngữ này, chẳng hạn như Big5 hoặc Shift JIS. Đối với các ngôn ngữ UTF-8, trong
Perls (trước v5.20) không có hỗ trợ ngôn ngữ UTF-8 đầy đủ, chúng có thể hoạt động khá tốt
(tùy thuộc vào việc triển khai thư viện C của bạn) đơn giản vì cả chúng và Perl đều lưu trữ
các ký tự chiếm nhiều byte theo cùng một cách. Tuy nhiên, một số, nếu không phải là hầu hết, C
triển khai thư viện có thể không xử lý các ký tự ở nửa trên của chữ Latinh-1
phạm vi (128 - 255) đúng trong "LC_CTYPE". Để xem một ký tự có phải là một kiểu cụ thể hay không
dưới một ngôn ngữ, Perl sử dụng các hàm như "isalnum ()". Thư viện C của bạn có thể không hoạt động cho
Các ngôn ngữ UTF-8 với các chức năng đó, thay vào đó chỉ hoạt động trong thư viện rộng mới hơn
các hàm như "iswalnum ()", Perl không sử dụng. Các ngôn ngữ nhiều byte này là
được xử lý như ngôn ngữ byte đơn và sẽ có các hạn chế được mô tả bên dưới.
Bắt đầu trong Perl v5.22, một thông báo cảnh báo được đưa ra khi Perl phát hiện một ngôn ngữ nhiều byte
mà nó không hỗ trợ đầy đủ.

Đối với các ngôn ngữ một byte, Perl thường sử dụng các quy tắc ngôn ngữ trên các điểm mã
có thể vừa với một byte đơn và quy tắc Unicode cho những quy tắc không thể (mặc dù đây không phải là
áp dụng thống nhất, xem ghi chú ở cuối phần này). Điều này ngăn ngừa nhiều vấn đề
bằng các ngôn ngữ không phải là UTF-8. Giả sử ngôn ngữ là ISO8859-7, tiếng Hy Lạp. Nhân vật tại
0xD7 có một chữ Chi viết hoa. Nhưng trong ngôn ngữ ISO8859-1, Latin1, nó là một phép nhân
ký tên. Lớp ký tự biểu thức chính quy POSIX "[[: alpha:]]" sẽ khớp một cách kỳ diệu
0xD7 trong ngôn ngữ Hy Lạp nhưng không phải trong ngôn ngữ Latinh.

Tuy nhiên, có những nơi điều này bị phá vỡ. Các cấu trúc Perl nhất định dành cho Unicode
chỉ, chẳng hạn như "\ p {Alpha}". Họ cho rằng 0xD7 luôn có nghĩa Unicode của nó (hoặc
tương đương trên nền tảng EBCDIC). Vì Latin1 là một tập hợp con của Unicode và 0xD7 là
dấu nhân trong cả Latin1 và Unicode, "\ p {Alpha}" sẽ không bao giờ khớp với nó,
bất kể ngôn ngữ. Sự cố tương tự cũng xảy ra với "\ N {...}". Trước v5.20, nó là
do đó, một ý tưởng tồi nếu sử dụng "\ p {}" hoặc "\ N {}" trong "sử dụng ngôn ngữ" đơn giản -trừ khi bạn có thể
đảm bảo rằng ngôn ngữ sẽ là ISO8859-1. Sử dụng các lớp ký tự POSIX để thay thế.

Một vấn đề khác với cách tiếp cận này là các hoạt động vượt qua byte / nhiều
ranh giới byte không được xác định rõ và do đó không được phép. (Ranh giới này nằm giữa
codepoints tại 255/256.) Ví dụ: viết hoa thấp hơn CHỮ HOA LATIN Y CÓ CHỮ VIẾT TẮT
(U + 0178) sẽ trả về LATIN CHỮ NHỎ Y CÓ CHỮA BỆNH (U + 00FF). Nhưng trong tiếng Hy Lạp
ngôn ngữ, ví dụ, không có ký tự nào ở 0xFF và Perl không có cách nào để biết
ký tự ở 0xFF thực sự được cho là đại diện. Vì vậy, nó không cho phép hoạt động.
Trong chế độ này, chữ thường của U + 0178 là chính nó.

Các vấn đề tương tự xảy ra sau đó nếu bạn bật tự động hóa UTF-8 cho tệp tiêu chuẩn của mình
xử lý, lớp "open ()" mặc định và @ARGV trên các ngôn ngữ không phải ISO8859-1, không phải UTF-8 (bằng cách sử dụng
hoặc là -C chuyển đổi dòng lệnh hoặc biến môi trường "PERL_UNICODE"; Thấy chưa
perlrun). Mọi thứ được đọc dưới dạng UTF-8, thường ngụ ý Unicode
sự diễn giải, nhưng sự hiện diện của một ngôn ngữ khiến chúng được diễn giải trong ngôn ngữ đó
thay thế. Ví dụ: một điểm mã 0xD7 trong đầu vào Unicode, có nghĩa là
Dấu nhân, sẽ không được Perl giải thích theo cách đó theo ngôn ngữ Hy Lạp. Cái này
không phải là một vấn đề cung cấp bạn đảm bảo rằng tất cả các ngôn ngữ sẽ luôn luôn và chỉ
ISO8859-1, hoặc nếu bạn không có thư viện C thiếu, ngôn ngữ UTF-8.

Vẫn còn một vấn đề khác là cách tiếp cận này có thể dẫn đến hai điểm mã có nghĩa giống nhau
tính cách. Vì vậy, trong ngôn ngữ Hy Lạp, cả U + 03A7 và U + 00D7 đều là CHỮ CHI.

Vì tất cả những vấn đề này, bắt đầu từ v5.22, Perl sẽ đưa ra cảnh báo nếu đa
điểm mã byte (do đó Unicode) được sử dụng khi ngôn ngữ byte đơn có hiệu lực. (Mặc dù
nó không kiểm tra điều này nếu làm như vậy sẽ làm chậm quá trình thực thi một cách bất hợp lý.)

Ngôn ngữ của nhà cung cấp nổi tiếng là lỗi và rất khó để Perl kiểm tra ngôn ngữ của nó-
xử lý mã vì điều này tương tác với mã mà Perl không có quyền kiểm soát; vì thế
mã xử lý ngôn ngữ trong Perl cũng có thể bị lỗi. (Tuy nhiên, Unicode do
ngôn ngữ sẽ tốt hơn và có một cơ chế nguồn cấp dữ liệu trở lại để khắc phục bất kỳ sự cố nào. Nhìn thấy
"Định nghĩa ngôn ngữ có sẵn miễn phí".)

Nếu bạn có Perl v5.16, các vấn đề được đề cập ở trên sẽ biến mất nếu bạn sử dụng
tham số ": not_characters" cho pragma ngôn ngữ (ngoại trừ lỗi của nhà cung cấp trong
phần ký tự). Nếu bạn không có v5.16 và bạn do có ngôn ngữ hoạt động, sử dụng
chúng có thể có giá trị cho các mục đích cụ thể nhất định, miễn là bạn ghi nhớ
gotchas đã được đề cập. Ví dụ: nếu đối chiếu cho ngôn ngữ của bạn hoạt động, nó sẽ chạy
nhanh hơn dưới ngôn ngữ so với dưới Unicode :: Collate; và bạn có quyền truy cập vào những thứ như
ký hiệu tiền nội tệ và tên của các tháng và ngày trong tuần. (Nhưng để
bắt đầu quan điểm, trong v5.16, bạn có quyền truy cập này mà không có nhược điểm của ngôn ngữ bằng cách
sử dụng dạng ": not_characters" của pragma.)

Lưu ý: Chính sách sử dụng quy tắc ngôn ngữ cho các điểm mã có thể vừa với một byte và Unicode
các quy tắc cho những điều không thể không được áp dụng một cách thống nhất. Trước v5.12, nó có phần
bừa bãi; trong v5.12, nó được áp dụng khá nhất quán cho đối sánh biểu thức chính quy
ngoại trừ các lớp ký tự trong ngoặc; trong v5.14, nó đã được mở rộng cho tất cả các trận đấu regex; và
trong v5.16 đối với các hoạt động viết hoa như "\ L" và "uc ()". Đối với đối chiếu, trong tất cả các bản phát hành
cho đến nay, hàm "strxfrm ()" của hệ thống được gọi và bất cứ điều gì nó làm là những gì bạn nhận được.

Sử dụng perllocale trực tuyến bằng các dịch vụ onworks.net



Các chương trình trực tuyến Linux & Windows mới nhất