Selamat datang di Unicode
Semua solusi ini pada dasarnya salah untuk teks modern. Anda perlu menggunakan sesuatu yang mengerti kasus. Karena Bob meminta bahasa lain, saya akan memberikan pasangan untuk Perl.
Saya memberikan empat solusi, mulai dari yang terburuk hingga yang terbaik. Hanya yang terbaik selalu benar. Yang lain memiliki masalah. Berikut ini adalah uji coba untuk menunjukkan kepada Anda apa yang berhasil dan yang tidak, dan di mana. Saya telah menggunakan garis bawah sehingga Anda dapat melihat di mana spasi telah diletakkan, dan saya telah menandai apa pun yang salah, yah, salah.
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, hampir semua orang di sini telah memilih cara pertama, yang ditandai "Terburuk". Beberapa telah memilih cara kedua, ditandai "OK". Tetapi tidak ada orang lain sebelum saya yang menunjukkan kepada Anda bagaimana melakukan pendekatan "Lebih Baik" atau "Terbaik".
Berikut adalah program pengujian dengan empat metodenya:
#!/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;
}
Saat Anda dapat skor yang sama dengan "Terbaik" pada dataset ini, Anda akan tahu bahwa Anda telah melakukannya dengan benar. Sampai saat itu, kamu belum. Tidak ada orang lain di sini yang melakukan lebih baik daripada "Ok", dan sebagian besar melakukannya "Terburuk". Saya berharap dapat melihat seseorang memposting kode ℂ♯ yang benar.
Saya perhatikan bahwa kode highlight StackOverflow bungkuk lagi. Mereka membuat semua lumpuh yang sama seperti (kebanyakan tetapi tidak semua) dari sisa pendekatan miskin yang disebutkan di sini. Bukankah sudah lama melewati ASCII untuk beristirahat? Itu tidak masuk akal lagi, dan berpura-pura semua yang Anda miliki hanyalah salah. Itu membuat kode yang buruk.