Voici la fonction ucwords () sécurisée par unicode, qui respecte en outre les doubles noms de famille comme le russe Засс-Ранцев et certains noms nobles comme Honoré de Balzac, d'Artagnan, Vincent van Gogh, Otto von Bismarck, Sulaymān ibn Dāwūd, etc.:
String.prototype.ucwords = function() {
return this.toLowerCase()
.replace(/(^|\s|\-)[^\s$]/g, function(m) {
return m.toUpperCase();
})
.replace(/\s(Of|De|Van|Von|Ibn|Из|Ван|Фон|Ибн)\s/g, function(m) {
return m.toLowerCase();
})
.replace(/(^|\s)(D|Д)(['’][^\s$])/g, function(m, p1, p2, p3) {
return p1 + (p1 === "" ? p2 : p2.toLowerCase()) + p3.toUpperCase();
});
}