ນີ້ແມ່ນຄໍາສັ່ງ perlunicook ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນສະຖານີເຮັດວຽກອອນໄລນ໌ຟຣີຫຼາຍອັນຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
perlunicook - ຕົວຢ່າງປື້ມຄູ່ມືຂອງການຈັດການ Unicode ໃນ Perl
ລາຍລະອຽດ
ບັນຊີລາຍການນີ້ມີສູດສູດສັ້ນໆທີ່ສະແດງໃຫ້ເຫັນວິທີການຈັດການກັບການດໍາເນີນການ Unicode ທົ່ວໄປ
ໃນ Perl, ບວກກັບຫນຶ່ງໂຄງການສໍາເລັດໃນຕອນທ້າຍ. ຕົວແປທີ່ບໍ່ໄດ້ປະກາດໃດໆໃນບຸກຄົນ
ສູດແມ່ນສົມມຸດວ່າມີມູນຄ່າທີ່ເຫມາະສົມກ່ອນຫນ້ານີ້ໃນພວກມັນ.
ຕົວຢ່າງ
X 0: ມາດຕະຖານ ຄຳ ນຳ
ຍົກເວັ້ນແຕ່ຈະບັນທຶກເປັນຢ່າງອື່ນ, ຕົວຢ່າງທັງຫມົດຂ້າງລຸ່ມນີ້ຮຽກຮ້ອງໃຫ້ມີການນໍາໃຊ້ມາດຕະຖານກ່ອນຫນ້ານີ້
ຢ່າງຖືກຕ້ອງ, ດ້ວຍ "#!" ປັບໃຫ້ເຮັດວຽກຢູ່ໃນລະບົບຂອງທ່ານ:
#!/usr/bin/env perl
ໃຊ້ utf8; # ດັ່ງນັ້ນຕົວໜັງສື ແລະຕົວລະບຸສາມາດຢູ່ໃນ UTF-8
ໃຊ້ v5.12; # ຫຼືຫຼັງຈາກນັ້ນເພື່ອຮັບເອົາຄຸນສົມບັດ "unicode_strings".
ໃຊ້ຢ່າງເຄັ່ງຄັດ; # ຂໍ້ຄວາມອ້າງອີງ, ປະກາດຕົວແປ
ການນໍາໃຊ້ຄໍາເຕືອນ; # ເປີດເປັນຄ່າເລີ່ມຕົ້ນ
ໃຊ້ຄໍາເຕືອນ qw(FATAL utf8); # ເຮັດໃຫ້ຄວາມຜິດປົກກະຕິໃນການເຂົ້າລະຫັດຕາຍ
ໃຊ້ເປີດ qw(:std :utf8); # ການຖ່າຍທອດທີ່ຍັງບໍ່ໄດ້ປະກາດໃນ UTF-8
ໃຊ້ charnames qw(:ເຕັມ :short); # ບໍ່ຈໍາເປັນໃນ v5.16
ນີ້ ບໍ່ ເຮັດໃຫ້ແມ້ກະທັ້ງ Unix programmers "binmode" binary streams ຂອງທ່ານ, ຫຼືເປີດໃຫ້ເຂົາເຈົ້າກັບ
":raw", ແຕ່ນັ້ນແມ່ນວິທີດຽວທີ່ຈະເຂົ້າຫາພວກມັນຢ່າງງ່າຍດາຍ.
ຄໍາເຕືອນ: "use autodie" (pre 2.26) ແລະ "ໃຊ້ open" ບໍ່ເຂົ້າກັນໄດ້.
X 1: generic Unicode-savvy ການກັ່ນຕອງ
ສະ ເຫມີ ໄປ decompose ກ່ຽວ ກັບ ວິ ທີ ການ ໃນ, ຫຼັງ ຈາກ ນັ້ນ recompose ກ່ຽວ ກັບ ວິ ທີ ການ ອອກ.
ໃຊ້ Unicode::Normalize;
ໃນຂະນະທີ່ (<>) {
$_ = NFD($_); # decompose + reorder canonically
...
} ສືບຕໍ່ {
ພິມ NFC($_); # recompose (ຖ້າເປັນໄປໄດ້) + reorder canonically
}
X 2: ການປັບລະອຽດ Unicode ຄໍາເຕືອນ
ໃນຖານະເປັນ v5.14, Perl ຈໍາແນກສາມ subclass ຂອງຄໍາເຕືອນ UTFX8.
ໃຊ້ v5.14; # ຄຳເຕືອນຍ່ອຍບໍ່ສາມາດໃຊ້ໄດ້ກ່ອນໜ້ານີ້
ບໍ່ມີຄໍາເຕືອນ "nonchar"; # 66 ລັກສະນະຫ້າມ
ບໍ່ມີຄໍາເຕືອນ "ຕົວແທນ"; # UTF-16/CESU-8 ໄຮ້ສາລະ
ບໍ່ມີຄໍາເຕືອນ "non_unicode"; # ສໍາລັບຈຸດລະຫັດຫຼາຍກວ່າ 0x10_FFFF
X 3: ປະກາດ ແຫຼ່ງ in utf8 ສໍາລັບການ ຕົວລະບຸຕົວຕົນ ແລະ ວັນນະຄະດີ
ໂດຍບໍ່ມີການປະກາດ "ໃຊ້ utf8" ທີ່ສໍາຄັນທັງຫມົດ, ວາງ UTFX8 ໃນຕົວຫນັງສືຂອງທ່ານແລະ
ຕົວລະບຸຈະບໍ່ເຮັດວຽກຢ່າງຖືກຕ້ອງ. ຖ້າທ່ານໃຊ້ preamble ມາດຕະຖານພຽງແຕ່ໃຫ້ຂ້າງເທິງ, ນີ້
ເກີດຂຶ້ນແລ້ວ. ຖ້າທ່ານເຮັດ, ທ່ານສາມາດເຮັດສິ່ງຕ່າງໆເຊັ່ນນີ້:
ໃຊ້ utf8;
$measure = "Aangstroem" ຂອງຂ້ອຍ;
ຂອງຂ້ອຍ @Xsoft = qw( cp852 cp1251 cp1252 );
my @XXXXXXXXX = qw( XXXX XXXXXX );
ຂອງຂ້ອຍ @X = qw( koi8-f koi8-u koi8-r );
$motto = "XXX" ຂອງຂ້ອຍ; # ຄອບຄົວ, ຫົວໃຈເຕີບໂຕ, DROMEDARY CAMEL
ຖ້າທ່ານລືມ "ໃຊ້ utf8", bytes ສູງຈະຖືກເຂົ້າໃຈຜິດເປັນຕົວອັກສອນແຍກຕ່າງຫາກ, ແລະ
ບໍ່ມີຫຍັງຈະເຮັດວຽກຖືກຕ້ອງ.
X 4: ຕົວອັກສອນ ແລະ ຂອງເຂົາເຈົ້າ ຈໍານວນ
ຟັງຊັນ "ord" ແລະ "chr" ເຮັດວຽກຢ່າງໂປ່ງໃສໃນທຸກ codepoints, ບໍ່ພຽງແຕ່ຢູ່ໃນ ASCII ເທົ່ານັ້ນ
X ດຽວຫຼືໃນຄວາມເປັນຈິງ, ບໍ່ແມ່ນແຕ່ຢູ່ໃນ Unicode ດຽວ.
# ຕົວອັກສອນ ASCII
ord("A")
ທ(65)
# ຕົວອັກສອນຈາກຍົນຫຼາຍພາສາພື້ນຖານ
ord("X")
ທ(0x3A3)
# ເກີນ BMP
ord("X") # ຄະນິດສາດ ITALIC SMALL N
ທ(0x1D45B)
#ເກີນ Unicode! (ສູງສຸດ MAXINT)
ord("\x{20_0000}")
ທ(0x20_0000)
X 5: Unicode ວັນນະຄະດີ by ລັກສະນະ ຈໍານວນ
ໃນຕົວຫນັງສືທີ່ interpolated, ບໍ່ວ່າຈະເປັນສະຕຣິງ double-quoted ຫຼື regex, ທ່ານອາດຈະລະບຸ a
ຕົວອັກສອນຕາມຕົວເລກຂອງມັນໂດຍໃຊ້ "\x{HHHHHH}" ໜີ.
ສະຕຣິງ: "\x{3a3}"
Regex: /\x{3a3}/
ສະຕຣິງ: "\x{1d45b}"
Regex: /\x{1d45b}/
# ເຖິງແມ່ນວ່າຂອບເຂດທີ່ບໍ່ແມ່ນ BMP ໃນ regex ເຮັດວຽກໄດ້ດີ
/[\x{1D434}-\x{1D467}]/
X 6: ໄດ້ຮັບ ລັກສະນະ ຊື່ by ຈໍານວນ
ໃຊ້ charnames ();
$name = charnames ຂອງຂ້ອຍ::ຜ່ານລະຫັດ(0x03A3);
X 7: ໄດ້ຮັບ ລັກສະນະ ຈໍານວນ by ຊື່
ໃຊ້ charnames ();
my $number = charnames::vianame("GREEK C Capital Letter SIGMA");
X 8: Unicode ຊື່ວ່າ ລັກສະນະ
ໃຊ້ "\N{charname}" notation ເພື່ອເອົາຕົວລະຄອນຈາກຊື່ນັ້ນມາໃຊ້ໃນ interpolated
ຕົວໜັງສື (ສະຕຣິງສອງວົງຢືມ ແລະ regexes). ໃນ v5.16, ມີ implicit
ໃຊ້ charnames qw(:ເຕັມ :short);
ແຕ່ກ່ອນ v5.16, ທ່ານຕ້ອງມີຄວາມຊັດເຈນກ່ຽວກັບຊຸດຂອງນາມສະກຸນທີ່ທ່ານຕ້ອງການ. ໄດ້
ຊື່ ":full" ແມ່ນຊື່ຕົວອັກສອນ Unicode, ນາມແຝງ ຫຼື ລຳດັບ, ເຊິ່ງທັງໝົດມີສ່ວນແບ່ງ
namespace.
ໃຊ້ charnames qw(:ເຕັມ :short Latin greek);
"\N{Mathematical Italic SMALL N}" # :full
"\N{SIGMA ໂຕພິມໃຫຍ່ພາສາກຣີກ}" # :ເຕັມ
ສິ່ງອື່ນແມ່ນຕົວຫຍໍ້ຄວາມສະດວກສະບາຍສະເພາະ Perl. ກໍານົດຫນຶ່ງຫຼືຫຼາຍ scripts ໂດຍ
ຊື່ຖ້າທ່ານຕ້ອງການຊື່ສັ້ນທີ່ມີສະຄິບສະເພາະ.
"\N{Greek:Sigma}" # :short
"\N{ae}" # ລາຕິນ
"\N{epsilon}" # ກເຣັກ
ລຸ້ນ v5.16 ຍັງຮອງຮັບການນຳເຂົ້າ ":loose" ສຳລັບການຈັບຄູ່ຊື່ຕົວອັກສອນ,
ເຊິ່ງເຮັດວຽກຄືກັນກັບການຈັບຄູ່ຊື່ຊັບສິນ: ນັ້ນແມ່ນ, ມັນບໍ່ສົນໃຈກໍລະນີ,
ຍະຫວ່າງ, ແລະຂີດກ້ອງ:
"\N{ເຄື່ອງໝາຍເອີໂຣ}" # :ວ່າງ (ຈາກ v5.16)
X 9: Unicode ຊື່ວ່າ ລໍາດັບ
ເຫຼົ່ານີ້ເບິ່ງຄືກັບຊື່ຕົວອັກສອນແຕ່ສົ່ງຄືນລະຫັດຫຼາຍຈຸດ. ສັງເກດເຫັນ %vx
ການເຮັດວຽກຂອງ vector-print ໃນ "printf".
ໃຊ້ charnames qw(:ເຕັມ);
$seq ຂອງຂ້ອຍ = "\N{ຕົວອັກສອນລາຕິນ ທີ່ມີ MACRON ແລະ GRAVE}";
printf "U+%v04X\n", $seq;
U + 0100.0300
X 10: Custom ຊື່ວ່າ ລັກສະນະ
ໃຊ້ ":alias" ເພື່ອໃຫ້ຊື່ຫຼິ້ນທີ່ມີຂອບເຂດຂອງຕົນເອງກັບຕົວອັກສອນທີ່ມີຢູ່, ຫຼືແມ້ກະທັ້ງ
ເພື່ອໃຫ້ຕົວອັກສອນທີ່ໃຊ້ສ່ວນຕົວທີ່ບໍ່ມີຊື່ເປັນຊື່ທີ່ເປັນປະໂຫຍດ.
ໃຊ້ charnames ":full", ":alias" => {
ecute => "Latin ຕົວອັກສອນ E ທີ່ມີ acute",
"APPLE LOGO" => 0xF8FF, # ຕົວອັກສອນທີ່ໃຊ້ສ່ວນຕົວ
};
"\N{ecute}"
"\N{LOGO APPLE}"
X 11: ຊື່ of CJK codepoints
Sinograms ເຊັ່ນ XXXX ກັບຄືນມາດ້ວຍຊື່ຕົວອັກສອນ "CJK UNIFIED IDEOGRAPH-6771" ແລະ
"CJK UNIFIED IDEOGRAPH-4EAC", ເພາະວ່າ XnamesX ຂອງພວກເຂົາແຕກຕ່າງກັນ. CPAN "Unicode::Unihan"
ໂມດູນມີຖານຂໍ້ມູນຂະຫນາດໃຫຍ່ສໍາລັບການຖອດລະຫັດເຫຼົ່ານີ້ (ແລະທັງຫມົດຫຼາຍ), ໃຫ້ທ່ານຮູ້
ວິທີການເຂົ້າໃຈຜົນຜະລິດຂອງມັນ.
# cpan -i Unicode::Unihan
ໃຊ້ Unicode::Unihan;
$str = "XX" ຂອງຂ້ອຍ;
my $unhan = Unicode::Unihan->ໃໝ່;
ສໍາລັບ $lang ຂອງຂ້ອຍ (qw(ຈີນກວາງຕຸ້ງ ພາສາເກົາຫຼີ JapaneseOn JapaneseKun)) {
printf "CJK $str ໃນ %-12s ແມ່ນ", $lang;
ເວົ້າວ່າ $unhan->$lang($str);
}
ພິມ:
CJK XX ໃນພາສາຈີນກາງແມ່ນ DONG1JING1
CJK XX ໃນພາສາກວາງຕຸ້ງແມ່ນ dung1ging1
CJK XX ໃນພາສາເກົາຫຼີແມ່ນ TONGKYENG
CJK XX ໃນ JapaneseOn ແມ່ນ TOUKYOU KEI KIN
CJK XX ໃນ JapaneseKun ແມ່ນ HIGASHI AZUMAMIYAKO
ຖ້າເຈົ້າມີແນວຄິດແບບໂຣແມນຕິກສະເພາະ, ໃຫ້ໃຊ້ໂມດູນສະເພາະ:
# cpan -i Lingua::JA::Romanize::Japanese
ໃຊ້ Lingua::JA::Romanize::Japanese;
my $k2r = Lingua::JA::Romanize::Japanese->new;
$str = "XX" ຂອງຂ້ອຍ;
ເວົ້າວ່າ "ພາສາຍີ່ປຸ່ນສໍາລັບ $str ແມ່ນ", $k2r->chars($str);
ພິມ
ພາສາຍີ່ປຸ່ນສໍາລັບ XX ແມ່ນ toukyou
X 12: ໂດຍສະເພາະ ເຂົ້າລະຫັດ/ຖອດລະຫັດ
ໃນໂອກາດທີ່ຫາຍາກ, ເຊັ່ນຖານຂໍ້ມູນທີ່ອ່ານ, ທ່ານອາດຈະໄດ້ຮັບຂໍ້ຄວາມເຂົ້າລະຫັດທີ່ທ່ານຕ້ອງການ
ຖອດລະຫັດ.
ໃຊ້ Encode qw(encode decode);
$ chars ຂອງຂ້ອຍ = decode("shiftjis", $bytes, 1);
# ຫຼື
$bytes ຂອງຂ້ອຍ = encode("MIME-Header-ISO_2022_JP", $chars, 1);
ສຳລັບການຖ່າຍທອດທັງໝົດໃນການເຂົ້າລະຫັດດຽວກັນ, ຢ່າໃຊ້ການເຂົ້າລະຫັດ/ຖອດລະຫັດ; ແທນທີ່ຈະຕັ້ງໄຟລ໌
ການເຂົ້າລະຫັດໃນເວລາທີ່ທ່ານເປີດໄຟລ໌ຫຼືທັນທີຫຼັງຈາກດ້ວຍ "binmode" ຕາມທີ່ອະທິບາຍຕໍ່ມາ
ຂ້າງລຸ່ມນີ້.
X 13: Decode ໂຄງການ ກະທູ້ທີ່ as utf8
$ perl -CA ...
or
$ ສົ່ງອອກ PERL_UNICODE=A
or
ໃຊ້ Encode qw(decode_utf8);
@ARGV = ແຜນທີ່ { decode_utf8($_, 1) } @ARGV;
X 14: Decode ໂຄງການ ກະທູ້ທີ່ as ທ້ອງຖິ່ນ ການເຂົ້າລະຫັດ
# cpan -i ເຂົ້າລະຫັດ::Locale
ໃຊ້ encode qw(locale);
ໃຊ້ການເຂົ້າລະຫັດ::ທ້ອງຖິ່ນ;
# ໃຊ້ "locale" ເປັນ Arg ເພື່ອເຂົ້າລະຫັດ/ຖອດລະຫັດ
@ARGV = ແຜນທີ່ { decode(locale => $_, 1) } @ARGV;
X 15: ປະກາດ STD{IN,OUT,ERR} to be utf8
ໃຊ້ຕົວເລືອກແຖວຄໍາສັ່ງ, ຕົວແປສະພາບແວດລ້ອມ, ຫຼືອື່ນເອີ້ນວ່າ "binmode" ຢ່າງຊັດເຈນ:
$ perl -CS ...
or
$ ສົ່ງອອກ PERL_UNICODE=S
or
ໃຊ້ເປີດ qw(:std :utf8);
or
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
X 16: ປະກາດ STD{IN,OUT,ERR} to be in ທ້ອງຖິ່ນ ການເຂົ້າລະຫັດ
# cpan -i ເຂົ້າລະຫັດ::Locale
ໃຊ້ການເຂົ້າລະຫັດ;
ໃຊ້ການເຂົ້າລະຫັດ::ທ້ອງຖິ່ນ;
# ຫຼືເປັນກະແສສໍາລັບ binmode ຫຼືເປີດ
binmode STDIN, ":encoding(console_in)" ຖ້າ -t STDIN;
binmode STDOUT, ":encoding(console_out)" ຖ້າ -t STDOUT;
binmode STDERR, ":encoding(console_out)" ຖ້າ -t STDERR;
X 17: ເຮັດໃຫ້ ເອກະສານ ຂ້າພະເຈົ້າ / O Default to utf8
ໄຟລ໌ທີ່ເປີດໂດຍບໍ່ມີການໂຕ້ຖຽງການເຂົ້າລະຫັດຈະຢູ່ໃນ UTF-8:
$ perl -CD ...
or
$ ສົ່ງອອກ PERL_UNICODE=D
or
ໃຊ້ເປີດ qw(:utf8);
X 18: ເຮັດໃຫ້ ທັງຫມົດ ຂ້າພະເຈົ້າ / O ແລະ ໂຕ້ຖຽງ Default to utf8
$ perl -CSDA ...
or
$ ສົ່ງອອກ PERL_UNICODE=SDA
or
ໃຊ້ເປີດ qw(:std :utf8);
ໃຊ້ Encode qw(decode_utf8);
@ARGV = ແຜນທີ່ { decode_utf8($_, 1) } @ARGV;
X 19: ເປີດ ເອກະສານ ກັບ ສະເພາະ ການເຂົ້າລະຫັດ
ລະບຸການເຂົ້າລະຫັດການຖ່າຍທອດ. ນີ້ແມ່ນວິທີປົກກະຕິທີ່ຈະຈັດການກັບຂໍ້ຄວາມທີ່ຖືກເຂົ້າລະຫັດ, ບໍ່ແມ່ນໂດຍການໂທຫາ
ຫນ້າທີ່ລະດັບຕ່ໍາ.
# ໄຟລ໌ປ້ອນຂໍ້ມູນ
open(my $in_file, "< :encoding(UTF-16)", "wintext");
OR
open(my $in_file, "<", "wintext");
binmode($in_file, ":encoding(UTF-16)");
ຫຼັງຈາກນັ້ນ,
$line ຂອງຂ້ອຍ = <$in_file>;
# ໄຟລ໌ຜົນຜະລິດ
open($out_file, "> :encoding(cp1252), "wintext");
OR
open(my $out_file, ">", "wintext");
binmode($out_file, ":ການເຂົ້າລະຫັດ(cp1252)");
ຫຼັງຈາກນັ້ນ,
ພິມ $out_file "ບາງຂໍ້ຄວາມ\n";
ສາມາດລະບຸຊັ້ນຂໍ້ມູນຫຼາຍກວ່າການເຂົ້າລະຫັດໄດ້ທີ່ນີ້. ສໍາລັບຕົວຢ່າງ, incantation ໄດ້
":raw :encoding(UTF-16LE) :crlf" ລວມມີການຈັດການ CRLF ທີ່ບໍ່ກ່ຽວຂ້ອງ.
X 20: Unicode ກະເປົາ
ກ່ອງໃສ່ເຄື່ອງ Unicode ແມ່ນແຕກຕ່າງຈາກຕົວພິມ ASCII ຫຼາຍ.
uc("henry X") # "HENRY X"
uc("tschuess") # "TSCHUeSS" ແຈ້ງການ ss => SS
# ທັງສອງແມ່ນຄວາມຈິງ:
"tschuess" =~ /TSCHUeSS/i # ແຈ້ງການ ss => SS
"XXXXXXX" =~ /XXXXXXX/i # ສັງເກດເຫັນ X,X,X ຄືກັນ
X 21: Unicode case-insensitive ການປຽບທຽບ
ຍັງມີຢູ່ໃນ CPAN Unicode:: ໂມດູນ CaseFold, ຟັງຊັນ XfoldcaseX "fc" ໃຫມ່ຈາກ
v5.16 ອະນຸຍາດໃຫ້ເຂົ້າເຖິງການພັບຕົວພິມນ້ອຍຂອງ Unicode ຄືກັນກັບຕົວແກ້ໄຂຮູບແບບ "/i" ມີ
ໃຊ້ສະເໝີ:
ໃຊ້ຄຸນສົມບັດ "fc"; # fc() ຟັງຊັນມາຈາກ v5.16
# ຈັດລຽງກໍລະນີທີ່ບໍ່ລະອຽດອ່ອນ
my @sorted = sort { fc($a) cmp fc($b) } @list;
# ທັງສອງແມ່ນຄວາມຈິງ:
fc("tschuess") eq fc("TSCHUESS")
fc("XXXXXXX") eq fc("XXXXXXX")
X 22: ການແຂ່ງຂັນ Unicode linebreak ລໍາດັບ in regex
ເສັ້ນຕົວແບ່ງ Unicode ກົງກັບກາຣາເຟມ CRLF ສອງຕົວອັກສອນ ຫຼືອັນໃດກໍໄດ້ຂອງເຈັດແນວຕັ້ງ
ຕົວອັກສອນຊ່ອງຫວ່າງ. ດີສໍາລັບການຈັດການກັບ textfiles ມາຈາກການປະຕິບັດທີ່ແຕກຕ່າງກັນ
ລະບົບ.
\R
s/\R/\n/g; # ປັບການແບ່ງແຖວທັງໝົດເປັນ \n
X 23: ໄດ້ຮັບ ລັກສະນະ ຫມວດ: ພາສາ
ຊອກຫາປະເພດທົ່ວໄປຂອງຈຸດລະຫັດຕົວເລກ.
ໃຊ້ Unicode::UCD qw(charinfo);
$ cat ຂອງຂ້ອຍ = charinfo(0x3A3)->{ປະເພດ}; # "ລູ"
X 24: ການປິດການໃຊ້ງານ ການຮັບຮູ້ Unicode in ປຸກສ້າງ charclasses
ປິດການໃຊ້ງານ "\w", "\b", "\s", "\d", ແລະຫ້ອງຮຽນ POSIX ເຮັດວຽກຢ່າງຖືກຕ້ອງໃນ Unicode
ບໍ່ວ່າຈະຢູ່ໃນຂອບເຂດນີ້, ຫຼືພຽງແຕ່ຫນຶ່ງ regex.
ໃຊ້ v5.14;
ໃຊ້ re "/a";
# ຫຼື
my($num) = $str =~ /(\d+)/a;
ຫຼືໃຊ້ຄຸນສົມບັດ un-Unicode ສະເພາະ, ເຊັ່ນ "\p{ahex}" ແລະ "\p{POSIX_Digit"}. ຄຸນສົມບັດ
ຍັງເຮັດວຽກຕາມປົກກະຕິບໍ່ວ່າຕົວປັບຕົວປ່ຽນຕົວອັກສອນອັນໃດ ("/d /u /l /a /aa") ຄວນຈະມີຜົນ.
X 25: ການແຂ່ງຂັນ Unicode ຄຸນສົມບັດ in regex ກັບ \p, \P
ທັງໝົດເຫຼົ່ານີ້ກົງກັບຈຸດລະຫັດດຽວກັບຄຸນສົມບັດທີ່ໃຫ້. ໃຊ້ "\P" ແທນ "\p" ເພື່ອ
ກົງກັບຈຸດລະຫັດໜຶ່ງທີ່ຂາດຄຸນສົມບັດນັ້ນ.
\pL, \pN, \pS, \pP, \pM, \pZ, \pC
\p{Sk}, \p{Ps}, \p{Lt}
\p{alpha}, \p{upper}, \p{lower}
\p{ລາຕິນ}, \p{ກຣີກ}
\p{script=Latin}, \p{script=Greek}
\p{East_Asian_Width=Wide}, \p{EA=W}
\p{Line_Break=Hyphen}, \p{LB=HY}
\p{Numeric_Value=4}, \p{NV=4}
X 26: Custom ລັກສະນະ ຄຸນສົມບັດ
ກໍານົດເວລາລວບລວມຄຸນສົມບັດຕົວອັກສອນຂອງທ່ານເອງສໍາລັບການນໍາໃຊ້ໃນ regexes.
# ໃຊ້ຕົວອັກສອນທີ່ໃຊ້ສ່ວນຕົວ
ຍ່ອຍ In_Tengwar { "E000\tE07F\n" }
ຖ້າ (/\p{In_Tengwar}/) { ... }
# ການຜະສົມຄຸນສົມບັດທີ່ມີຢູ່ແລ້ວ
ຍ່ອຍ Is_GraecoRoman_Title {<<'END_OF_SET'}
+utf8::ພາສາລາຕິນ
+utf8::IsGreek
&utf8::IsTitle
END_OF_SET
ຖ້າ (/\p{Is_GraecoRoman_Title}/ { ... }
X 27: Unicode ຄວາມເປັນປົກກະຕິ
ໂດຍປົກກະຕິແລ້ວ render ເປັນ NFD ກ່ຽວກັບການປ້ອນຂໍ້ມູນ ແລະ NFC ໃນຜົນຜະລິດ. ໃຊ້ຟັງຊັນ NFKC ຫຼື NFKD
ປັບປຸງການຈື່ຈໍາໃນການຄົ້ນຫາ, ສົມມຸດວ່າທ່ານໄດ້ເຮັດແລ້ວກັບຂໍ້ຄວາມດຽວກັນທີ່ຈະຊອກຫາ.
ໃຫ້ສັງເກດວ່ານີ້ແມ່ນປະມານຫຼາຍກ່ວາພຽງແຕ່ glyphs ທີ່ເຂົ້າກັນໄດ້ກ່ອນປະສົມປະສານ; ມັນຍັງ
reorders ເຄື່ອງຫມາຍຕາມ canonical ຂອງເຂົາເຈົ້າປະສົມປະສານຫ້ອງຮຽນແລະຫຍ້າອອກ singletons.
ໃຊ້ Unicode::Normalize;
$nfd ຂອງຂ້ອຍ = NFD($orig);
$nfc ຂອງຂ້ອຍ = NFC($orig);
$nfkd ຂອງຂ້ອຍ = NFKD($orig);
$nfkc ຂອງຂ້ອຍ = NFKC($orig);
X 28: ປ່ຽນແປງ ບໍ່ແມ່ນ ASCII Unicode ຕົວເລກ
ເວັ້ນເສຍແຕ່ວ່າທ່ານ Xve ໃຊ້ "/a" ຫຼື "/aa", "\d" ກົງກັນຫຼາຍກ່ວາຕົວເລກ ASCII ເທົ່ານັ້ນ, ແຕ່ PerlXs
ການແປງສະຕຣິງເປັນຕົວເລກ implicit ປະຈຸບັນບໍ່ໄດ້ຮັບຮູ້ສິ່ງເຫຼົ່ານີ້. HereXs ວິທີການ
ປ່ຽນສະຕຣິງດັ່ງກ່າວດ້ວຍຕົນເອງ.
ໃຊ້ v5.14; # ຕ້ອງການສຳລັບຟັງຊັນ num().
ໃຊ້ Unicode::UCD qw(num);
$str = "ໄດ້ X ແລະ XXXX ແລະ X ແລະທີ່ນີ້";
ຂອງຂ້ອຍ @nums = ();
ໃນຂະນະທີ່ ($str =~ /(\d+|\N)/g) { # ບໍ່ພຽງແຕ່ ASCII!
push @nums, num($1);
}
ເວົ້າວ່າ "@nums"; # 12 4567 0.875
ໃຊ້ charnames qw(:ເຕັມ);
$nv = num("\N{RUMI DIGIT ONE}\N{RUMI DIGIT TWO}");
X 29: ການແຂ່ງຂັນ Unicode grapheme ກຸ່ມ in regex
Programmer-visible XcharactersX ແມ່ນ codepoints ຈັບຄູ່ໂດຍ "/./s", ແຕ່ຜູ້ໃຊ້ສາມາດເຫັນໄດ້
XcharactersX ແມ່ນກາຟິກທີ່ຈັບຄູ່ໂດຍ "/\X/".
# ຊອກຫາ vowel *plus* ໃດໆທີ່ປະສົມປະສານ diacritics, underlining, ແລະອື່ນໆ.
$nfd ຂອງຂ້ອຍ = NFD($orig);
$nfd =~ / (?=[aeiou]) \X /xi
X 30: ສານສະກັດຈາກ by grapheme ແທນທີ່ຈະເປັນ of by ຈຸດລະຫັດ (regex)
# ຈັບຄູ່ແລະຄວ້າຫ້າຮູບທໍາອິດ
my($first_five) = $str =~ /^( \X{5} ) /x;
X 31: ສານສະກັດຈາກ by grapheme ແທນທີ່ຈະເປັນ of by ຈຸດລະຫັດ (ຍ່ອຍ)
# cpan -i Unicode::GCSstring
ໃຊ້ Unicode::GCSstring;
$gcs = Unicode::GCSstring->new($str);
$first_five ຂອງຂ້ອຍ = $gcs->substr(0, 5);
X 32: ໄດ້ຢ່າງສິ້ນເຊີງ string by grapheme
ການປີ້ນກັບ codepoint ເຮັດໃຫ້ເກີດຄວາມເຄັ່ງຕຶງ, ການປ່ຽນ "creme brulee" ເຂົ້າໄປໃນຄວາມຜິດພາດ.
"eelXurb emXerc" ແທນທີ່ຈະເປັນ "eelurb emerc"; ດັ່ງນັ້ນປີ້ນກັບກັນໂດຍ grapheme ແທນ. ທັງສອງ
ວິທີການເຫຼົ່ານີ້ເຮັດວຽກຢ່າງຖືກຕ້ອງບໍ່ວ່າສາຍສະຕຣິງປົກກະຕິແມ່ນຫຍັງ:
$str = join("", ປີ້ນກັບ $str =~ /\X/g);
# ຫຼື: cpan -i Unicode::GCString
ໃຊ້ Unicode::GCSstring;
$str = ປີ້ນ Unicode::GCSstring->new($str);
X 33: string ຄວາມຍາວ in graphemes
ສາຍ "brulee" ມີຫົກ graphemes ແຕ່ເຖິງແປດ codepoints. ນີ້ນັບໂດຍ
graphem, ບໍ່ແມ່ນ codepoint:
$str = "brulee" ຂອງຂ້ອຍ;
$count ຂອງຂ້ອຍ = 0;
ໃນຂະນະທີ່ ($str =~ /\X/g) { $count++ }
# ຫຼື: cpan -i Unicode::GCString
ໃຊ້ Unicode::GCSstring;
$gcs = Unicode::GCSstring->new($str);
$count ຂອງຂ້ອຍ = $gcs->length;
X 34: Unicode ຄວາມກວ້າງຖັນ ສໍາລັບການ ການພິມ
PerlXs "printf", "sprintf", ແລະ "format" ຄິດວ່າ codepoints ທັງຫມົດໃຊ້ເວລາເຖິງ 1 ຖັນພິມ, ແຕ່.
ຫຼາຍຄົນເອົາ 0 ຫຼື 2. ທີ່ນີ້ເພື່ອສະແດງໃຫ້ເຫັນວ່າການປົກກະຕິບໍ່ແຕກຕ່າງກັນ, ພວກເຮົາພິມອອກທັງສອງ
ແບບຟອມ:
ໃຊ້ Unicode::GCSstring;
ໃຊ້ Unicode::Normalize;
my @words = qw/creme brulee/;
@words = ແຜນທີ່ { NFC($_), NFD($_) } @words;
ສໍາລັບ $str ຂອງຂ້ອຍ (@words) {
$gcs = Unicode::GCSstring->new($str);
$cols = $gcs->ຖັນຂອງຂ້ອຍ;
$pad ຂອງຂ້ອຍ = " " x (10 - $cols);
ເວົ້າວ່າ str, $pad, " |";
}
ສ້າງອັນນີ້ເພື່ອສະແດງໃຫ້ເຫັນວ່າມັນ pads ຢ່າງຖືກຕ້ອງບໍ່ວ່າຈະເປັນການປົກກະຕິ:
ຄຣີມ |
creXme |
ບຣູເລ |
bruXleXe |
X 35: Unicode ອາຫານວ່າງ
ຂໍ້ຄວາມຈັດຮຽງຕາມຈຸດລະຫັດຕົວເລກຕາມລຳດັບຕົວອັກສອນທີ່ບໍ່ມີເຫດຜົນ; ໃຊ້ UCA ສໍາລັບ
ການຈັດຮຽງຂໍ້ຄວາມ.
ໃຊ້ Unicode::Collate;
my $col = Unicode::Collate->new();
my @list = $col->sort(@old_list);
ເບິ່ງ ucsort ໂຄງການຈາກ Unicode::ໂມດູນ Tussle CPAN ສໍາລັບເສັ້ນຄໍາສັ່ງທີ່ສະດວກ
ການໂຕ້ຕອບກັບໂມດູນນີ້.
X 36: ກໍລະນີ - ແລະ ສຳນຽງບໍ່ອ່ອນໄຫວ Unicode ການຈັດລຽງ
ລະບຸຄວາມເຂັ້ມຂອງການລວມກັນໃນລະດັບ 1 ເພື່ອບໍ່ສົນໃຈກໍລະນີ ແລະ diacritics, ພຽງແຕ່ເບິ່ງ
ລັກສະນະພື້ນຖານ.
ໃຊ້ Unicode::Collate;
my $col = Unicode::Collate->new(level => 1);
my @list = $col->sort(@old_list);
X 37: Unicode ທ້ອງຖິ່ນ ອາຫານວ່າງ
ບາງທ້ອງຖິ່ນມີກົດລະບຽບການຈັດປະເພດພິເສດ.
# ບໍ່ວ່າຈະໃຊ້ v5.12, ຫຼື: cpan -i Unicode::Collate::Locale
ໃຊ້ Unicode::Collate::Locale;
my $col = Unicode::Collate::Locale->new(locale => "de__phonebook");
my @list = $col->sort(@old_list);
ໄດ້ ucsort ໂຄງການທີ່ໄດ້ກ່າວມາຂ້າງເທິງຍອມຮັບພາລາມິເຕີ "--locale".
X 38: ການເຮັດໃຫ້ "cmp" ການເຮັດວຽກ on ຂໍ້ຄວາມ ແທນທີ່ຈະເປັນ of codepoints
ແທນທີ່ຈະນີ້:
@srecs = ຄັດ {
$b->{AGE} <=> $a->{AGE}
||
$a->{NAME} cmp $b->{NAME}
} @recs;
ໃຊ້ນີ້:
my $coll = Unicode::Collate->new();
ສໍາລັບ $rec ຂອງຂ້ອຍ (@recs) {
$rec->{NAME_key} = $coll->getSortKey( $rec->{NAME} );
}
@srecs = ຄັດ {
$b->{AGE} <=> $a->{AGE}
||
$a->{NAME_key} cmp $b->{NAME_key}
} @recs;
X 39: ກໍລະນີ - ແລະ ສຳນຽງບໍ່ອ່ອນໄຫວ ການປຽບທຽບ
ໃຊ້ສິ່ງຂອງຕົວຄູນເພື່ອປຽບທຽບຂໍ້ຄວາມ Unicode ໂດຍຕົວອັກສອນແທນທີ່ຈະເປັນຈຸດລະຫັດ.
ໃຊ້ Unicode::Collate;
$es ຂອງຂ້ອຍ = Unicode::Collate->new(
ລະດັບ => 1,
normalization => undef
);
# ດຽວນີ້ທັງສອງແມ່ນຄວາມຈິງ:
$es->eq("Garcia", "GARCIA" );
$es->eq("Marquez", "MARQUEZ");
X 40: ກໍລະນີ - ແລະ ສຳນຽງບໍ່ອ່ອນໄຫວ ທ້ອງຖິ່ນ ການປຽບທຽບ
ຄືກັນ, ແຕ່ຢູ່ໃນທ້ອງຖິ່ນສະເພາະ.
ຂອງຂ້ອຍ $de = Unicode::Collate::Locale->new(
ທ້ອງຖິ່ນ => "de__phonebook",
);
# ດຽວນີ້ມັນເປັນຄວາມຈິງ:
$de->eq("tschuess", "TSCHUESS"); # ແຈ້ງການ ue => UE, ss => SS
X 41: Unicode ເສັ້ນແຕກ
ແຍກຂໍ້ຄວາມອອກເປັນສາຍຕາມກົດລະບຽບຂອງ Unicode.
# cpan -i Unicode::LineBreak
ໃຊ້ Unicode::LineBreak;
ໃຊ້ charnames qw(:ເຕັມ);
my $para = "ນີ້ແມ່ນ super\N{HYPHEN}string long." x 20;
my $fmt = Unicode::LineBreak->ໃໝ່;
ພິມ $fmt->break($para), "\n";
X 42: Unicode ຂໍ້ຄວາມ in dbm hashes, ໄດ້ tedious ວິທີການ
ການໃຊ້ສະຕຣິງ Perl ປົກກະຕິເປັນກະແຈ ຫຼືຄ່າສໍາລັບ DBM hash ຈະກະຕຸ້ນໃຫ້ມີລັກສະນະກວ້າງ
ຂໍ້ຍົກເວັ້ນຖ້າ codepoints ໃດຈະ Xt ເຫມາະກັບ byte. HereXs ວິທີການຈັດການດ້ວຍຕົນເອງ
ການແປ:
ໃຊ້ DB_File;
ໃຊ້ Encode qw(encode decode);
ຜູກ %dbhash, "DB_File", "ຊື່ເສັ້ນທາງ";
# ຮ້ານ
# ສົມມຸດວ່າ $uni_key ແລະ $uni_value ແມ່ນສະຕຣິງ Unicode ທີ່ບໍ່ມີຕົວຕົນ
$enc_key ຂອງຂ້ອຍ = encode("UTF-8", $uni_key, 1);
$enc_value ຂອງຂ້ອຍ = encode("UTF-8", $uni_value, 1);
$dbhash{$enc_key} = $enc_value;
# ດຶງຂໍ້ມູນ
# ສົມມຸດວ່າ $uni_key ມີສະຕຣິງ Perl ປົກກະຕິ (ຕົວຫຍໍ້ Unicode)
$enc_key ຂອງຂ້ອຍ = encode("UTF-8", $uni_key, 1);
$enc_value ຂອງຂ້ອຍ = $dbhash{$enc_key};
$uni_value ຂອງຂ້ອຍ = decode("UTF-8", $enc_value, 1);
X 43: Unicode ຂໍ້ຄວາມ in dbm hashes, ໄດ້ ງ່າຍ ວິທີການ
HereXs ວິທີການຈັດການການແປພາສາ implicitly; ການເຂົ້າລະຫັດແລະການຖອດລະຫັດທັງຫມົດແມ່ນແລ້ວ
ອັດຕະໂນມັດ, ຄືກັນກັບການຖ່າຍທອດທີ່ມີການເຂົ້າລະຫັດສະເພາະທີ່ຕິດກັບພວກມັນ:
ໃຊ້ DB_File;
ໃຊ້ DBM_Filter;
$dbobj ຂອງຂ້ອຍ = tie %dbhash, "DB_File", "pathname";
$dbobj->Filter_Value("utf8"); # ນີ້ຄືວິເສດ
# ຮ້ານ
# ສົມມຸດວ່າ $uni_key ແລະ $uni_value ແມ່ນສະຕຣິງ Unicode ທີ່ບໍ່ມີຕົວຕົນ
$dbhash{$uni_key} = $uni_value;
# ດຶງຂໍ້ມູນ
# $uni_key ຖືສະຕຣິງ Perl ປົກກະຕິ (Unicode abstract)
$uni_value ຂອງຂ້ອຍ = $dbhash{$uni_key};
X 44: ໂຄງການ: Demo of Unicode ອາຫານວ່າງ ແລະ ການພິມ
HereXs ເປັນໂຄງການອັນເຕັມທີ່ສະແດງໃຫ້ເຫັນວິທີການນໍາໃຊ້ການຈັດລຽງຕາມທ້ອງຖິ່ນທີ່ລະອຽດອ່ອນ, ຕົວພິມ Unicode,
ແລະການຄຸ້ມຄອງຄວາມກວ້າງຂອງການພິມໃນເວລາທີ່ບາງຕົວອັກສອນໃຊ້ເວລາເຖິງສູນຫຼືສອງຖັນ, ບໍ່ແມ່ນ
ພຽງແຕ່ຫນຶ່ງຖັນໃນແຕ່ລະຄັ້ງ. ໃນເວລາທີ່ດໍາເນີນການ, ໂຄງການດັ່ງຕໍ່ໄປນີ້ຜະລິດຕະພັນນີ້ສອດຄ່ອງງາມ
ຜົນຜະລິດ:
ຄຣີມບຣູເລ.......x2.00
Eclair.............x1.60
Fideua............. X4.20
ແຮມເບີເກີ..........x6.00
Jamon Serrano...... X4.45
Linguica...........X7.00
ປຕ...............x4.15
ໝາກນັດ..............X2.00
ເປເຊ.............x2.25
Smorbrod...........X5.75
Spaetzle............X5.50
ໂຊຣິໂກ.............x3.00
XXXXXX.............. X6.50
XXX.............X4.00
XXX.............X2.65
XXXXXX.........X8.00
XXXXXXX..... X1.85
XX................ X9.99
XX................ X7.50
ນີ້ແມ່ນໂຄງການ; ທົດສອບໃນ v5.14.
#!/usr/bin/env perl
# umenu - ການຈັດຮຽງຕົວຢ່າງແລະການພິມຂອງອາຫານ Unicode
#
# (ຄຳບັນຍາຍທີ່ເປັນພັນທະແລະຍາວຂຶ້ນເລື້ອຍໆ)
#
ໃຊ້ utf8;
ໃຊ້ v5.14; # ສໍາລັບການຈັດຮຽງທ້ອງຖິ່ນ
ໃຊ້ຢ່າງເຄັ່ງຄັດ;
ການນໍາໃຊ້ຄໍາເຕືອນ;
ໃຊ້ຄໍາເຕືອນ qw(FATAL utf8); # ເຮັດໃຫ້ຄວາມຜິດຂອງການເຂົ້າລະຫັດຕາຍ
ໃຊ້ເປີດ qw(:std :utf8); # ການຖ່າຍທອດທີ່ຍັງບໍ່ໄດ້ປະກາດໃນ UTF-8
ໃຊ້ charnames qw(:ເຕັມ :short); # ບໍ່ຈໍາເປັນໃນ v5.16
# ໂມດູນ std
ໃຊ້ Unicode::Normalize; # std perl distro ເປັນຂອງ v5.8
ບັນຊີລາຍຊື່ການນໍາໃຊ້::Util qw(ສູງສຸດ); # std perl distro ເປັນຂອງ v5.10
ໃຊ້ Unicode::Collate::Locale; # std perl distro ເປັນຂອງ v5.14
# ໂມດູນ cpan
ໃຊ້ Unicode::GCSstring; #ຈາກ CPAN
# defs ຕໍ່
ແຜ່ນຍ່ອຍ($$$);
sub colwidth(_);
ຫົວຂໍ້ຍ່ອຍ(_);
%price ຂອງຂ້ອຍ = (
"XXXX" => 6.50, # gyros
"pears" => 2.00, # ເຊັ່ນ: um, pears
"linguica" => 7.00, #ໄສ້ກອກເຜັດ, ພາສາປໍຕູກີສ
"xorico" => 3.00, # ໄສ້ກອກ chorizo, ຄາຕາລານ
"hamburger" => 6.00, # burgermeister meisterburger
"eclair" => 1.60, # dessert, ຝຣັ່ງ
"smorbrod" => 5.75, #ແຊນວິດ, ນໍເວ
"spaetzle" => 5.50, # ໝີ່ Bayerisch, ນົກກະຈອກນ້ອຍ
"XX" => 7.50, # bao1 zi5, ເຂົ້າຫນົມຫມູຫນື້ງ, ພາສາຈີນກາງ
"jamon serrano" => 4.45, # ປະເທດ ham, ແອສປາໂຍນ
"peches" => 2.25, # peaches, ພາສາຝຣັ່ງ
"XXXXXXX" => 1.85, # ເຂົ້າໜົມທີ່ເຕັມໄປດ້ວຍຄຣີມຄື eclair
"XXX" => 4.00, # makgeolli, ເຫຼົ້າແວງເຂົ້າເກົາຫຼີ
"XX" => 9.99, # ຊູຊິ, ພາສາຍີ່ປຸ່ນ
"XXX" => 2.65, # omochi, ເຂົ້າໜົມເຄັກ, ພາສາຍີ່ປຸ່ນ
"creme brulee" => 2.00, # crema catalana
"fideua" => 4.20, # ເພີ່ມເຕີມ noodles, Valencian
# (Catalan=fideuada)
"pate" => 4.15, # gooseliver paste, ພາສາຝຣັ່ງ
"XXXXX" => 8.00, # okonomiyaki, ພາສາຍີ່ປຸ່ນ
);
ຂອງຂ້ອຍ $width = 5 + ແຜນທີ່ສູງສຸດ { colwidth } keys %price;
# ດັ່ງນັ້ນເລື່ອງອາຊີອອກມາເປັນຄໍາສັ່ງທີ່ໃຜຜູ້ຫນຶ່ງ
# ຜູ້ທີ່ອ່ານ script ເຫຼົ່ານັ້ນຈະບໍ່ freak ອອກຫຼາຍກວ່າ; ໄດ້
# CJK ສິນຄ້າຈະຢູ່ໃນ JIS X 0208 ສັ່ງທາງນັ້ນ.
my $coll = Unicode::Collate::Locale->new(locale => "ja");
ສໍາລັບ $item ຂອງຂ້ອຍ ($coll->sort(keys %price)) {
ແຜ່ນພິມ(entitle($item), $width, ".");
printf " X%.2f\n", $price{$item};
}
ແຜ່ນຮອງ($$$) {
my($str, $width, $padchar) = @_;
ກັບຄືນ $str . ($padchar x ($width - colwidth($str)));
}
sub colwidth(_) {
my($str) = @_;
ກັບຄືນ Unicode::GCSstring->new($str)->ຖັນ;
}
ຫົວຂໍ້ຍ່ອຍ(_) {
my($str) = @_;
$str =~s{ (?=\pL)(\S) (\S*)}
{ ucfirst($1). lc($2) }xge;
ກັບຄືນ $str;
}
ໃຊ້ perlunicook ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net