perllocale - ออนไลน์ในคลาวด์

นี่คือคำสั่ง perllocale ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้เวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS

โครงการ:

ชื่อ


perllocale - การจัดการภาษา Perl (การทำให้เป็นสากลและการแปลเป็นภาษาท้องถิ่น)

DESCRIPTION


ในตอนแรกมี ASCII คือ "American Standard Code for Information
Interchange" ซึ่งทำงานได้ดีสำหรับชาวอเมริกันด้วยตัวอักษรภาษาอังกฤษและดอลลาร์-
สกุลเงินที่เป็นสกุลเงิน แต่มันใช้ไม่ได้ผลแม้แต่กับผู้พูดภาษาอังกฤษคนอื่น ๆ ที่
อาจใช้สกุลเงินต่างกัน เช่น ปอนด์สเตอร์ลิง (เป็นสัญลักษณ์สำหรับสกุลเงินนั้น
ไม่ได้อยู่ใน ASCII); และไม่เพียงพอสำหรับชาวโลกหลายพันคนอย่างสิ้นหวัง
ภาษาอื่น ๆ.

เพื่อแก้ไขข้อบกพร่องเหล่านี้ แนวคิดของโลแคลจึงถูกคิดค้นขึ้น (อย่างเป็นทางการคือ ISO C,
XPG4, POSIX 1.c "ระบบโลคัล") และแอปพลิเคชันถูกและกำลังเขียนว่าใช้
กลไกสถานที่ ขั้นตอนการยื่นคำร้องดังกล่าวต้องคำนึงถึง
ความชอบของผู้ใช้ในเรื่องเหล่านี้เรียกว่า สากล (บ่อยครั้ง
ย่อว่า i18n); บอกแอปพลิเคชันดังกล่าวเกี่ยวกับชุดการตั้งค่าเฉพาะคือ
รู้จักกันในนาม การ จำกัด (l10n).

Perl ได้รับการขยายเพื่อรองรับระบบโลแคล สิ่งนี้ถูกควบคุมต่อแอปพลิเคชัน
โดยใช้ Pragma หนึ่งรายการ การเรียกใช้ฟังก์ชันหนึ่งครั้ง และตัวแปรสภาพแวดล้อมหลายตัว

น่าเสียดายที่มีข้อบกพร่องค่อนข้างน้อยในการออกแบบ (และบ่อยครั้งที่
การใช้งาน) ของสถานที่ Unicode ถูกประดิษฐ์ขึ้น (ดู perlunitut สำหรับข้อมูลเบื้องต้นเกี่ยวกับ
นั้น) ในส่วนที่จะแก้ไขข้อบกพร่องในการออกแบบเหล่านี้และในปัจจุบันมีชุดของ
"สถานที่ UTF-8" ตาม Unicode เหล่านี้เป็นโลแคลที่มีชุดอักขระเป็น Unicode
เข้ารหัสใน UTF-8 เริ่มต้นใน v5.20 Perl รองรับโลแคล UTF-8 อย่างสมบูรณ์ ยกเว้นสำหรับ
การเรียงลำดับและการเปรียบเทียบสตริง (ใช้ Unicode::Collate สำหรับสิ่งเหล่านี้) Perl ยังคง
สนับสนุนโลแคลที่ไม่ใช่ UTF-8 แบบเก่าเช่นกัน ขณะนี้ไม่มีสถานที่ UTF-8 สำหรับ
แพลตฟอร์ม ECDIC

(Unicode กำลังสร้าง "CLDR" ซึ่งเป็น "ที่เก็บข้อมูลสถานที่ทั่วไป" ด้วย
<http://cldr.unicode.org/> ซึ่งรวมถึงประเภทข้อมูลมากกว่าที่มีอยู่ใน
ระบบโลแคล POSIX ในขณะที่เขียนนี้ไม่มีโมดูล CPAN ที่
ให้การเข้าถึงข้อมูลที่เข้ารหัส XML นี้ อย่างไรก็ตาม โลแคลหลายแห่งมี POSIX-
ดึงข้อมูลเท่านั้น และพร้อมใช้งานเป็นภาษา UTF-8 ที่
<http://unicode.org/Public/cldr/latest/>.)

WHAT IS A ในท้องถิ่น


โลแคลคือชุดข้อมูลที่อธิบายแง่มุมต่างๆ ว่าชุมชนต่างๆ ใน
โลกจัดประเภทโลกของพวกเขา หมวดหมู่เหล่านี้แบ่งออกเป็นประเภทต่อไปนี้
(บางส่วนมีบันทึกย่อที่นี่):

หมวดหมู่ "LC_NUMERIC": การจัดรูปแบบตัวเลข
สิ่งนี้บ่งชี้ว่าควรจัดรูปแบบตัวเลขอย่างไรเพื่อให้มนุษย์อ่านง่าย เช่น
อักขระที่ใช้เป็นจุดทศนิยม

หมวดหมู่ "LC_MONETARY": การจัดรูปแบบของจำนวนเงิน

หมวดหมู่ "LC_TIME": การจัดรูปแบบวันที่/เวลา

หมวดหมู่ "LC_MESSAGES": ข้อผิดพลาดและข้อความอื่นๆ
สิ่งนี้ถูกใช้โดย Perl เองสำหรับการเข้าถึงข้อความแสดงข้อผิดพลาดของระบบปฏิบัติการผ่าน $!
และ $^E

หมวดหมู่ "LC_COLLATE": Collation
ซึ่งระบุถึงการเรียงลำดับตัวอักษรสำหรับการเปรียบเทียบและการเรียงลำดับ ในภาษาละติน
ตัวอักษร เช่น "b" โดยทั่วไปจะตามหลัง "a"

หมวดหมู่ "LC_CTYPE": ประเภทอักขระ
สิ่งนี้บ่งชี้ เช่น หากอักขระเป็นตัวพิมพ์ใหญ่

ประเภทอื่น ๆ
บางแพลตฟอร์มมีหมวดหมู่อื่น ๆ ที่เกี่ยวข้องกับสิ่งต่าง ๆ เช่นหน่วยการวัด
และขนาดกระดาษ Perl ไม่ได้ใช้สิ่งเหล่านี้โดยตรง แต่การดำเนินการภายนอกนั้น
Perl โต้ตอบกับอาจใช้สิ่งเหล่านี้ ดู "ไม่อยู่ในขอบเขตของ "ใช้สถานที่" ด้านล่าง

รายละเอียดเพิ่มเติมเกี่ยวกับหมวดหมู่ที่ Perl ใช้งานอยู่ด้านล่างใน "หมวดหมู่ LOCALE"

หมวดหมู่เหล่านี้ร่วมกันช่วยให้สามารถปรับแต่งโปรแกรมเดียวได้
ไปวิ่งตามสถานที่ต่างๆ แต่มีข้อบกพร่องดังนั้นให้อ่าน

เตรียม TO ใช้ ท้องถิ่น


Perl เอง (นอกโมดูล POSIX) จะไม่ใช้โลแคลเว้นแต่จะมีการร้องขอเป็นพิเศษ
ถึง (แต่โปรดทราบอีกครั้งว่า Perl อาจโต้ตอบกับรหัสที่ใช้งาน) แม้ว่าจะมี
คำขอดังกล่าว ทั้งหมด ต่อไปนี้จะต้องเป็นจริงเพื่อให้ทำงานได้อย่างถูกต้อง:

· ของคุณ การดำเนินงาน ระบบ ต้อง สนับสนุน ในประเทศ ระบบ. ถ้าใช่ คุณควรหา
ว่าฟังก์ชัน "setlocale()" เป็นส่วนหนึ่งของไลบรารี C ที่บันทึกไว้

· คำจำกัดความ สำหรับ ในประเทศ ที่ เธอ ใช้ ต้อง be การติดตั้ง. คุณหรือระบบของคุณ
ผู้ดูแลระบบต้องตรวจสอบให้แน่ใจว่าเป็นกรณีนี้ สถานที่ที่มีอยู่the
ตำแหน่งที่เก็บไว้ และวิธีการติดตั้งทั้งหมดแตกต่างกันไป
จากระบบสู่ระบบ ระบบบางระบบมีสถานที่เดินสายแบบเดินสายเพียงไม่กี่แห่งเท่านั้นและไม่
ขออนุญาตเพิ่มเติมนะครับ อื่น ๆ อนุญาตให้คุณเพิ่มสถานที่ "กระป๋อง" ที่ให้บริการโดย
ผู้จัดจำหน่ายระบบ ยังมีคนอื่นให้คุณหรือผู้ดูแลระบบกำหนดและเพิ่ม
สถานที่โดยพลการ (คุณอาจต้องขอให้ซัพพลายเออร์ของคุณจัดหาสถานที่บรรจุกระป๋องที่
ไม่ได้มาพร้อมกับระบบปฏิบัติการของคุณ) อ่านเอกสารระบบของคุณสำหรับ
แสงสว่างเพิ่มเติม

· Perl ต้อง เชื่อ ที่ ในประเทศ ระบบ is ได้รับการสนับสนุน. ถ้าเป็นเช่นนั้น "perl
-V:d_setlocale" จะบอกว่าค่าของ "d_setlocale" คือ "define"

หากคุณต้องการให้แอปพลิเคชัน Perl ประมวลผลและนำเสนอข้อมูลของคุณตามลักษณะเฉพาะ
locale รหัสแอปพลิเคชันควรรวม Pragma "use locale" (ดูที่ "use locale"
Pragma") ตามความเหมาะสม และ at น้อยที่สุด หนึ่ง ต่อไปนี้จะต้องเป็นจริง:

1. การขอ การกำหนดสถานที่ สิ่งแวดล้อม ตัวแปร (ดู "สิ่งแวดล้อม") ต้อง be ได้อย่างถูกต้อง เซ็ต
up ในเวลาที่แอปพลิเคชันเริ่มต้น ไม่ว่าจะด้วยตัวเองหรือโดยใครก็ตามที่ตั้งค่า
บัญชีระบบของคุณ หรือ

2. การขอ ใบสมัคร ต้อง เซ็ต ของมัน ของตนเอง ในประเทศ โดยใช้วิธีการที่อธิบายไว้ใน "The setlocale
การทำงาน".

ใช้ ท้องถิ่น


การขอ "ใช้ สถานที่" Pragma
โดยค่าเริ่มต้น Perl เอง (นอกโมดูล POSIX) จะละเว้นสถานที่ปัจจุบัน ดิ
"use locale" Pragma บอก Perl ให้ใช้สถานที่ปัจจุบันสำหรับการดำเนินการบางอย่าง เริ่มต้นใน
v5.16 มีพารามิเตอร์ทางเลือกสำหรับ Pragma นี้ ซึ่งอธิบายด้านล่าง ซึ่งจำกัดซึ่ง
การดำเนินงานได้รับผลกระทบจากมัน

สถานที่ปัจจุบันถูกตั้งค่าในเวลาดำเนินการโดย กำหนดสถานที่() อธิบายไว้ด้านล่าง. ถ้าอย่างนั้น
ยังไม่ได้เรียกใช้ฟังก์ชันในระหว่างการทำงานของโปรแกรม ปัจจุบัน
สถานที่คือสิ่งที่ถูกกำหนดโดย "สิ่งแวดล้อม" ที่มีผลเมื่อเริ่มต้น
โปรแกรม. หากไม่มีสภาพแวดล้อมที่ถูกต้อง โลแคลปัจจุบันจะเป็นอะไรก็ได้ที่ระบบ
ค่าเริ่มต้นถูกตั้งค่าเป็น ในระบบ POSIX มีความเป็นไปได้ แต่ไม่จำเป็นว่า "C"
สถานที่ บน Windows ค่าเริ่มต้นจะถูกตั้งค่าผ่านทาง .ของคอมพิวเตอร์
"แผงควบคุม -> ตัวเลือกภูมิภาคและภาษา" (หรือเทียบเท่าในปัจจุบัน)

การดำเนินการที่ได้รับผลกระทบจากโลแคลคือ:

ไม่ ภายใน ขอบเขต of "ใช้ สถานที่"
เฉพาะการดำเนินการบางอย่างที่มาจากภายนอก Perl ควรได้รับผลกระทบดังนี้:

· โลแคลปัจจุบันถูกใช้เมื่อออกไปนอก Perl ด้วยการดำเนินการเช่น
ระบบ() หรือ qx// หากการดำเนินการเหล่านั้นมีความไวต่อสถานที่

· Perl ยังให้การเข้าถึงฟังก์ชันไลบรารี C ต่างๆ ผ่านโมดูล POSIX
ฟังก์ชันเหล่านี้บางส่วนได้รับผลกระทบจากสถานที่ปัจจุบันเสมอ ตัวอย่างเช่น,
"POSIX::strftime()" ใช้ "LC_TIME"; "POSIX::strtod()" ใช้ "LC_NUMERIC";
"POSIX::strcoll()" และ "POSIX::strxfrm()" ใช้ "LC_COLLATE"; และตัวละคร
ฟังก์ชันการจัดหมวดหมู่ เช่น "POSIX::isalnum()" ใช้ "LC_CTYPE" ทั้งหมดดังกล่าว
ฟังก์ชันจะทำงานตามโลแคลพื้นฐานในปัจจุบัน แม้ว่า
สถานที่ไม่เปิดเผยพื้นที่ Perl

· โมดูล XS สำหรับทุกหมวดหมู่ แต่ "LC_NUMERIC" รับตำแหน่งพื้นฐานและ
ดังนั้นฟังก์ชันไลบรารี C ที่พวกเขาเรียกจะใช้โลแคลพื้นฐานนั้น สำหรับข้อมูลเพิ่มเติม
การสนทนา ดู "CAVEATS" ใน perlxs

โปรดทราบว่าโปรแกรม C ทั้งหมด (รวมถึงตัวแปล Perl ซึ่งเขียนด้วยภาษา C)
มีสถานที่พื้นฐานอยู่เสมอ สถานที่นั้นคือสถานที่ "C" เว้นแต่จะเปลี่ยนโดยa
เรียกร้องให้ กำหนดสถานที่(). เมื่อ Perl เริ่มทำงาน มันจะเปลี่ยนโลแคลพื้นฐานเป็น one
ซึ่งระบุโดย "สิ่งแวดล้อม" เมื่อใช้โมดูล POSIX หรือเขียนXS
รหัส สิ่งสำคัญคือต้องจำไว้ว่าสถานที่พื้นฐานอาจเป็นอะไรบางอย่าง
นอกเหนือจาก "C" แม้ว่าโปรแกรมจะไม่ได้เปลี่ยนแปลงอย่างชัดเจนก็ตาม

ที่เอ้อระเหย ผลกระทบ of "ใช้ สถานที่"
การดำเนินการ Perl บางอย่างที่ตั้งค่าไว้ภายในขอบเขตของ "สถานที่ใช้งาน" ยังคงไว้ซึ่ง
ผลกระทบแม้อยู่นอกขอบเขต ซึ่งรวมถึง:

· รูปแบบผลลัพธ์ของ a เขียน() ถูกกำหนดโดยการประกาศรูปแบบก่อนหน้า
("รูปแบบ" ใน perlfunc) ดังนั้นไม่ว่าผลลัพธ์จะได้รับผลกระทบจากสถานที่หรือไม่ก็ตาม
กำหนดโดยว่า "format()" อยู่ในขอบเขตของ "use locale" หรือไม่ ไม่ใช่ว่า
"เขียน ()" คือ

· รูปแบบนิพจน์ทั่วไปสามารถคอมไพล์ได้โดยใช้ qr// พร้อมการจับคู่จริง
เลื่อนออกไปในภายหลัง อีกครั้งคือว่าการรวบรวมเสร็จสิ้นภายใน
ขอบเขตของ "ใช้สถานที่" ที่กำหนดพฤติกรรมการจับคู่ไม่ใช่ถ้าตรงกัน
ได้กระทำภายในขอบเขตดังกล่าวหรือไม่

ภายใต้ ""ใช้ สถานที่";"
·การดำเนินการทั้งหมดข้างต้น

· รูปแบบ ประกาศ ("รูปแบบ" ใน perlfunc) และด้วยเหตุนี้การใช้ "write ()" ที่ตามมา
"LC_NUMERIC"

· การทำให้เข้มงวด และ เอาท์พุต ใช้ "LC_NUMERIC" ซึ่งรวมถึงผลลัพธ์ของ
"print()", "printf()", "say()" และ "sprintf()"

· การขอ การเปรียบเทียบ ผู้ประกอบการ ("lt", "le", "cmp", "ge" และ "gt") ใช้ "LC_COLLATE"
"sort()" จะได้รับผลกระทบด้วยหากใช้โดยไม่มีฟังก์ชันเปรียบเทียบที่ชัดเจน เนื่องจาก
มันใช้ "cmp" เป็นค่าเริ่มต้น

หมายเหตุ "eq" และ "ne" ไม่ได้รับผลกระทบจากสถานที่: พวกเขามักจะดำเนินการ char-by-char
การเปรียบเทียบตัวถูกดำเนินการแบบสเกลาร์ ยิ่งไปกว่านั้น ถ้า "cmp" พบว่ามันคือ
ตัวถูกดำเนินการมีค่าเท่ากันตามลำดับการจัดเรียงที่ระบุโดยกระแส
locale จะทำการเปรียบเทียบแบบ char-by-char และส่งคืนเท่านั้น 0
(เท่ากัน) ถ้าตัวถูกดำเนินการเป็น char-for-char เหมือนกัน ถ้าอยากรู้จริงๆ
ว่าสองสตริง - ซึ่ง "eq" และ "cmp" อาจพิจารณาว่าต่างกัน - เท่ากันหรือไม่
เกี่ยวกับการจัดเรียงในภาษาที่เกี่ยวข้อง ดูการสนทนาใน "หมวดหมู่
"LC_COLLATE": การจัดเรียง"

· ปกติ การแสดงออก และ กรณีแก้ไข ฟังก์ชั่น ("uc()", "lc()", "ucfirst()",
และ "lcfirst()") ใช้ "LC_CTYPE"

· การขอ ตัวแปร $! (และคำเหมือน $ERRNO และ $OS_ERROR) และ $^อี (และคำพ้องความหมาย
$EXTENDED_OS_ERROR) เมื่อใช้เป็นสตริง ให้ใช้ "LC_MESSAGES"

พฤติกรรมเริ่มต้นถูกกู้คืนด้วย Pragma "ไม่มีสถานที่" หรือเมื่อถึงจุดสิ้นสุด
บล็อกที่ล้อมรอบ "ใช้สถานที่" โปรดทราบว่าการเรียก "use locale" อาจซ้อนกันและนั่น
สิ่งที่มีผลภายในขอบเขตภายในจะเปลี่ยนกลับเป็นกฎของขอบเขตภายนอกในตอนท้าย
ของขอบเขตภายใน

ผลลัพธ์สตริงของการดำเนินการใดๆ ที่ใช้ข้อมูลโลแคลเป็นมลทิน ตามที่เป็นอยู่
เป็นไปได้ที่สถานที่จะไม่น่าเชื่อถือ ดู "ความปลอดภัย"

การเริ่มต้นใน Perl v5.16 อย่างจำกัด และโดยทั่วไปใน v5.22 คุณสามารถ
จำกัดหมวดหมู่หรือหมวดหมู่ที่เปิดใช้งานโดยอินสแตนซ์นี้โดยเฉพาะ
Pragma โดยเพิ่มพารามิเตอร์เข้าไป ตัวอย่างเช่น,

ใช้สถานที่ qw(:ctype :numeric);

เปิดใช้งานการรับรู้สถานที่ภายในขอบเขตของการดำเนินการเหล่านั้นเท่านั้น (รายการด้านบน) ที่เป็น
ได้รับผลกระทบจาก "LC_CTYPE" และ "LC_NUMERIC"

หมวดหมู่ที่เป็นไปได้ ได้แก่ ":colate", ":ctype", ":messages", ":monetary", ":numeric",
":time" และหมวดหมู่หลอก ":characters" (อธิบายไว้ด้านล่าง)

ดังนั้นคุณสามารถพูดได้

ใช้สถานที่ ':ข้อความ';

และเพียง $! และ $^E จะรับรู้ถึงสถานที่ อย่างอื่นไม่ได้รับผลกระทบ

เนื่องจาก Perl ไม่ได้ทำอะไรกับหมวดหมู่ "LC_MONETARY" ในขณะนี้ จึงระบุ
":monetary" ไม่ได้ช่วยอะไรเลย บางระบบมีหมวดหมู่อื่นเช่น
"LC_PAPER_SIZE" แต่ Perl ก็ยังไม่รู้อะไรเกี่ยวกับมันเลย และไม่มีทาง
ระบุในอาร์กิวเมนต์ของ Pragma นี้

คุณยังสามารถพูดได้ง่ายๆ ว่าใช้หมวดหมู่ทั้งหมด ยกเว้นหมวดหมู่เดียว เช่น

ใช้สถานที่ ':!ctype';
ใช้สถานที่ ':not_ctype';

ทั้งสองอย่างนี้หมายถึงการเปิดใช้งานการเตือนสถานที่ของทุกประเภทยกเว้น "LC_CTYPE" หนึ่งเดียว
อาร์กิวเมนต์ของหมวดหมู่อาจถูกระบุใน "ใช้สถานที่" หากอยู่ในรูปแบบที่ถูกปฏิเสธ

ก่อนหน้า v5.22 มี Pragma ที่มีอาร์กิวเมนต์เพียงรูปแบบเดียวเท่านั้น:

ใช้สถานที่ ':not_characters';

(และคุณต้องพูดว่า "not_" คุณไม่สามารถใช้แบบฟอร์ม "ปัง" ได้) หมวดหมู่หลอกนี้คือ a
ชวเลขสำหรับระบุทั้ง ":colate" และ ":ctype" ดังนั้นในรูปแบบลบล้าง ก็คือ
เกือบจะเหมือนกับคำพูด

ใช้สถานที่ qw(:messages :monetary :numeric :time);

เราใช้คำว่า "เกือบ" เพราะ ":not_characters" ยังเปิดอยู่
"ใช้คุณลักษณะ 'unicode_strings'" ภายในขอบเขต แบบฟอร์มนี้มีประโยชน์น้อยกว่าใน v5.20 และ
ต่อมาและอธิบายไว้อย่างครบถ้วนใน "Unicode และ UTF-8" แต่โดยสังเขป มันบอก Perl ให้ไม่
ใช้ส่วนอักขระของนิยามโลแคล นั่นคือ "LC_CTYPE" และ
หมวดหมู่ "LC_COLLATE" แต่จะใช้ชุดอักขระพื้นเมืองแทน (ขยายโดย
ยูนิโค้ด) เมื่อใช้พารามิเตอร์นี้ คุณต้องรับผิดชอบในการรับค่าภายนอก
ชุดอักขระที่แปลเป็นภาษาเนทีฟ/ยูนิโค้ด (ซึ่งจะมีอยู่แล้วหากเป็น
หนึ่งในสถานที่ UTF-8 ที่ได้รับความนิยมเพิ่มมากขึ้น) มีวิธีที่สะดวกในการทำเช่นนี้
ตามที่อธิบายไว้ใน "Unicode และ UTF-8"

การขอ ตั้งค่าภาษา ฟังก์ชัน
คุณสามารถเปลี่ยนโลแคลได้บ่อยเท่าที่คุณต้องการในขณะใช้งานด้วย "POSIX::setlocale()"
ฟังก์ชั่น:

# นำเข้าชุดเครื่องมือจัดการสถานที่จากโมดูล POSIX
# ตัวอย่างนี้ใช้: setlocale -- การเรียกใช้ฟังก์ชัน
# LC_CTYPE -- อธิบายด้านล่าง
# (แสดงการทดสอบความสำเร็จ/ความล้มเหลวของการดำเนินงานคือ
# ละเว้นในตัวอย่างเหล่านี้เพื่อหลีกเลี่ยงการเสียสมาธิจากหลัก
# จุด)

ใช้ POSIX qw(locale_h);
ใช้สถานที่;
$old_locale ของฉัน;

# สอบถามและบันทึกสถานที่เก่า
$old_locale = setlocale(LC_CTYPE);

setlocale(LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE เป็นภาษาท้องถิ่น "ฝรั่งเศส แคนาดา ชุดรหัส ISO 8859-1"

setlocale(LC_CTYPE, "");
# LC_CTYPE ตอนนี้รีเซ็ตเป็นค่าเริ่มต้นที่กำหนดโดย
# LC_ALL/LC_CTYPE/LANG ตัวแปรสภาพแวดล้อมหรือระบบ
# ค่าเริ่มต้น. ดูเอกสารด้านล่าง

#คืนถิ่นเก่า
setlocale(LC_CTYPE, $old_locale);

สิ่งนี้ส่งผลกระทบต่อทุกเธรดของโปรแกรมพร้อมกัน ดังนั้นจึงอาจมีปัญหาในการใช้งาน
โลแคลในแอปพลิเคชันเธรด ยกเว้นในกรณีที่มีโลแคลเดียวที่ใช้ได้กับall
หัวข้อ

อาร์กิวเมนต์แรกของ "setlocale()" ให้ หมวดหมู่ที่สอง ในประเทศส่วน
หมวดหมู่จะบอกถึงแง่มุมของการประมวลผลข้อมูลที่คุณต้องการใช้กฎเฉพาะสถานที่
มีการกล่าวถึงชื่อหมวดหมู่ใน "LOCALE CEGORIES" และ "ENVIRONMENT" สถานที่คือ
ชื่อของชุดข้อมูลการปรับแต่งที่สอดคล้องกับเฉพาะ
การรวมกันของภาษา ประเทศหรือดินแดน และชุดรหัส อ่านคำแนะนำเกี่ยวกับ
การตั้งชื่อโลแคล: ไม่ใช่ทุกระบบที่ตั้งชื่อโลแคลตามตัวอย่าง

หากไม่มีการระบุอาร์กิวเมนต์ที่สองและหมวดหมู่นั้นเป็นอย่างอื่นที่ไม่ใช่ "LC_ALL" ค่า
ฟังก์ชั่นส่งคืนสตริงที่ตั้งชื่อสถานที่ปัจจุบันสำหรับหมวดหมู่ คุณสามารถใช้สิ่งนี้
ค่าเป็นอาร์กิวเมนต์ที่สองในการเรียก "setlocale()" ในภายหลัง แต่ บนบางแพลตฟอร์ม
สตริงไม่ชัดเจนไม่ใช่สิ่งที่คนส่วนใหญ่สามารถถอดรหัสได้ว่าคืออะไร
สถานที่มันหมายถึง

หากไม่มีการระบุอาร์กิวเมนต์ที่สองและหมวดหมู่คือ "LC_ALL" ผลลัพธ์จะเป็น
ขึ้นอยู่กับการนำไปปฏิบัติ อาจเป็นสตริงของชื่อโลแคลที่ต่อกัน (ตัวคั่นด้วย
ขึ้นอยู่กับการใช้งาน) หรือชื่อสถานที่เดียว โปรดปรึกษาคุณ ตั้งค่าภาษา(3) ผู้ชาย
เพื่อดูรายละเอียด

ถ้าอาร์กิวเมนต์ที่สองได้รับและสอดคล้องกับโลแคลที่ถูกต้อง โลแคลสำหรับ
หมวดหมู่ถูกตั้งค่าเป็นค่านั้น และฟังก์ชันจะส่งกลับค่าสถานที่ปัจจุบัน คุณ
จากนั้นสามารถใช้สิ่งนี้ในการเรียก "setlocale()" อีกครั้ง (ในการใช้งานบางอย่าง
ค่าที่ส่งคืนในบางครั้งอาจแตกต่างจากค่าที่คุณให้ไว้เป็นอาร์กิวเมนต์ที่สอง - คิดถึง
เป็นนามแฝงสำหรับค่าที่คุณให้)

ตามตัวอย่างที่แสดง ถ้าอาร์กิวเมนต์ที่สองเป็นสตริงว่าง ภาษาของหมวดหมู่คือ
กลับสู่ค่าเริ่มต้นที่ระบุโดยตัวแปรสภาพแวดล้อมที่เกี่ยวข้อง โดยทั่วไป,
ส่งผลให้กลับสู่ค่าเริ่มต้นที่มีผลบังคับใช้เมื่อ Perl เริ่มทำงาน: เปลี่ยนเป็น
สภาพแวดล้อมที่ทำโดยแอปพลิเคชันหลังจากเริ่มต้นอาจสังเกตหรือไม่ก็ได้ขึ้นอยู่กับ
บนไลบรารี C ของระบบของคุณ

โปรดทราบว่าเมื่อมีการระบุรูปแบบของ "ใช้สถานที่" ที่ไม่มีหมวดหมู่ทั้งหมด
Perl ละเว้นหมวดหมู่ที่ยกเว้น

หาก "set_locale()" ล้มเหลวด้วยเหตุผลบางประการ (เช่น พยายามตั้งค่าเป็น locale
ระบบไม่รู้จัก) สถานที่สำหรับหมวดหมู่จะไม่เปลี่ยนแปลงและฟังก์ชัน
ส่งคืน "undef"

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหมวดหมู่ โปรดปรึกษา ตั้งค่าภาษา(3)

หา ในประเทศ
สำหรับสถานที่ที่มีอยู่ในระบบของคุณ ปรึกษายัง ตั้งค่าภาษา(3) เพื่อดูว่าจะนำไปสู่
รายชื่อสถานที่ที่มีอยู่ (ค้นหา SEE นอกจากนี้ ส่วน). หากไม่สำเร็จ ให้ลองใช้
บรรทัดคำสั่งต่อไปนี้:

สถานที่เกิดเหตุ - a

nlsinfo

ls /usr/lib/nls/loc

ls /usr/lib/locale

ls /usr/lib/nls

ls /usr/share/ภาษา

และดูว่ามีอะไรที่คล้ายคลึงเหล่านี้หรือไม่

en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
en_US.iso88591 de_DE.iso88591 ru_RU.iso88595
en_US de_DE ru_RU
en de ru
อังกฤษ เยอรมัน รัสเซีย
อังกฤษ.iso88591 เยอรมัน.iso88591 รัสเซีย.iso88595
อังกฤษ.roman8 รัสเซีย.koi8r

น่าเศร้าแม้ว่าอินเทอร์เฟซการโทรสำหรับ "setlocale()" จะได้รับมาตรฐานแล้วก็ตาม ชื่อของ
โลแคลและไดเร็กทอรีที่ไม่มีคอนฟิกูเรชันอยู่ แบบฟอร์มพื้นฐาน
ของชื่อคือ ภาษา_ดินแดน.ชุดรหัสแต่ส่วนหลังหลัง language ไม่ได้
นำเสนออยู่เสมอ ดิ language และ ประเทศ มักจะมาจากมาตรฐาน มาตรฐาน ISO 3166 และ มาตรฐาน ISO
639ตัวย่อสองตัวอักษรสำหรับประเทศและภาษาของโลก
ตามลำดับ ชุดรหัส ส่วนหนึ่งมักจะกล่าวถึงบางส่วน มาตรฐาน ISO 8859 ชุดอักขระ ภาษาละติน
ชุดรหัส ตัวอย่างเช่น "ISO 8859-1" คือสิ่งที่เรียกว่า "ชุดรหัสยุโรปตะวันตก" ที่สามารถ
ใช้ในการเข้ารหัสภาษายุโรปตะวันตกส่วนใหญ่อย่างเพียงพอ มีอีกหลายอย่าง
วิธีเขียนแม้แต่ชื่อของมาตรฐานนั้น เศร้า.

สถานที่พิเศษสองแห่งที่ควรค่าแก่การกล่าวถึง: "C" และ "POSIX" ปัจจุบันเหล่านี้คือ
โลแคลเดียวกันอย่างมีประสิทธิภาพ: ความแตกต่างเป็นหลักที่อันแรกถูกกำหนดโดย
มาตรฐาน C ที่สองโดยมาตรฐาน POSIX พวกเขากำหนด ผิดนัด ในประเทศ ซึ่งอยู่ใน
ทุกโปรแกรมเริ่มต้นโดยไม่มีข้อมูลสถานที่ในสภาพแวดล้อม (ดิ
ผิดนัด สถานที่เริ่มต้นถ้าคุณต้องการ) ภาษาของมันคือ (อเมริกัน) ภาษาอังกฤษและ
ชุดรหัสอักขระ ASCII หรือซุปเปอร์เซ็ตของอักขระดังกล่าว (เช่น "DEC Multinational
ชุดอักขระ (DEC-MCS)") การเตือน. สถานที่ C ที่จัดส่งโดยผู้ขายบางรายอาจไม่
ตรงกับสิ่งที่มาตรฐาน C เรียกร้องจริงๆ ดังนั้นจงระวัง

หมายเหตุ: ไม่ใช่ทุกระบบที่มีโลแคล "POSIX" (ไม่ใช่ทุกระบบที่สอดคล้องกับ POSIX) ดังนั้น
ใช้ "C" เมื่อคุณต้องการระบุตำแหน่งที่ตั้งเริ่มต้นนี้อย่างชัดเจน

ในท้องถิ่น ปัญหา
คุณอาจพบข้อความเตือนต่อไปนี้เมื่อเริ่มต้น Perl:

Perl: คำเตือน: การตั้งค่าสถานที่ล้มเหลว
perl: คำเตือน: โปรดตรวจสอบการตั้งค่าสถานที่ของคุณ:
LC_ALL = "En_US",
LANG = (ไม่ได้ตั้งค่า)
ได้รับการสนับสนุนและติดตั้งในระบบของคุณ
perl: คำเตือน: ถอยกลับไปสู่โลแคลมาตรฐาน ("C")

ซึ่งหมายความว่าการตั้งค่าสถานที่ของคุณมีการตั้งค่า "LC_ALL" เป็น "En_US" และ LANG อยู่แต่มี
ไม่มีค่า Perl พยายามจะเชื่อคุณแต่ทำไม่ได้ แต่ Perl ยอมแพ้และถอยกลับ
ไปที่โลแคล "C" ซึ่งเป็นโลแคลเริ่มต้นที่ควรจะทำงานไม่ว่าจะเกิดอะไรขึ้น (บน
Windows จะพยายามย้อนกลับไปที่ตำแหน่งเริ่มต้นของระบบก่อน) ซึ่งมักจะหมายถึง
การตั้งค่าสถานที่ของคุณไม่ถูกต้อง พวกเขากล่าวถึงสถานที่ซึ่งระบบของคุณไม่เคยได้ยินหรือ
การติดตั้งโลแคลในระบบของคุณมีปัญหา (เช่น ไฟล์ระบบบางไฟล์คือ
เสียหรือสูญหาย) มีการแก้ไขปัญหาเหล่านี้อย่างรวดเร็วและชั่วคราว เช่นเดียวกับ
การแก้ไขที่ละเอียดและยาวนานยิ่งขึ้น

การทดสอบ สำหรับ แตก ในประเทศ
หากคุณกำลังสร้าง Perl จากแหล่งที่มา ไฟล์ชุดทดสอบ Perl lib/locale.t สามารถใช้ในการ
ทดสอบโลแคลในระบบของคุณ การตั้งค่าตัวแปรสภาพแวดล้อม "PERL_DEBUG_FULL_TEST"
ถึง 1 จะทำให้ได้ผลลัพธ์โดยละเอียด ตัวอย่างเช่น บน Linux คุณสามารถพูดว่า

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

นอกจากการทดสอบอื่นๆ อีกมากมายแล้ว มันจะทดสอบทุกสถานที่ที่พบในระบบของคุณเพื่อดูว่าพวกเขา
เป็นไปตามมาตรฐาน POSIX หากมีข้อผิดพลาดจะรวมสรุปไว้ใกล้สิ้นสุด
ของผลลัพธ์ที่โลแคลผ่านการทดสอบทั้งหมด และที่ล้มเหลว และทำไม

ชั่วคราว เครื่องประกอบ ในประเทศ ปัญหาที่เกิดขึ้น
การแก้ไขที่เร็วที่สุดสองวิธีคือทำให้ Perl เงียบเกี่ยวกับความไม่สอดคล้องกันของสถานที่
หรือเพื่อเรียกใช้ Perl ภายใต้สถานที่เริ่มต้น "C"

เสียงคร่ำครวญของ Perl เกี่ยวกับปัญหาสถานที่นั้นสามารถปิดเสียงได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม
"PERL_BADLANG" ถึง "0" หรือ "" วิธีนี้ช่วยขจัดปัญหาใต้พรมได้จริงๆ:
คุณบอกให้ Perl หุบปากแม้ว่า Perl จะเห็นว่ามีบางอย่างผิดปกติ ไม่ต้องแปลกใจ
ถ้าในภายหลังมีบางอย่างทำงานผิดปกติขึ้นอยู่กับสถานที่

Perl สามารถเรียกใช้ภายใต้สถานที่ "C" โดยการตั้งค่าตัวแปรสภาพแวดล้อม "LC_ALL" เป็น "C"
วิธีนี้อาจมีอารยะมากกว่าแนวทาง "PERL_BADLANG" เล็กน้อย แต่การตั้งค่า
"LC_ALL" (หรือตัวแปรโลแคลอื่นๆ) อาจส่งผลต่อโปรแกรมอื่นๆ เช่นกัน ไม่ใช่แค่ Perl ใน
โดยเฉพาะโปรแกรมภายนอกที่ทำงานจากภายใน Perl จะเห็นการเปลี่ยนแปลงเหล่านี้ ถ้าคุณทำ
การตั้งค่าใหม่ถาวร (อ่านต่อ) โปรแกรมทั้งหมดที่คุณเรียกใช้จะเห็นการเปลี่ยนแปลง ดู
"ENVIRONMENT" สำหรับรายการตัวแปรสภาพแวดล้อมที่เกี่ยวข้องทั้งหมดและ "การใช้ LOCALES" สำหรับ
ผลกระทบใน Perl ผลกระทบในโปรแกรมอื่นสามารถอนุมานได้ง่าย ตัวอย่างเช่น
ตัวแปร "LC_COLLATE" อาจส่งผลต่อ . ของคุณเป็นอย่างดี ประเภท โปรแกรม (หรือโปรแกรมอะไรก็ได้ที่
จัดเรียง "บันทึก" ตามลำดับตัวอักษรในระบบของคุณเรียกว่า)

คุณสามารถทดสอบการเปลี่ยนแปลงตัวแปรเหล่านี้ชั่วคราว และหากการตั้งค่าใหม่ดูเหมือน
ช่วยใส่การตั้งค่าเหล่านั้นลงในไฟล์เริ่มต้นเชลล์ของคุณ ปรึกษาเอกสารในพื้นที่ของคุณ
สำหรับรายละเอียดที่แน่นอน สำหรับเปลือกหอยที่เหมือนบอร์น (sh, ครับ, ทุบตี, zsh):

LC_ALL=en_US.ISO8859-1
ส่งออก LC_ALL

นี่ถือว่าเราเห็นโลแคล "en_US.ISO8859-1" โดยใช้คำสั่งที่กล่าวถึงข้างต้น
เราตัดสินใจลองใช้มันแทนโลแคล "En_US" ที่ผิดพลาดด้านบน -- และใน Cshish shells
(csh, tcsh)

setenv LC_ALL en_US.ISO8859-1

หรือถ้าคุณมีแอปพลิเคชัน "env" คุณสามารถทำได้ (ในเชลล์ใดก็ได้)

env LC_ALL=en_US.ISO8859-1 เพิร์ล ...

หากคุณไม่รู้ว่าคุณมีเชลล์อะไรอยู่ ให้ปรึกษาฝ่ายช่วยเหลือในพื้นที่ของคุณหรือที่เทียบเท่า

อย่างถาวร เครื่องประกอบ ในประเทศ ปัญหาที่เกิดขึ้น
การแก้ไขที่ช้ากว่าแต่เหนือกว่าคือตอนที่คุณอาจแก้ไขได้ด้วยตัวเอง
การกำหนดค่าตัวแปรสภาพแวดล้อมของคุณเองผิดพลาด การกำหนดค่าที่ผิดพลาด (ร้องเพลง) ของ
โลแคลของระบบทั้งหมดมักจะต้องการความช่วยเหลือจากผู้ดูแลระบบที่เป็นมิตรของคุณ

ขั้นแรก ดูก่อนหน้านี้ในเอกสารนี้เกี่ยวกับ "การค้นหาสถานที่" ที่บอกวิธีหาที่
โลแคลได้รับการสนับสนุนจริง ๆ และที่สำคัญกว่านั้นคือติดตั้งบนระบบของคุณ ในของเรา
ตัวอย่างข้อความแสดงข้อผิดพลาด ตัวแปรสภาพแวดล้อมที่ส่งผลต่อสถานที่แสดงอยู่ในลำดับ
มีความสำคัญน้อยลง (และตัวแปรที่ไม่ได้ตั้งค่าก็ไม่สำคัญ) จึงมี LC_ALL
ตั้งค่าเป็น "En_US" จะต้องเป็นตัวเลือกที่ไม่ดี ดังที่แสดงในข้อความแสดงข้อผิดพลาด ครั้งแรกลอง
แก้ไขการตั้งค่าสถานที่ที่ระบุไว้ก่อน

ประการที่สอง หากใช้คำสั่งในรายการ คุณจะเห็นบางอย่าง เผง (การจับคู่คำนำหน้าไม่
ปกติจะนับและตัวพิมพ์ใหญ่) เช่น "En_US" โดยไม่มีเครื่องหมายคำพูด คุณน่าจะโอเค
เนื่องจากคุณใช้ชื่อโลแคลที่ควรติดตั้งและพร้อมใช้งานในระบบของคุณ
ในกรณีนี้ โปรดดูที่ "การแก้ไขการกำหนดค่าภาษาของระบบอย่างถาวร"

อย่างถาวร เครื่องประกอบ ธุรกิจ ของระบบ ในประเทศ องค์ประกอบ
นี่คือเมื่อคุณเห็นบางสิ่งเช่น:

perl: คำเตือน: โปรดตรวจสอบการตั้งค่าสถานที่ของคุณ:
LC_ALL = "En_US",
LANG = (ไม่ได้ตั้งค่า)
ได้รับการสนับสนุนและติดตั้งในระบบของคุณ

แต่ไม่เห็นว่า "En_US" แสดงรายการตามคำสั่งที่กล่าวถึงข้างต้น คุณอาจเห็น
อย่างเช่น "en_US.ISO8859-1" แต่นั่นไม่ใช่สิ่งเดียวกัน ในกรณีนี้ ให้ลองวิ่งภายใต้ a
สถานที่ที่คุณสามารถระบุได้และตรงกับสิ่งที่คุณพยายามทำ กฎการจับคู่
ชื่อโลแคลค่อนข้างคลุมเครือเนื่องจากมาตรฐานยังอ่อนแอในพื้นที่นี้ ดูอีกครั้ง
"การค้นหาสถานที่" เกี่ยวกับกฎทั่วไป

เครื่องประกอบ ระบบ ในประเทศ องค์ประกอบ
ติดต่อผู้ดูแลระบบ (ควรเป็นของคุณเอง) และรายงานข้อความแสดงข้อผิดพลาดที่ถูกต้อง
คุณได้รับและขอให้พวกเขาอ่านเอกสารเดียวกันกับที่คุณกำลังอ่านอยู่ พวกเขาควรจะ
สามารถตรวจสอบว่ามีบางอย่างผิดปกติกับการกำหนดค่าโลแคลของ
ระบบ. ส่วน "การค้นหาสถานที่" ค่อนข้างคลุมเครือเกี่ยวกับเรื่องที่แน่นอน
คำสั่งและสถานที่เพราะสิ่งเหล่านี้ไม่ได้มาตรฐาน

การขอ localeconv ฟังก์ชัน
ฟังก์ชัน "POSIX::localeconv()" ช่วยให้คุณรับรายละเอียดของ locale-dependent
ข้อมูลการจัดรูปแบบตัวเลขที่ระบุโดย "LC_NUMERIC" และ
โลแคล "LC_MONETARY" (ไม่ว่าจะเรียกจากภายในขอบเขตของ "use locale" หรือไม่
หรือไม่). (หากคุณต้องการเพียงชื่อสถานที่ปัจจุบันสำหรับหมวดหมู่ใดประเภทหนึ่ง ให้ใช้
"POSIX::setlocale()" พร้อมพารามิเตอร์เดียว - โปรดดู "ฟังก์ชัน setlocale")

ใช้ POSIX qw(locale_h);

# รับการอ้างอิงถึงแฮชของข้อมูลขึ้นอยู่กับสถานที่
$locale_values ​​= localeconv();

# ผลลัพธ์ที่เรียงลำดับรายการของค่า
สำหรับ (คีย์การเรียงลำดับ %$locale_values) {
printf "%-20s = %s\n", $_, $locale_values->{$_}
}

"localeconv()" ไม่รับอาร์กิวเมนต์และส่งคืน a การอ้างอิง ไปยัง แฮช กุญแจของสิ่งนี้
hash คือชื่อตัวแปรสำหรับการจัดรูปแบบ เช่น "decimal_point" และ "thousands_sep" ดิ
ค่าคือค่าที่สอดคล้องกัน er ค่า ดู "localeconv" ใน POSIX สำหรับตัวอย่างที่ยาวขึ้น
แสดงรายการประเภทที่คาดว่าจะมีการนำไปใช้งาน บ้างให้มากกว่านี้
และอื่น ๆ น้อยลง คุณไม่จำเป็นต้องมี "use locale" ที่ชัดเจนเพราะ "localeconv()" เสมอ
สังเกตสถานที่ปัจจุบัน

นี่คือตัวอย่างโปรแกรมง่ายๆ ที่เขียนพารามิเตอร์บรรทัดคำสั่งใหม่เป็น
จำนวนเต็มถูกจัดรูปแบบอย่างถูกต้องในสถานที่ปัจจุบัน:

ใช้ POSIX qw(locale_h);

# รับพารามิเตอร์การจัดรูปแบบตัวเลขของโลแคล
my ($พัน_sep, $จัดกลุ่ม) =
@{localeconv()}{'thousands_sep', 'grouping'};

# ใช้ค่าเริ่มต้นหากไม่มีค่า
$thousands_sep = ',' ยกเว้น $thousands_sep;

# การจัดกลุ่มและ mon_grouping ถูกบรรจุรายการ
#ของจำนวนเต็มขนาดเล็ก (ตัวอักษร) บอก
# การจัดกลุ่ม (thousand_seps และ mon_thousand_seps
#เป็นตัวแบ่งกลุ่ม) ของตัวเลขและ
#ปริมาณเงิน. ความหมายของจำนวนเต็ม:
# 255 หมายถึงไม่มีการจัดกลุ่มอีกต่อไป 0 หมายถึงทำซ้ำ
#กลุ่มที่แล้ว 1-254 แปลว่าใช้นั่น
#เป็นการจัดกลุ่มในปัจจุบัน การจัดกลุ่มเริ่มจาก
# จากขวาไปซ้าย (ตัวเลขต่ำไปสูง) ใน
#ข้างล่างโกงนิดหน่อยไม่เคยใช้อะไร
#นอกเหนือการจัดกลุ่มแรก (อะไรก็ตามที่เป็น)
ถ้า ($จัดกลุ่ม) {
@grouping = unpack("C*", $จัดกลุ่ม);
} else {
@การจัดกลุ่ม = (3);
}

# จัดรูปแบบบรรทัดคำสั่ง params สำหรับสถานที่ปัจจุบัน
สำหรับ (@ARGV) {
$_ = int; # สับส่วนที่ไม่ใช่จำนวนเต็ม
1 ในขณะที่
s/(\d)(\d{$การจัดกลุ่ม[0]}($|$thousands_sep))/$1$thousands_sep$2/;
พิมพ์ "$_";
}
พิมพ์ "\n";

โปรดทราบว่าหากแพลตฟอร์มไม่มี "LC_NUMERIC" และ/หรือ "LC_MONETARY" หรือ
เปิดใช้งานองค์ประกอบที่เกี่ยวข้องของแฮชจะหายไป

I18N::Langinfo
อินเทอร์เฟซอื่นสำหรับการสืบค้นข้อมูลขึ้นอยู่กับสถานที่คือ
ฟังก์ชัน "I18N::Langinfo::langinfo()" มีให้ใช้งานอย่างน้อยในระบบที่คล้าย Unix และ VMS

ตัวอย่างต่อไปนี้จะนำเข้าฟังก์ชัน "langinfo()" และค่าคงที่สามตัวไปที่
ใช้เป็นอาร์กิวเมนต์ของ "langinfo()": ค่าคงที่สำหรับวันแรกของสัปดาห์แบบย่อ
(การนับเริ่มจากวันอาทิตย์ = 1) และค่าคงที่อีกสองค่าสำหรับการยืนยันและ
คำตอบเชิงลบสำหรับคำถามใช่/ไม่ใช่ในภาษาปัจจุบัน

ใช้ I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR);

ของฉัน ($abday_1, $yesstr, $nostr)
= แผนที่ { langinfo } qw (ABDAY_1 YESSTR NOTR);

พิมพ์ "$abday_1? [$yesstr/$nostr] ";

กล่าวอีกนัยหนึ่งในภาษา "C" (หรือภาษาอังกฤษ) ข้างต้นอาจจะพิมพ์อะไรบางอย่าง
ชอบ:

ดวงอาทิตย์? [ใช่ไม่ใช่]

ดู I18N::Langinfo สำหรับข้อมูลเพิ่มเติม

ในท้องถิ่น หมวดหมู่


ส่วนย่อยต่อไปนี้อธิบายหมวดหมู่สถานที่พื้นฐาน นอกเหนือจากนี้ บ้าง
หมวดหมู่แบบผสมช่วยให้สามารถจัดการหมวดหมู่พื้นฐานได้มากกว่าหนึ่งหมวดหมู่ในแต่ละครั้ง ดู
“สิ่งแวดล้อม” สำหรับการอภิปรายเรื่องเหล่านี้

Category "LC_COLLATE": การตรวจทาน
ในขอบเขตของรูปแบบ "ใช้สถานที่" ที่มีการจัดเรียง Perl จะดูที่
ตัวแปรสภาพแวดล้อม "LC_COLLATE" เพื่อกำหนดแนวคิดของแอปพลิเคชันในการเทียบเคียง
(การเรียงลำดับ) ของตัวละคร ตัวอย่างเช่น "b" ตามหลัง "a" ในตัวอักษรละติน แต่ do
"a" และ "aa" เป็นของ? และในขณะที่ "สี" ตามหลัง "ช็อกโกแลต" เป็นภาษาอังกฤษ แล้วใน
ภาษาสเปนแบบดั้งเดิม?

การเทียบเคียงต่อไปนี้สมเหตุสมผลทั้งหมด และคุณอาจพบกับการเทียบเคียงเหล่านี้ได้หากคุณ "ใช้สถานที่"

ABCDE abcde
A a B b C c D d E อี
ก ก บี ค ค ดี เด อี
abcde ABCDE

นี่คือข้อมูลโค้ดที่จะบอกว่าอักขระ "word" ใดอยู่ในสถานที่ปัจจุบันในนั้น
คำสั่งของสถานที่:

ใช้สถานที่;
พิมพ์ +( sort grep /\w/, map { chr } 0), "\n";

เปรียบเทียบสิ่งนี้กับอักขระที่คุณเห็นและลำดับหากคุณระบุอย่างชัดเจนว่า
ควรละเว้นสถานที่:

ไม่มีสถานที่;
พิมพ์ +( sort grep /\w/, map { chr } 0), "\n";

การเปรียบเทียบแบบแมชชีนเนทีฟนี้ (ซึ่งเป็นสิ่งที่คุณได้รับเว้นแต่ "ใช้สถานที่" ปรากฏขึ้น
ก่อนหน้าในบล็อกเดียวกัน) ต้องใช้สำหรับการเรียงลำดับข้อมูลไบนารีดิบในขณะที่โลแคล-
การเรียงตามตัวอย่างแรกจะเป็นประโยชน์สำหรับข้อความธรรมชาติ

ตามที่ระบุไว้ใน "การใช้โลแคล" "cmp" จะเปรียบเทียบตามโลแคลการจัดเรียงปัจจุบันเมื่อ
"ใช้สถานที่" มีผลบังคับใช้ แต่กลับไปใช้การเปรียบเทียบแบบอักขระต่ออักขระสำหรับสตริงที่
สถานที่กล่าวว่าเท่าเทียมกัน คุณสามารถใช้ "POSIX::strcoll()" ได้ หากคุณไม่ต้องการให้ฤดูใบไม้ร่วงนี้-
กลับ:

ใช้ POSIX qw(strcoll);
$equal_in_locale =
!strcoll("เว้นวรรคและตัวพิมพ์เล็ก", "SpaceAndCaseIgnored");

$equal_in_locale จะเป็นจริงหาก collation locale ระบุการเรียงลำดับเหมือนพจนานุกรม
ที่ละเว้นอักขระช่องว่างอย่างสมบูรณ์และกรณีพับ

ปัจจุบัน Perl รองรับเฉพาะสถานที่แบบไบต์เดียวสำหรับ "LC_COLLATE" ซึ่งหมายความว่า
โลแคล UTF-8 มีแนวโน้มที่จะให้คุณสั่งซื้อจากเครื่อง ใช้ Unicode::Collate สำหรับ
การใช้งาน Unicode Collation Algorithm อย่างเต็มรูปแบบ

หากคุณมีสตริงเดียวที่คุณต้องการตรวจสอบ "ความเท่าเทียมกันในสถานที่" กับ
อื่นๆ อีกหลายอย่าง คุณอาจคิดว่าคุณสามารถเพิ่มประสิทธิภาพได้เล็กน้อยโดยใช้
"POSIX::strxfrm()" ร่วมกับ "eq":

ใช้ POSIX qw(strxfrm);
$xfrm_string = strxfrm("สตริงตัวพิมพ์ผสม");
พิมพ์ "การเทียบตำแหน่งละเว้นช่องว่าง\n"
ถ้า $xfrm_string eq strxfrm("Mixed-casestring");
พิมพ์ "การเรียงภาษาละเว้นยัติภังค์\n"
ถ้า $xfrm_string eq strxfrm("สตริงผสม");
พิมพ์ "การเรียงภาษาละเว้นตัวพิมพ์\n"
ถ้า $xfrm_string eq strxfrm("สตริงกรณีแบบผสม");

"strxfrm()" ดึงสตริงและแมปเป็นสตริงที่แปลงแล้วเพื่อใช้ในรูปแบบ char-by-char
เปรียบเทียบกับสตริงที่แปลงแล้วอื่น ๆ ระหว่างการจัดเรียง "ภายใต้ประทุน" สถานที่-
ตัวดำเนินการเปรียบเทียบ Perl ที่ได้รับผลกระทบเรียก "strxfrm()" สำหรับตัวถูกดำเนินการทั้งสอง จากนั้นทำการ char-by-
การเปรียบเทียบถ่านของสตริงที่แปลงแล้ว โดยการเรียก "strxfrm()" อย่างชัดเจนและใช้ a
การเปรียบเทียบที่ไม่ได้รับผลกระทบจากสถานที่ ตัวอย่างพยายามบันทึกการแปลงสองสามรายการ
แต่ในความเป็นจริง มันไม่ได้ช่วยอะไรเลย: Perl magic (ดู "ตัวแปรวิเศษ" ใน perlguts)
สร้างเวอร์ชันที่แปลงแล้วของสตริงในครั้งแรกที่ต้องการในการเปรียบเทียบ
แล้วเก็บเวอร์ชันนี้ไว้เผื่อจำเป็นอีกครั้ง ตัวอย่างที่เขียนใหม่ง่าย
วิธีที่ "cmp" ทำงานเร็วพอๆ กัน นอกจากนี้ยังจัดการกับอักขระว่างที่ฝังอยู่ใน
สตริง; หากคุณเรียก "strxfrm()" โดยตรง จะถือว่าค่า null แรกที่พบว่าเป็น a
เทอร์มินอล อย่าคาดหวังว่าสตริงที่แปลงแล้วจะพกพาสะดวก
ระบบ หรือแม้แต่จากการปรับปรุงระบบปฏิบัติการของคุณเป็นรุ่นถัดไป ในระยะสั้นอย่า
โทร "strxfrm()" โดยตรง: ให้ Perl ทำเพื่อคุณ

หมายเหตุ: "use locale" ไม่แสดงในตัวอย่างเหล่านี้ เนื่องจากไม่จำเป็น:
"strcoll()" และ "strxfrm()" เป็นฟังก์ชัน POSIX ที่ใช้ระบบมาตรฐานที่ให้มา
ฟังก์ชัน "libc" ที่เป็นไปตามโลแคล "LC_COLLATE" ปัจจุบันเสมอ

Category "LC_CTYPE": คาแรคเตอร์ ประเภท
ในขอบเขตของรูปแบบ "ใช้สถานที่" ที่มี "LC_CTYPE" Perl ปฏิบัติตาม "LC_CTYPE"
การตั้งค่าสถานที่ สิ่งนี้ควบคุมความคิดของแอปพลิเคชันว่าตัวละครใดอยู่
ตัวอักษร, ตัวเลข, เครื่องหมายวรรคตอน, ฯลฯ. สิ่งนี้ส่งผลต่อนิพจน์ทั่วไป "\w" ของ Perl
metanotation ซึ่งย่อมาจากตัวอักษรและตัวเลข - นั่นคือตัวอักษรตัวเลขและ
ขีดล่างดั้งเดิมของแพลตฟอร์ม (ปรึกษา perlre สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปกติ
นิพจน์) ขอบคุณ "LC_CTYPE" ขึ้นอยู่กับการตั้งค่าสถานที่ของคุณ อักขระเช่น
"ae", "`", "ss" และ "o" อาจเข้าใจได้ว่าเป็นอักขระ "\w" ยังส่งผลต่อสิ่งต่างๆ
เช่น "\s", "\D" และคลาสอักขระ POSIX เช่น "[[:graph:]]" (ดู
perlrecharclass สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้)

โลแคล "LC_CTYPE" ยังจัดเตรียมแผนที่ที่ใช้ในการทับศัพท์อักขระระหว่าง
ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ สิ่งนี้ส่งผลต่อฟังก์ชันการแมปกรณี--"fc()", "lc()",
"lcfirst()", "uc()" และ "ucfirst()"; การแก้ไขการแมปเคสด้วย "\F", "\l", "\L",
"\u" หรือ "\U" ในสตริงที่มีเครื่องหมายคำพูดคู่และการแทนที่ "s///" และกรณีอิสระ
การจับคู่รูปแบบนิพจน์ทั่วไปโดยใช้ตัวแก้ไข "i"

สุดท้าย "LC_CTYPE" จะมีผลกับการทดสอบคลาสอักขระ POSIX (เลิกใช้แล้ว)
ฟังก์ชัน--"POSIX::isalpha()", "POSIX::islower()" และอื่นๆ ตัวอย่างเช่น หากคุณย้าย
จากโลแคล "C" ไปจนถึง ISO 7 แบบ 646 บิต คุณอาจพบว่า
"|" ย้ายจากคลาส "POSIX::ispunct()" เป็น "POSIX::isalpha()" น่าเสียดายที่สิ่งนี้
สร้างปัญหาใหญ่สำหรับนิพจน์ทั่วไป "|" ยังคงหมายถึงการสลับกันแม้ว่าจะ
ตรงกับ "\w" เริ่มใน v5.22 จะมีการเตือนเมื่อมีการเปลี่ยนสถานที่ดังกล่าว
เข้าไปข้างใน. รายละเอียดเพิ่มเติมมีให้อีกหลายย่อหน้าลงไป

เริ่มต้นใน v5.20 Perl รองรับภาษา UTF-8 สำหรับ "LC_CTYPE" แต่อย่างอื่น Perl เท่านั้น
รองรับโลแคลแบบไบต์เดียว เช่น ซีรี่ส์ ISO 8859 ซึ่งหมายความว่าตัวอักษรกว้าง
โลแคล เช่น ภาษาเอเชีย ไม่ได้รับการสนับสนุนเป็นอย่างดี (หากแพลตฟอร์มมี
ความสามารถของ Perl ในการตรวจหาสถานที่ดังกล่าว โดยเริ่มต้นใน Perl v5.22 Perl จะเตือน
เปิดใช้งานโดยค่าเริ่มต้น โดยใช้หมวดหมู่คำเตือน "locale" ทุกครั้งที่มีการเปลี่ยนสถานที่ดังกล่าว
เป็น) การรองรับโลแคล UTF-8 จริง ๆ แล้วเป็นซูเปอร์เซ็ตของโลแคล POSIX เนื่องจากเป็น
พฤติกรรม Unicode ที่สมบูรณ์จริง ๆ ราวกับว่าไม่มีสถานที่ "LC_CTYPE" ที่มีผลเลย (ยกเว้นสำหรับ
เสีย; ดู "ความปลอดภัย") โลแคล POSIX แม้แต่ UTF-8 ก็ยังขาดแนวคิดบางอย่าง
ใน Unicode เช่น ความคิดที่ว่าการเปลี่ยนตัวพิมพ์ของตัวอักษรสามารถขยายให้กว้างขึ้นได้
มากกว่าหนึ่งตัวอักษร Perl ในภาษา UTF-8 จะให้ส่วนขยายนั้นแก่คุณ ก่อนหน้า
v5.20 Perl จัดการกับ UTF-8 locale ในบางแพลตฟอร์มเช่น ISO 8859-1 ด้วย some
ข้อ จำกัด และบนแพลตฟอร์มอื่น ๆ เช่นภาษา "C" สำหรับรุ่น v5.16 และ
v5.18, "use locale 'not_characters" สามารถใช้เป็นวิธีแก้ปัญหาสำหรับสิ่งนี้ (ดู "Unicode
และ UTF-8")

โปรดทราบว่ามีบางสิ่งที่ไม่ได้รับผลกระทบจากสถานที่ปัจจุบัน ใด ๆ
ตัวอักษรเป็นตัวอักษรพื้นเมืองสำหรับแพลตฟอร์มที่กำหนด ดังนั้น 'A' จึงหมายถึง
อักขระที่รหัสจุด 65 บนแพลตฟอร์ม ASCII และ 193 บน EBCDIC นั่นอาจจะใช่หรือไม่ใช่ก็ได้
'A' ในภาษาปัจจุบัน ถ้าสถานที่นั้นยังมี 'A' ในทำนองเดียวกันการหลบหนีทั้งหมด
ลำดับของอักขระเฉพาะ เช่น "\n" หมายถึงเนทีฟของแพลตฟอร์มเสมอ
หนึ่ง. ซึ่งหมายความว่า ตัวอย่างเช่น "\N" ในนิพจน์ทั่วไป (ทุกอักขระยกเว้น ใหม่-
line) ทำงานบนชุดอักขระของแพลตฟอร์ม

เริ่มต้นใน v5.22 โดยค่าเริ่มต้น Perl จะเตือนเมื่อเปลี่ยนเป็นโลแคลที่กำหนดใหม่
อักขระที่พิมพ์ได้ ASCII ใดๆ (บวก "\t" และ "\n") เป็นคลาสที่แตกต่างจากที่คาดไว้
สิ่งนี้มีแนวโน้มที่จะเกิดขึ้นในพื้นที่ที่ทันสมัยบนแพลตฟอร์ม EBCDIC เท่านั้น ตัวอย่างเช่น a
CCSID 0037 locale บนเครื่อง CCSID 1047 ย้าย "[" แต่อาจเกิดขึ้นบนแพลตฟอร์ม ASCII
ด้วย ISO 646 และโลแคล 7 บิตอื่นๆ ที่ล้าสมัยไปแล้ว สิ่งต่าง ๆ อาจยังคงอยู่
ทำงานขึ้นอยู่กับคุณสมบัติของ Perl ที่โปรแกรมใช้ ตัวอย่างเช่น ใน
ตัวอย่างจากด้านบนโดยที่ "|" กลายเป็น "\w" และไม่มีนิพจน์ทั่วไปที่
เรื่องนี้โปรแกรมอาจยังทำงานได้อย่างถูกต้อง คำเตือนแสดงรายการอักขระทั้งหมด
ที่สามารถระบุได้ว่าจะส่งผลกระทบ

หมายเหตุ คำจำกัดความสถานที่ "LC_CTYPE" ที่เสียหายหรือเป็นอันตรายอาจส่งผลให้ไม่มีสิทธิ์อย่างชัดเจน
อักขระที่แอปพลิเคชันของคุณพิจารณาว่าเป็นตัวอักษรและตัวเลข สำหรับการจับคู่ที่เข้มงวด
ของ (โลกีย์) ตัวอักษรและตัวเลข ASCII - ตัวอย่างเช่น ในสตริงคำสั่ง - locale-aware
แอปพลิเคชันควรใช้ "\w" กับตัวแก้ไขนิพจน์ทั่วไป "/a" ดู "ความปลอดภัย"

Category "LC_NUMERIC": เป็นตัวเลข การจัดรูปแบบ
หลังจากการเรียก "POSIX::setlocale()" ที่เหมาะสม และอยู่ในขอบเขตของแบบฟอร์ม "use locale"
ที่มีตัวเลข Perl ปฏิบัติตามข้อมูลสถานที่ "LC_NUMERIC" ซึ่งควบคุมและ
แนวคิดของแอปพลิเคชันว่าควรจัดรูปแบบตัวเลขอย่างไรเพื่อให้มนุษย์อ่านได้ ในส่วนใหญ่
การใช้งานมีผลเพียงอย่างเดียวคือการเปลี่ยนอักขระที่ใช้สำหรับทศนิยม
จุด -- อาจมาจาก "." ถึง ",". ฟังก์ชั่นไม่ได้ตระหนักถึงสิ่งที่ดีเช่นพัน
การแยกจากกันเป็นต้น. (ดู "ฟังก์ชัน localeconv" หากคุณสนใจเกี่ยวกับสิ่งเหล่านี้)

ใช้ POSIX qw(strtod setlocale LC_NUMERIC);
ใช้สถานที่;

setlocale LC_NUMERIC, "";

$n = 5/2; # กำหนดตัวเลข 2.5 ถึง $n

$a = " $n"; # การแปลงขึ้นอยู่กับสถานที่เป็นสตริง

พิมพ์ "ครึ่งห้าคือ $n\n"; # เอาท์พุทขึ้นอยู่กับสถานที่

printf "ครึ่งห้าคือ %g\n", $n; # เอาท์พุทขึ้นอยู่กับสถานที่

พิมพ์ "จุดทศนิยมเป็นลูกน้ำ\n"
ถ้า $n == (strtod("2,5"))[0]; # การแปลงขึ้นอยู่กับสถานที่

ดูเพิ่มเติมที่ I18N::Langinfo และ "RADIXCHAR"

Category "LC_MONETARY": การจัดรูปแบบ of เป็นเงิน จำนวน
มาตรฐาน C กำหนดหมวดหมู่ "LC_MONETARY" แต่ไม่ใช่ฟังก์ชันที่ได้รับผลกระทบจาก
เนื้อหา (ผู้ที่มีประสบการณ์ของคณะกรรมการมาตรฐานจะตระหนักว่า
คณะทำงานตัดสินใจที่จะถ่อประเด็นนี้) ดังนั้น Perl จึงไม่
แจ้งให้ทราบของมัน หากคุณต้องการใช้ "LC_MONETARY" จริงๆ คุณสามารถค้นหาเนื้อหาได้--see
"ฟังก์ชัน localeconv" -- และใช้ข้อมูลที่ส่งคืนในแอปพลิเคชันของคุณ
การจัดรูปแบบจำนวนเงินของตัวเอง อย่างไรก็ตาม คุณอาจพบว่าข้อมูล
แม้จะใหญ่โตและซับซ้อน แต่ก็ยังไม่ตรงตามความต้องการของคุณ:
การจัดรูปแบบสกุลเงินเป็นเรื่องยากที่จะถอดรหัส

ดูเพิ่มเติมที่ I18N::Langinfo และ "CRNCYSTR"

"LC_TIME"
เอาต์พุตที่สร้างโดย "POSIX::strftime()" ซึ่งสร้างรูปแบบวันที่/เวลาที่มนุษย์อ่านได้
สตริงได้รับผลกระทบจากสถานที่ปัจจุบัน "LC_TIME" ดังนั้น ในภาษาฝรั่งเศส ผลลัพธ์
ผลิตโดยองค์ประกอบรูปแบบ %B (ชื่อเดือนเต็ม) สำหรับเดือนแรกของปีจะ
เป็น "แจนเวียร์" วิธีรับรายชื่อเดือนแบบยาวในภาษาปัจจุบัน:

ใช้ POSIX qw(strftime);
สำหรับ (0.) {
$long_month_name[$_] =
strftime("%B", 0, 0, 0, 1, $_, 96);
}

หมายเหตุ: ไม่จำเป็นต้องใช้ "use locale" ในตัวอย่างนี้: "strftime()" เป็นฟังก์ชัน POSIX ที่
ใช้ฟังก์ชัน "libc" มาตรฐานที่ระบบจัดหาซึ่งเป็นไปตาม "LC_TIME" ปัจจุบันเสมอ
สถานที่

ดูเพิ่มเติมที่ I18N::Langinfo และ "ABDAY_1".."ABDAY_7", "DAY_1".."DAY_7", "ABMON_1".."ABMON_12",
และ "ABMON_1".."ABMON_12".

อื่นๆ หมวดหมู่
Perl ไม่ได้ใช้หมวดหมู่สถานที่ที่เหลือในขณะนี้ แต่โปรดทราบอีกครั้ง
ว่าสิ่งที่ Perl โต้ตอบด้วยอาจใช้สิ่งเหล่านี้รวมถึงส่วนขยายที่อยู่นอกมาตรฐาน
การกระจาย Perl และโดยระบบปฏิบัติการและยูทิลิตี้ หมายเหตุโดยเฉพาะอย่างยิ่งว่า
ค่าสตริงของ $! และข้อความแสดงข้อผิดพลาดที่กำหนดโดยยูทิลิตี้ภายนอกอาจมีการเปลี่ยนแปลง
โดย "LC_MESSAGES" หากคุณต้องการมีรหัสข้อผิดพลาดแบบพกพา ให้ใช้ "%!" ดูเออร์โน

การรักษาความปลอดภัย


แม้ว่าการอภิปรายหลักของปัญหาด้านความปลอดภัยของ Perl สามารถพบได้ใน perlsec การสนทนา
ของการจัดการภาษาของ Perl จะไม่สมบูรณ์หากไม่ได้ดึงความสนใจของคุณไปที่สถานที่-
ปัญหาด้านความปลอดภัยขึ้นอยู่กับ พื้นที่ -- โดยเฉพาะบนระบบที่อนุญาตให้ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษ
เพื่อสร้างสถานที่ของตนเอง - ไม่น่าไว้วางใจ สถานที่ที่เป็นอันตราย (หรือเพียงแค่เสียธรรมดา)
สามารถทำให้แอปพลิเคชั่นทราบสถานที่ให้ผลลัพธ์ที่ไม่คาดคิด นี่คือบางส่วน
เป็นไปได้:

· นิพจน์ทั่วไปตรวจสอบชื่อไฟล์ที่ปลอดภัยหรือที่อยู่อีเมลโดยใช้ "\w" อาจเป็น
ปลอมแปลงโดยภาษา "LC_CTYPE" ที่อ้างว่าอักขระเช่น ">" และ "|" เป็น
ตัวอักษรและตัวเลข

· การแก้ไขสตริงด้วยการแมปตัวพิมพ์เล็กและใหญ่ เช่น "$dest = "C:\U$name.$ext"" อาจ
ให้ผลลัพธ์ที่เป็นอันตรายหากตารางการแมปตัวพิมพ์ "LC_CTYPE" ปลอมมีผลใช้งาน

· ภาษา "LC_COLLATE" ที่แอบแฝงอาจส่งผลให้ชื่อนักเรียนที่มีเกรด "D"
ปรากฏอยู่ข้างหน้าผู้ที่มี "A"

· แอปพลิเคชันที่มีปัญหาในการใช้ข้อมูลใน "LC_MONETARY" อาจจัดรูปแบบ
เดบิตราวกับว่าพวกเขาเป็นเครดิตและในทางกลับกันหากสถานที่นั้นถูกโค่นล้ม หรือ
อาจชำระเงินเป็นดอลลาร์สหรัฐฯ แทนดอลลาร์ฮ่องกง

· ชื่อวันที่และวันที่ในรูปแบบวันที่โดย "strftime()" สามารถจัดการเป็น
ได้เปรียบโดยผู้ใช้ที่ประสงค์ร้ายที่สามารถทำลายสถานที่ "LC_DATE" ("ดูสิ-มันบอกว่าฉัน
ไม่อยู่ในอาคารในวันอาทิตย์")

อันตรายดังกล่าวไม่ได้มีลักษณะเฉพาะกับระบบสถานที่: ทุกแง่มุมของแอปพลิเคชัน
สภาพแวดล้อมที่อาจได้รับการแก้ไขอย่างมุ่งร้ายนำเสนอความท้าทายที่คล้ายคลึงกัน ในทำนองเดียวกัน
ไม่เฉพาะเจาะจงสำหรับ Perl: ภาษาโปรแกรมใดๆ ที่อนุญาตให้คุณเขียนโปรแกรมได้
ที่คำนึงถึงสภาพแวดล้อมทำให้คุณประสบปัญหาเหล่านี้

Perl ไม่สามารถปกป้องคุณจากความเป็นไปได้ทั้งหมดที่แสดงในตัวอย่าง - ไม่มี
ทดแทนความระมัดระวังของคุณเอง - แต่เมื่อ "ใช้สถานที่" มีผล Perl จะใช้
กลไกการทำให้เสีย (ดู perlsec) เพื่อทำเครื่องหมายผลลัพธ์สตริงที่ขึ้นอยู่กับสถานที่และ
ที่อาจไม่น่าไว้วางใจตามมา นี่คือบทสรุปของพฤติกรรมเสียของ
ตัวดำเนินการและฟังก์ชันที่อาจได้รับผลกระทบจากสถานที่:

· การเปรียบเทียบ ผู้ประกอบการ ("lt", "le", "ge", "gt" และ "cmp"):

ผลลัพธ์จริง/เท็จ (หรือน้อยกว่า/เท่ากับ/มากกว่า) สเกลาร์จะไม่เสีย

· การทำแผนที่กรณี การแก้ไข (ด้วย "\l", "\L", "\u", "\U" หรือ "\F")

สตริงผลลัพธ์ที่มีวัสดุที่มีการสอดแทรกจะเสียหากรูปแบบ "ใช้สถานที่"
ที่มี "LC_CTYPE" มีผลใช้บังคับ

· แม็ทชิ่ง ผู้ประกอบการ ("ม.//"):

ผลลัพธ์จริง/เท็จสเกลาร์ไม่เคยเสีย

รูปแบบย่อยทั้งหมด ส่งเป็นผลลัพธ์บริบทรายการหรือเป็น $1 ฯลฯ. เป็นมลทิน
หากรูปแบบ "ใช้สถานที่" ที่มี "LC_CTYPE" มีผลบังคับ และรูปแบบย่อย
นิพจน์ทั่วไปมีโครงสร้างที่ขึ้นกับโลแคล โครงสร้างเหล่านี้รวมถึง
"\w" (เพื่อให้ตรงกับอักขระที่เป็นตัวอักษรและตัวเลขคละกัน), "\W" (อักขระที่ไม่ใช่ตัวอักษรและตัวเลข), "\b" และ
"\B" (ขอบเขตของคำและไม่ใช่ขอบเขต ซึ่งขึ้นอยู่กับว่า "\w" และ "\W" ตรงกัน) "\s"
(อักขระเว้นวรรค), "\S" (อักขระที่ไม่ใช่ช่องว่าง), "\d" และ "\D" (ตัวเลขและ
ไม่ใช่ตัวเลข) และคลาสอักขระ POSIX เช่น "[:alpha:]" (ดู "POSIX
คลาสอักขระ" ใน perlrecharclass)

การปลอมแปลงก็มีแนวโน้มเช่นกันหากรูปแบบจะจับคู่โดยไม่พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (ผ่าน "/i")
ข้อยกเว้นคือถ้ารหัสทั้งหมดชี้ที่จะจับคู่ด้วยวิธีนี้อยู่เหนือ 255 และ do
ไม่มีการพับภายใต้กฎ Unicode ให้ต่ำกว่า 256 การย้อมสีไม่ได้ทำเพื่อสิ่งเหล่านี้
เนื่องจาก Perl ใช้กฎ Unicode สำหรับจุดรหัสดังกล่าวเท่านั้น และกฎเหล่านั้นคือ
เหมือนกันไม่ว่าสถานที่ปัจจุบันจะเป็นอย่างไร

ตัวแปรรูปแบบการจับคู่ $&, "$`" (ก่อนการแข่งขัน), "$'" (หลังการแข่งขัน) และ $+ (สุดท้าย
ตรงกัน) ยังเสีย

· การแทน ผู้ประกอบการ ("ส///"):

มีพฤติกรรมเช่นเดียวกับโอเปอเรเตอร์การจับคู่ นอกจากนี้ ตัวถูกดำเนินการทางซ้ายของ "=~" จะกลายเป็น
เสียเมื่อรูปแบบ "ใช้สถานที่" ที่มี "LC_CTYPE" มีผลบังคับใช้ หากแก้ไขเป็น
ผลลัพธ์ของการแทนที่ตามการจับคู่นิพจน์ทั่วไปที่เกี่ยวข้องกับ
ต่างๆ ที่กล่าวถึงในข้อที่แล้ว หรือของ case-mapping เช่น "\l", "\L","\u",
"\U" หรือ "\F"

· เอาท์พุต การจัดรูปแบบ ฟังก์ชั่น ("printf()" และ "write()"):

ผลลัพธ์ไม่เคยเสีย เพราะไม่เช่นนั้น แม้แต่ผลลัพธ์จากการพิมพ์ เช่น
"print (1/7)" ควรจะเสีย ถ้า "use locale" มีผล

· การทำแผนที่กรณี ฟังก์ชั่น ("lc()", "lcfirst()", "uc()", "ucfirst()"):

ผลลัพธ์จะเสียหากใช้รูปแบบ "สถานที่ใช้งาน" ที่มี "LC_CTYPE"

· POSIX ขึ้นอยู่กับสถานที่ ฟังก์ชั่น ("localeconv()", "strcoll()", "strftime()",
"strxfrm()"):

ผลลัพธ์ไม่เคยเสีย

· POSIX ตัวอักษร ชั้น การทดสอบ ("POSIX::isalnum()", "POSIX::isalpha()",
"POSIX::isdigit()", "POSIX::isgraph()", "POSIX::islower()", "POSIX::isprint()",
"POSIX::ispunct()", "POSIX::isspace()", "POSIX::isupper()", "POSIX::isxdigit()"):

ผลลัพธ์จริง/เท็จไม่เคยเสีย

ตัวอย่างสามตัวอย่างแสดงให้เห็นถึงการปนเปื้อนที่ขึ้นกับสถานที่ โปรแกรมแรกซึ่งละเว้นมัน
สถานที่จะไม่ทำงาน: ค่าที่นำมาจากบรรทัดคำสั่งโดยตรงไม่สามารถใช้เพื่อตั้งชื่อ an
ไฟล์เอาต์พุตเมื่อเปิดใช้งานการตรวจสอบมลทิน

#/usr/local/bin/perl -T
#วิ่งด้วยการตรวจสอบมลทิน

# ละเว้นการตรวจสุขภาพบรรทัดคำสั่ง...
$tainted_output_file = กะ;

open(F, ">$tainted_output_file")
หรือเตือน "การเปิด $tainted_output_file ล้มเหลว: $!\n";

โปรแกรมสามารถทำได้โดยการ "ฟอก" ค่ามลทินผ่านค่าปกติ
นิพจน์: ตัวอย่างที่สอง - ซึ่งยังคงละเว้นข้อมูลสถานที่ - รันสร้าง
ไฟล์ที่มีชื่ออยู่ในบรรทัดคำสั่ง ถ้าทำได้

#/usr/local/bin/perl -T

$tainted_output_file = กะ;
$tainted_output_file =~ m%[\w/]+%;
$untainted_output_file = $&;

open(F, ">$untainted_output_file")
หรือเตือน "การเปิด $untainted_output_file ล้มเหลว: $!\n";

เปรียบเทียบสิ่งนี้กับโปรแกรมที่คล้ายคลึงกันแต่ให้ทราบถึงสถานที่:

#/usr/local/bin/perl -T

$tainted_output_file = กะ;
ใช้สถานที่;
$tainted_output_file =~ m%[\w/]+%;
$localized_output_file = $&;

open(F, ">$localized_output_file")
หรือเตือน "การเปิด $localized_output_file ล้มเหลว: $!\n";

โปรแกรมที่สามนี้ล้มเหลวในการทำงานเนื่องจาก $& มีมลทิน: เป็นผลมาจากการจับคู่
เกี่ยวข้องกับ "\w" ในขณะที่ "use locale" มีผลใช้งาน

และพวกเรา


PERL_SKIP_LOCALE_INIT
ตัวแปรสภาพแวดล้อมนี้ พร้อมใช้งานใน Perl v5.20 หากตั้งค่าไว้ (เป็น any
ค่า) บอกให้ Perl ไม่ใช้ตัวแปรสภาพแวดล้อมที่เหลือเป็น
เริ่มต้นด้วย Perl จะใช้การตั้งค่าสถานที่ปัจจุบันแทน
ซึ่งมีประโยชน์อย่างยิ่งในสภาพแวดล้อมแบบฝัง โปรดดู "การใช้ Perl . แบบฝัง
ด้วยสถานที่ POSIX" ใน perlembed

PERL_BADLANG
สตริงที่สามารถระงับคำเตือนของ Perl เกี่ยวกับการตั้งค่าสถานที่ล้มเหลวที่
การเริ่มต้น ความล้มเหลวอาจเกิดขึ้นได้หากโลแคลรองรับในระบบปฏิบัติการคือ
ขาด (เสีย) ในทางใดทางหนึ่ง - หรือถ้าคุณพิมพ์ชื่อสถานที่ผิดเมื่อคุณ
ตั้งค่าสภาพแวดล้อมของคุณ หากไม่มีตัวแปรสภาพแวดล้อมนี้ หรือมี a
ค่าอื่นที่ไม่ใช่ "0" หรือ "" Perl จะบ่นเกี่ยวกับความล้มเหลวในการตั้งค่าสถานที่

หมายเหตุ: "PERL_BADLANG" ให้คุณซ่อนข้อความเตือนได้เท่านั้น ดิ
ข้อความบอกเกี่ยวกับปัญหาบางอย่างในการสนับสนุนระบบภาษาของคุณและคุณ
ควรตรวจสอบว่าปัญหาคืออะไร

DPKG_RUNNING_VERSION
บนระบบ Debian หากมีการตั้งค่าตัวแปรสภาพแวดล้อม DPKG_RUNNING_VERSION (เป็น
ค่าใด ๆ ) คำเตือนความล้มเหลวของสถานที่จะถูกระงับเช่นเดียวกับ a
การตั้งค่า PERL_BADLANG เป็นศูนย์ นี้ทำเพื่อหลีกเลี่ยงอุทกภัยของการเตือนปลอม
ระหว่างการอัพเกรดระบบ ดูhttp://bugs.debian.org/508764>.

ตัวแปรสภาพแวดล้อมต่อไปนี้ไม่ได้เจาะจงสำหรับ Perl: พวกเขาเป็นส่วนหนึ่งของ
วิธี "setlocale()" ที่ได้มาตรฐาน (ISO C, XPG4, POSIX 1.c) สำหรับการควบคุมและ
ความคิดเห็นของแอปพลิเคชันเกี่ยวกับข้อมูล Windows ไม่ใช่ POSIX แต่ Perl จัดเรียงสิ่งต่อไปนี้
ทำงานตามที่อธิบายไว้อยู่แล้ว หากโลแคลที่กำหนดโดยตัวแปรสภาพแวดล้อมไม่ถูกต้อง
Perl ลองใช้ลำดับความสำคัญที่ต่ำกว่าถัดไป หากไม่มีสิ่งใดถูกต้องบน Windows ระบบ
จากนั้นลองใช้สถานที่เริ่มต้น ถ้าอย่างอื่นล้มเหลว โลแคล "C" จะถูกใช้ ถ้าถึงขนาดนั้น
ใช้งานไม่ได้ มีบางอย่างเสียหายมาก แต่ Perl พยายามที่จะก้าวไปข้างหน้าด้วยสิ่งที่
การตั้งค่าสถานที่อาจเป็น

"LC_ALL" "LC_ALL" คือตัวแปรสภาพแวดล้อมโลแคล "แทนที่ทั้งหมด" ถ้าตั้งไว้ก็
แทนที่ตัวแปรสภาพแวดล้อมโลแคลที่เหลือทั้งหมด

"ภาษา" หมายเหตุ: "LANGUAGE" เป็นส่วนขยายของ GNU ซึ่งจะมีผลกับคุณก็ต่อเมื่อคุณใช้
GNU libc. กรณีนี้หากคุณใช้ เช่น Linux หากคุณกำลังใช้
"เชิงพาณิชย์" Unixes คุณน่าจะมากที่สุด ไม่ ใช้ GNU libc และคุณสามารถ
ละเว้น "LANGUAGE"

อย่างไรก็ตาม ในกรณีที่คุณใช้ "LANGUAGE": จะมีผลกับภาษาของ
ข้อมูล คำเตือน และข้อความแสดงข้อผิดพลาดที่ส่งออกโดยคำสั่ง (กล่าวอีกนัยหนึ่ง
มันเหมือนกับ "LC_MESSAGES") แต่มีลำดับความสำคัญสูงกว่า "LC_ALL" นอกจากนี้,
ไม่ใช่ค่าเดียว แต่เป็น "เส้นทาง" (" - รายการแยก) ของ ภาษา
(ไม่ใช่สถานที่). ดูเอกสารไลบรารี "gettext" ของ GNU สำหรับข้อมูลเพิ่มเติม
ข้อมูล

"LC_CTYPE" ในกรณีที่ไม่มี "LC_ALL", "LC_CTYPE" จะเลือกโลแคลประเภทอักขระ ใน
ไม่มีทั้ง "LC_ALL" และ "LC_CTYPE", "LANG" จะเลือกประเภทอักขระ
สถานที่

"LC_COLLATE"
ในกรณีที่ไม่มี "LC_ALL" "LC_COLLATE" จะเลือกการเรียง (การเรียงลำดับ)
สถานที่ ในกรณีที่ไม่มีทั้ง "LC_ALL" และ "LC_COLLATE" "LANG" จะเลือก
สถานที่จัดเรียง

"LC_MONETARY"
ในกรณีที่ไม่มี "LC_ALL" "LC_MONETARY" จะเลือกรูปแบบการเงิน
สถานที่ ในกรณีที่ไม่มีทั้ง "LC_ALL" และ "LC_MONETARY" "LANG" จะเลือก
สถานที่จัดรูปแบบการเงิน

"LC_NUMERIC"
ในกรณีที่ไม่มี "LC_ALL" "LC_NUMERIC" จะเลือกรูปแบบตัวเลข
ในกรณีที่ไม่มีทั้ง "LC_ALL" และ "LC_NUMERIC" "LANG" จะเลือกตัวเลข
จัดรูปแบบ

"LC_TIME" ในกรณีที่ไม่มี "LC_ALL" "LC_TIME" จะเลือกการจัดรูปแบบวันที่และเวลา
สถานที่ ในกรณีที่ไม่มีทั้ง "LC_ALL" และ "LC_TIME" "LANG" จะเลือก
สถานที่จัดรูปแบบวันที่และเวลา

"LANG" "LANG" คือตัวแปรสภาพแวดล้อมโลแคล "catch-all" หากตั้งค่าไว้ ก็จะเป็น
ใช้เป็นทางเลือกสุดท้ายต่อจาก "LC_ALL" โดยรวมและเฉพาะหมวดหมู่
"แอลซี_ฟู".

ตัวอย่าง
"LC_NUMERIC" ควบคุมเอาต์พุตที่เป็นตัวเลข:

ใช้สถานที่;
ใช้ POSIX qw(locale_h); # นำเข้า setlocale() และค่าคงที่ LC_
setlocale(LC_NUMERIC, "fr_FR") หรือตาย "ให้อภัย";
printf "%g\n", 1.23; # หาก "fr_FR" สำเร็จ อาจแสดง 1,23

และวิธีแยกวิเคราะห์สตริงโดย "POSIX::strtod()" เป็นตัวเลข:

ใช้สถานที่;
ใช้ POSIX qw(locale_h strtod);
setlocale(LC_NUMERIC, "de_DE") หรือตาย "Entschuldigung";
$x ของฉัน = strtod("2,34") + 5;
พิมพ์ $x, "\n"; # น่าจะแสดง 7,34

หมายเหตุ


เชือก "อีวัล" และ "LC_NUMERIC"
eval สตริงจะแยกวิเคราะห์นิพจน์เป็น Perl มาตรฐาน ดังนั้นจึงคาดว่า
จุดทศนิยมเป็นจุด หากตั้งค่า "LC_NUMERIC" ให้เป็นเครื่องหมายจุลภาคแทน ค่า
การแยกวิเคราะห์จะสับสนบางทีอาจเงียบ

ใช้สถานที่;
ใช้ POSIX qw(locale_h);
setlocale(LC_NUMERIC, "fr_FR") หรือตาย "ให้อภัย";
$a ของฉัน = 1.2;
พิมพ์ค่า "$a + 1.5";
พิมพ์ "\n";

พิมพ์ "13,5" เนื่องจากในโลแคลนั้น เครื่องหมายจุลภาคคืออักขระจุดทศนิยม
ดังนั้น "eval" จึงขยายเป็น:

ประเมิน "1,2 + 1.5"

และผลลัพธ์ก็ไม่ใช่สิ่งที่คุณคาดหวัง ไม่มีการสร้างคำเตือน ถ้าคุณทำ
สตริง "eval" อยู่ในขอบเขตของ "use locale" คุณควรเปลี่ยน "eval" แทน
บรรทัดที่จะทำบางสิ่งเช่น:

พิมพ์ eval "ไม่มีสถานที่; $a + 1.5";

พิมพ์ 2.7

คุณยังสามารถยกเว้น "LC_NUMERIC" ได้ หากไม่ต้องการ โดย

ใช้สถานที่ ':!ตัวเลข';

ย้อนกลับ ความเข้ากันได้
เวอร์ชันของ Perl ก่อน 5.004 ส่วนใหญ่ ละเว้นข้อมูลสถานที่โดยทั่วไปมีลักษณะเป็น
หากมีบางสิ่งที่คล้ายกับโลแคล "C" บังคับใช้อยู่เสมอ แม้ว่าโปรแกรม
สภาพแวดล้อมที่แนะนำเป็นอย่างอื่น (ดู "ฟังก์ชัน setlocale") โดยค่าเริ่มต้น Perl ยังคง
ทำงานในลักษณะนี้เพื่อความเข้ากันได้แบบย้อนหลัง หากคุณต้องการให้แอปพลิเคชัน Perl ชำระเงิน
ใส่ใจกับข้อมูลสถานที่ คุณ ต้อง ใช้ Pragma "use locale" (ดู "use
สถานที่" Pragma") หรือในกรณีที่คุณต้องการทำเพียงแค่รูปแบบ
การจับคู่ ตัวแก้ไขนิพจน์ทั่วไป "/l" (ดู "ตัวแก้ไขชุดอักขระ" ใน perlre)
เพื่อสั่งสอนให้ทำเช่นนั้น

รุ่นของ Perl ตั้งแต่ 5.002 ถึง 5.003 ใช้ข้อมูล "LC_CTYPE" หากมี นั่น
คือ "\w" เข้าใจว่าตัวอักษรคืออะไรตามสภาพแวดล้อมของสถานที่
ตัวแปร ปัญหาคือผู้ใช้ไม่สามารถควบคุมคุณสมบัติได้: ถ้า C
ห้องสมุดรองรับสถานที่ Perl ใช้พวกเขา

I18N:เปรียบเทียบ ล้าสมัย
ในเวอร์ชันของ Perl ก่อน 5.004 การเปรียบเทียบตามสถานที่ทำได้โดยใช้
โมดูลไลบรารี "I18N::Collate" โมดูลนี้ล้าสมัยเล็กน้อยและควรหลีกเลี่ยง
ในแอปพลิเคชันใหม่ ฟังก์ชัน "LC_COLLATE" ถูกรวมเข้ากับ Perl core . แล้ว
ภาษา: สามารถใช้ข้อมูลสเกลาร์เฉพาะสถานที่ได้ตามปกติโดยใช้ "ใช้สถานที่"
ดังนั้นจึงไม่จำเป็นต้องเล่นปาหี่กับการอ้างอิงสเกลาร์ของ "I18N::Collate" อีกต่อไป

ประเภท ความเร็ว และ หน่วยความจำ ใช้ ผลกระทบ
การเปรียบเทียบและการเรียงลำดับตามสถานที่มักจะช้ากว่าการเรียงลำดับเริ่มต้น ชะลอตัวลงของ
สังเกตได้สองถึงสี่ครั้ง นอกจากนี้ยังจะใช้หน่วยความจำมากขึ้น: เมื่อ Perl
ตัวแปรสเกลาร์ได้เข้าร่วมในการเปรียบเทียบสตริงหรือการเรียงลำดับตามคำสั่ง
กฎการจัดเรียงสถานที่จะใช้หน่วยความจำมากกว่าเดิม 3-15 เท่า (ที่แน่นอน
ตัวคูณขึ้นอยู่กับเนื้อหาของสตริง ระบบปฏิบัติการ และโลแคล) เหล่านี้
ข้อเสียถูกกำหนดมากขึ้นโดยการใช้งานระบบปฏิบัติการของระบบโลแคล
กว่าโดย Perl

อิสระ ใช้ได้ ในประเทศ คำจำกัดความ
โปรเจ็กต์ Unicode CLDR จะแยกส่วน POSIX ของโลแคลจำนวนมาก ซึ่งมีอยู่ที่

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

มีคำจำกัดความสถานที่มากมายที่:

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

คุณควรทราบว่าระบบไม่ได้รับการสนับสนุนและไม่ได้อ้างว่าเหมาะสมสำหรับวัตถุประสงค์ใดๆ
หากระบบของคุณอนุญาตให้ติดตั้งโลแคลตามอำเภอใจ คุณอาจพบคำจำกัดความ
มีประโยชน์ตามที่เป็นอยู่หรือเป็นพื้นฐานสำหรับการพัฒนาสถานที่ของคุณเอง

I18น และ l10n
"การทำให้เป็นสากล" มักย่อว่า i18n เพราะอักษรตัวแรกและตัวสุดท้ายของมันคือ
แยกจากกันโดยอีกสิบแปดคน (คุณอาจเดาได้ว่าทำไม internalin ... internaliti ... i18n
มักจะถูกย่อ) ในทำนองเดียวกัน "การแปลเป็นภาษาท้องถิ่น" มักจะย่อว่า l10n.

An ไม่สมบูรณ์ มาตรฐาน
ความเป็นสากลตามที่กำหนดไว้ในมาตรฐาน C และ POSIX สามารถวิพากษ์วิจารณ์ได้เช่น
ไม่สมบูรณ์ หยาบ และมีความละเอียดมากเกินไป (ท้องถิ่นนำไปใช้กับทั้ง
กระบวนการ เมื่อมันน่าจะมีประโยชน์มากกว่าที่จะนำไปใช้กับเธรดเดียว
กลุ่มหน้าต่างหรืออะไรก็ตาม) พวกเขายังมีแนวโน้มเช่นกลุ่มมาตรฐานที่จะแบ่ง
โลกออกเป็นชาติ เมื่อเราทุกคนรู้ว่าโลกสามารถแบ่งออกเป็น
นายธนาคาร นักขี่จักรยาน นักเล่นเกม และอื่นๆ

Unicode และ UTF-8


การรองรับ Unicode นั้นใหม่โดยเริ่มจาก Perl เวอร์ชัน v5.6 และใช้งานได้เต็มที่มากขึ้น
ในเวอร์ชัน v5.8 และใหม่กว่า ดูข้อมูลแนะนำ

เริ่มต้นใน Perl v5.20 โลแคล UTF-8 ได้รับการสนับสนุนใน Perl ยกเว้น "LC_COLLATE" (ใช้
Unicode::Collate แทน) หากคุณมี Perl v5.16 หรือ v5.18 และไม่สามารถอัพเกรดได้ คุณสามารถใช้

ใช้สถานที่ ':not_characters';

เมื่อใช้รูปแบบนี้ของ Pragma จะใช้เฉพาะส่วนที่ไม่ใช่อักขระของโลแคล
โดย Perl ตัวอย่างเช่น "LC_NUMERIC" Perl ถือว่าคุณได้แปลทั้งหมด
อักขระที่จะใช้งานใน Unicode (อันที่จริงแล้วคือชุดอักขระดั้งเดิมของแพลตฟอร์ม
(ASCII หรือ EBCDIC) บวก Unicode) สำหรับข้อมูลในไฟล์ สามารถทำได้โดยสะดวกด้วย
ระบุ

ใช้ open ':locale';

Pragma นี้จัดเรียงอินพุตทั้งหมดจากไฟล์ที่จะแปลเป็น Unicode จาก
สถานที่ปัจจุบันตามที่ระบุในสภาพแวดล้อม (ดู "สิ่งแวดล้อม") และผลลัพธ์ทั้งหมดไปที่
ไฟล์ที่จะแปลกลับเป็นภาษาท้องถิ่น (ดูเปิด). บนพื้นฐานต่อการจัดการไฟล์ คุณ
สามารถใช้โมดูล PerlIO::locale แทนหรือโมดูล Encode::Locale ได้ทั้งสองแบบ
จาก กปปส. โมดูลหลังยังมีวิธีการอำนวยความสะดวกในการจัดการ "ARGV" และ
ตัวแปรสภาพแวดล้อม และสามารถใช้ได้กับแต่ละสตริง ถ้าคุณรู้ว่าทั้งหมดของคุณ
โลแคลจะเป็น UTF-8 เช่นเดียวกับทุกวันนี้ คุณสามารถใช้ -C สวิตช์บรรทัดคำสั่ง

รูปแบบ Pragma นี้ช่วยให้การจัดการโลแคลด้วย Unicode เป็นไปอย่างราบรื่น ดิ
ลำดับการเรียงจะเป็นตามลำดับจุดรหัส Unicode ขอแนะนำอย่างยิ่งว่าเมื่อ
คุณต้องเรียงลำดับและจัดเรียงสตริงที่คุณใช้โมดูลมาตรฐาน Unicode::Collate which
ให้ผลลัพธ์ที่ดีกว่าในหลาย ๆ กรณีมากกว่าที่คุณจะได้รับจากสถานที่แบบเก่า
การจัดการ

โมดูลและสวิตช์ทั้งหมดที่อธิบายไว้สามารถใช้งานได้ใน v5.20 โดยมีเพียง "use ." ธรรมดา
locale" และหากตำแหน่งอินพุตไม่ใช่ UTF-8 คุณจะได้รับน้อยกว่าอุดมคติ
ลักษณะการทำงาน ดังที่อธิบายไว้ด้านล่าง ที่คุณได้รับจาก Perls ก่อน v5.16 หรือเมื่อคุณใช้ locale
Pragma ที่ไม่มีพารามิเตอร์ ":not_characters" ใน v5.16 และ v5.18 หากคุณกำลังใช้
เฉพาะโลแคล UTF-8 ใน v5.20 และสูงกว่า ส่วนที่เหลือของส่วนนี้ใช้ไม่ได้กับ
คุณ

มีสองกรณี โลแคลแบบหลายไบต์และแบบไบต์เดี่ยว หลายไบต์แรก:

โลแคลแบบหลายไบต์ (หรืออักขระแบบกว้าง) เดียวที่ Perl มีแนวโน้มว่าจะสนับสนุนคือ
UTF-8 นี่เป็นเพราะความยากในการดำเนินการ ความจริงที่ว่า UTF-8 . คุณภาพสูง
ขณะนี้มีการเผยแพร่สถานที่สำหรับทุกพื้นที่ของโลก
(<http://unicode.org/Public/cldr/latest/>) และความล้มเหลวทั้งหมดที่คุณสามารถใช้
เข้ารหัสโมดูลเพื่อแปลเป็น/จากสถานที่ของคุณ เลยต้องทำอย่างใดอย่างหนึ่ง
หากคุณกำลังใช้หนึ่งในโลแคลเหล่านี้ เช่น Big5 หรือ Shift JIS สำหรับโลแคล UTF-8 ใน
Perls (ก่อน v5.20) ที่ไม่รองรับ UTF-8 locale อย่างสมบูรณ์ อาจทำงานได้ดีพอสมควร
(ขึ้นอยู่กับการใช้งานไลบรารี C ของคุณ) เพียงเพราะทั้งพวกเขาและ Perl store
อักขระที่ใช้หลายไบต์ในลักษณะเดียวกัน อย่างไรก็ตาม บางส่วน ถ้าไม่มากที่สุด C
การใช้งานห้องสมุดไม่สามารถประมวลผลอักขระในครึ่งบนของ Latin-1
ช่วง (128 - 255) อย่างถูกต้องภายใต้ "LC_CTYPE" เพื่อดูว่าตัวละครเป็นประเภทใดหรือไม่
ภายใต้โลแคล Perl ใช้ฟังก์ชันเช่น "isalnum()" ไลบรารี C ของคุณอาจไม่ทำงานสำหรับ
โลแคล UTF-8 ที่มีฟังก์ชันเหล่านั้น แทนที่จะทำงานภายใต้ไลบรารีแบบกว้างที่ใหม่กว่าเท่านั้น
ฟังก์ชันเช่น "iswalnum()" ซึ่ง Perl ไม่ได้ใช้ โลแคลแบบหลายไบต์เหล่านี้คือ
ปฏิบัติเหมือนโลแคลแบบไบต์เดียว และจะมีข้อจำกัดที่อธิบายไว้ด้านล่าง
เริ่มต้นใน Perl v5.22 ข้อความเตือนจะปรากฏขึ้นเมื่อ Perl ตรวจพบสถานที่หลายไบต์
ที่ไม่สนับสนุนอย่างเต็มที่

สำหรับโลแคลแบบไบต์เดี่ยว โดยทั่วไป Perl จะใช้แทคเพื่อใช้กฎโลแคลบนโค้ดพอยท์
ที่สามารถใส่ในไบต์เดียวและกฎ Unicode สำหรับผู้ที่ทำไม่ได้ (แม้ว่าจะไม่ใช่
ใช้อย่างสม่ำเสมอ ดูหมายเหตุท้ายส่วนนี้) ช่วยป้องกันปัญหามากมาย
ในภาษาที่ไม่ใช่ UTF-8 สมมติว่าโลแคลเป็น ISO8859-7 ภาษากรีก ตัวละครที่
0xD7 มีเมืองหลวงชี่ แต่ในภาษา ISO8859-1, Latin1 เป็นการคูณ
เข้าสู่ระบบ. คลาสอักขระนิพจน์ทั่วไป POSIX "[[:alpha:]]" จะจับคู่อย่างน่าอัศจรรย์
0xD7 ในภาษากรีก แต่ไม่ใช่ในภาษาละติน

อย่างไรก็ตาม มีบางที่ที่สิ่งนี้พังทลายลง โครงสร้าง Perl บางอย่างมีไว้สำหรับ Unicode
เท่านั้น เช่น "\p{Alpha}" พวกเขาคิดว่า 0xD7 มีความหมาย Unicode เสมอ (หรือ
เทียบเท่ากับแพลตฟอร์ม ECDIC) เนื่องจาก Latin1 เป็นเซตย่อยของ Unicode และ 0xD7 คือ
เครื่องหมายคูณทั้งใน Latin1 และ Unicode "\p{Alpha}" จะไม่ตรงกัน
โดยไม่คำนึงถึงสถานที่ ปัญหาที่คล้ายกันนี้เกิดขึ้นกับ "\N{...}" ก่อน v5.20 คือ
ดังนั้นจึงไม่ควรใช้ "\p{}" หรือ "\N{}" ภายใต้ "use locale" ธรรมดา--เว้นแต่ คุณสามารถ
รับประกันว่าโลแคลจะเป็น ISO8859-1 ใช้คลาสอักขระ POSIX แทน

ปัญหาอีกประการของแนวทางนี้คือการดำเนินการที่ข้าม single byte/multiple
ขอบเขตไบต์ไม่ได้กำหนดไว้อย่างดี จึงไม่อนุญาต (ขอบเขตนี้อยู่ระหว่าง
codepoints ที่ 255/256) ตัวอย่างเช่น ตัวพิมพ์เล็ก LATIN CAPITAL LETTER Y WITH DIAERESIS
(U+0178) ควรส่งคืน LATIN SMALL LETTER Y WITH DIAERESIS (U+00FF) แต่ในภาษากรีก
โลแคล ตัวอย่างเช่น ไม่มีอักขระที่ 0xFF และ Perl ไม่มีทางรู้ว่าอะไร
อักขระที่ 0xFF ควรจะเป็นตัวแทนจริงๆ จึงไม่อนุญาติให้ดำเนินการ
ในโหมดนี้ ตัวพิมพ์เล็กของ U+0178 คือตัวมันเอง

ปัญหาเดียวกันจะเกิดขึ้นหากคุณเปิดใช้งาน UTF-8-ification อัตโนมัติของไฟล์มาตรฐานของคุณ
จัดการ เลเยอร์ "open()" เริ่มต้น และ @ARGV บนโลแคลที่ไม่ใช่ ISO8859-1 ไม่ใช่ UTF-8 (โดยใช้
อย่างใดอย่างหนึ่ง -C สวิตช์บรรทัดคำสั่งหรือตัวแปรสภาพแวดล้อม "PERL_UNICODE" ดู
เพิร์ลรัน) สิ่งต่าง ๆ อ่านเป็น UTF-8 ซึ่งปกติจะหมายถึง Unicode
การตีความ แต่การมีอยู่ของสถานที่ทำให้ถูกตีความในท้องที่นั้น
แทนที่. ตัวอย่างเช่น จุดโค้ด 0xD7 ในอินพุต Unicode ซึ่งควรหมายถึง
เครื่องหมายคูณจะไม่ถูกตีความโดย Perl ด้วยวิธีนั้นภายใต้ภาษากรีก นี้
ไม่ได้เป็นปัญหา ให้ คุณทำให้แน่ใจว่าสถานที่ทั้งหมดจะเป็นเสมอและเท่านั้น
ISO8859-1 หรือหากคุณไม่มีไลบรารี C ที่บกพร่อง โลแคล UTF-8

ปัญหาอีกประการหนึ่งก็คือวิธีการนี้สามารถนำไปสู่จุดรหัสสองจุดซึ่งมีความหมายเหมือนกัน
อักขระ. ดังนั้น ในภาษากรีก ทั้ง U+03A7 และ U+00D7 เป็นอักษรตัวพิมพ์ใหญ่กรีก CHI

เนื่องจากปัญหาทั้งหมดเหล่านี้ เริ่มใน v5.22 Perl จะส่งคำเตือนหากมีการ
จุดโค้ดไบต์ (ด้วยเหตุนี้ Unicode) จะใช้เมื่อโลแคลแบบไบต์เดียวมีผลใช้งาน (แม้ว่า
จะไม่ตรวจสอบหากทำเช่นนั้นจะทำให้การดำเนินการช้าลงอย่างไม่สมควร)

ตำแหน่งที่ตั้งของผู้ขายมีข้อบกพร่องอย่างฉาวโฉ่ และเป็นเรื่องยากสำหรับ Perl ในการทดสอบตำแหน่งที่ตั้ง
การจัดการรหัสเนื่องจากสิ่งนี้โต้ตอบกับรหัสที่ Perl ไม่สามารถควบคุมได้ ดังนั้น
รหัสการจัดการสถานที่ใน Perl อาจมีปัญหาเช่นกัน (อย่างไรก็ตาม Unicode ที่ให้มา
โลแคลควรจะดีขึ้น และมีกลไกการป้อนกลับเพื่อแก้ไขปัญหาใดๆ ดู
"คำจำกัดความสถานที่ที่ใช้ได้ฟรี")

หากคุณมี Perl v5.16 ปัญหาที่กล่าวถึงข้างต้นจะหายไปหากคุณใช้
พารามิเตอร์ ":not_characters" ไปยัง locale Pragma (ยกเว้นจุดบกพร่องของผู้ขายใน
ส่วนของตัวละคร) หากคุณไม่มี v5.16 และคุณ do มีสถานที่ทำงานโดยใช้
มันอาจจะคุ้มค่าสำหรับวัตถุประสงค์เฉพาะบางอย่าง ตราบใดที่คุณจำ
gotchas ที่กล่าวถึงแล้ว ตัวอย่างเช่น ถ้าการจัดเรียงสำหรับโลแคลของคุณใช้งานได้ จะทำงาน
เร็วกว่าภายใต้โลแคลมากกว่าภายใต้ Unicode::Collate; และคุณสามารถเข้าถึงสิ่งต่าง ๆ เช่น
สัญลักษณ์สกุลเงินท้องถิ่นและชื่อเดือนและวันในสัปดาห์ (แต่
ตอกย้ำจุดสำคัญ ใน v5.16 คุณจะเข้าถึงได้โดยไม่มีข้อเสียของโลแคลโดย
โดยใช้รูปแบบ ":not_characters" ของ Pragma)

หมายเหตุ: นโยบายการใช้กฎสถานที่สำหรับจุดโค้ดที่สามารถใส่ในไบต์และ Unicode
กฎสำหรับผู้ที่ไม่สามารถใช้อย่างสม่ำเสมอ ก่อน v5.12 มันค่อนข้าง
จับจด; ใน v5.12 มันถูกนำไปใช้กับการจับคู่นิพจน์ทั่วไปอย่างสม่ำเสมอ
ยกเว้นคลาสอักขระในวงเล็บ ใน v5.14 มันถูกขยายไปยังการแข่งขัน regex ทั้งหมด และ
ใน v5.16 กับการดำเนินการของเคส เช่น "\L" และ "uc()" สำหรับการเทียบเคียง ในทุกรีลีส
จนถึงตอนนี้ ฟังก์ชัน "strxfrm()" ของระบบถูกเรียก และสิ่งใดก็ตามที่มันทำคือสิ่งที่คุณได้รับ

ใช้ perllocale ออนไลน์โดยใช้บริการ onworks.net



โปรแกรมออนไลน์ Linux และ Windows ล่าสุด