Unicode'a Hoşgeldiniz
Tüm bu çözümler modern metin için esasen yanlıştır. Vakayı anlayan bir şey kullanmanız gerekiyor. Bob başka diller istediğinden, Perl için bir çift vereceğim.
En kötüsünden en iyisine kadar dört çözüm sağlıyorum. Sadece en iyisi her zaman haklıdır. Diğerlerinin sorunları var. İşte size neyin işe yarayıp neyin yaramadığını ve nerede olduğunu gösteren bir test çalışması. Boşlukların nereye yerleştirildiğini görebilmeniz için alt çizgi kullandım ve yanlış olan herhangi bir şeyi yanlış işaretledim.
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, hemen hemen herkes burada "En Kötü" işaretli olan ilk yolu seçti. Birkaç tanesi "Tamam" olarak işaretlenmiş ikinci yolu seçti. Ama benden önce hiç kimse size "Daha İyi" veya "En İyi" yaklaşımını nasıl yapacağınızı göstermedi.
İşte dört yöntemi ile test programı:
#!/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;
}
Bu veri kümesindeki "En İyi" ile aynı skoru elde ettiğinizde, bunu doğru yaptığınızı bileceksiniz. O zamana kadar, yapmadın. Buradaki hiç kimse "Tamam" dan daha iyisini yapmamış ve çoğu "En Kötü" yapmamıştır. Birinin doğru post kodunu gönderdiğini görmek için sabırsızlanıyorum.
StackOverflow'un vurgulama kodunun tekrar sefil bir şekilde durduğunu fark ettim. Burada bahsi geçen kötü yaklaşımların geri kalanıyla (hepsi değil, hepsi) aynı eski topallığı yapıyorlar. ASCII'yi dinlendirmek uzun zaman almıyor mu? Artık mantıklı değil ve sahip olduğun tek şey gibi davranmak yanlış. Kötü kod yapar.