Chào mừng bạn đến với Unicode
Tất cả những giải pháp này về cơ bản là sai cho văn bản hiện đại. Bạn cần phải sử dụng một cái gì đó hiểu trường hợp. Vì Bob yêu cầu các ngôn ngữ khác, tôi sẽ tặng một đôi cho Perl.
Tôi cung cấp bốn giải pháp, từ tồi tệ nhất đến tốt nhất. Chỉ có điều tốt nhất luôn luôn đúng. Những người khác có vấn đề. Đây là bản chạy thử để cho bạn thấy những gì hoạt động và những gì không, và ở đâu. Tôi đã sử dụng dấu gạch dưới để bạn có thể thấy vị trí của không gian được đặt và tôi đã đánh dấu là sai bất cứ điều gì, tốt, sai.
Testing TheLoneRanger
Worst: The_Lone_Ranger
Ok: The_Lone_Ranger
Better: The_Lone_Ranger
Best: The_Lone_Ranger
Testing MountMᶜKinleyNationalPark
[WRONG] Worst: Mount_MᶜKinley_National_Park
[WRONG] Ok: Mount_MᶜKinley_National_Park
[WRONG] Better: Mount_MᶜKinley_National_Park
Best: Mount_Mᶜ_Kinley_National_Park
Testing ElÁlamoTejano
[WRONG] Worst: ElÁlamo_Tejano
Ok: El_Álamo_Tejano
Better: El_Álamo_Tejano
Best: El_Álamo_Tejano
Testing TheÆvarArnfjörðBjarmason
[WRONG] Worst: TheÆvar_ArnfjörðBjarmason
Ok: The_Ævar_Arnfjörð_Bjarmason
Better: The_Ævar_Arnfjörð_Bjarmason
Best: The_Ævar_Arnfjörð_Bjarmason
Testing IlCaffèMacchiato
[WRONG] Worst: Il_CaffèMacchiato
Ok: Il_Caffè_Macchiato
Better: Il_Caffè_Macchiato
Best: Il_Caffè_Macchiato
Testing MisterDženanLjubović
[WRONG] Worst: MisterDženanLjubović
[WRONG] Ok: MisterDženanLjubović
Better: Mister_Dženan_Ljubović
Best: Mister_Dženan_Ljubović
Testing OleKingHenryⅧ
[WRONG] Worst: Ole_King_HenryⅧ
[WRONG] Ok: Ole_King_HenryⅧ
[WRONG] Better: Ole_King_HenryⅧ
Best: Ole_King_Henry_Ⅷ
Testing CarlosⅤºElEmperador
[WRONG] Worst: CarlosⅤºEl_Emperador
[WRONG] Ok: CarlosⅤº_El_Emperador
[WRONG] Better: CarlosⅤº_El_Emperador
Best: Carlos_Ⅴº_El_Emperador
BTW, hầu hết mọi người ở đây đã chọn cách đầu tiên, cách được đánh dấu là "Tệ nhất". Một số đã chọn cách thứ hai, được đánh dấu "OK". Nhưng không ai khác trước tôi đã chỉ cho bạn cách thực hiện phương pháp "Tốt hơn" hay "Tốt nhất".
Đây là chương trình thử nghiệm với bốn phương pháp:
#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
# First I'll prove these are fine variable names:
my (
$TheLoneRanger ,
$MountMᶜKinleyNationalPark ,
$ElÁlamoTejano ,
$TheÆvarArnfjörðBjarmason ,
$IlCaffèMacchiato ,
$MisterDženanLjubović ,
$OleKingHenryⅧ ,
$CarlosⅤºElEmperador ,
);
# Now I'll load up some string with those values in them:
my @strings = qw{
TheLoneRanger
MountMᶜKinleyNationalPark
ElÁlamoTejano
TheÆvarArnfjörðBjarmason
IlCaffèMacchiato
MisterDženanLjubović
OleKingHenryⅧ
CarlosⅤºElEmperador
};
my($new, $best, $ok);
my $mask = " %10s %-8s %s\n";
for my $old (@strings) {
print "Testing $old\n";
($best = $old) =~ s/(?<=\p{Lowercase})(?=[\p{Uppercase}\p{Lt}])/_/g;
($new = $old) =~ s/(?<=[a-z])(?=[A-Z])/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Worst:", $new;
($new = $old) =~ s/(?<=\p{Ll})(?=\p{Lu})/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Ok:", $new;
($new = $old) =~ s/(?<=\p{Ll})(?=[\p{Lu}\p{Lt}])/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Better:", $new;
($new = $old) =~ s/(?<=\p{Lowercase})(?=[\p{Uppercase}\p{Lt}])/_/g;
$ok = ($new ne $best) && "[WRONG]";
printf $mask, $ok, "Best:", $new;
}
Khi bạn có thể ghi điểm giống như "Tốt nhất" trên bộ dữ liệu này, bạn sẽ biết mình đã thực hiện đúng. Cho đến lúc đó, bạn đã không. Không ai khác ở đây đã làm tốt hơn "Ok", và hầu hết đã làm điều đó "Tệ nhất". Tôi mong muốn được nhìn thấy ai đó gửi mã chính xác.
Tôi nhận thấy rằng mã tô sáng của StackOverflow lại khốn khổ một lần nữa. Họ đang làm cho tất cả cùng khập khiễng như (hầu hết nhưng không phải tất cả) của phần còn lại của các phương pháp tiếp cận nghèo nàn được đề cập ở đây đã thực hiện. Có phải đã quá lâu để đặt ASCII nghỉ ngơi? Nó không còn ý nghĩa nữa và giả vờ rằng tất cả những gì bạn có chỉ đơn giản là sai. Nó làm cho mã xấu.