Il y a les caractères standard A-Z, a-z, mais aussi des tirets, des tirets em, des guillemets, etc.
De plus, il y a tous les caractères internationaux, comme les trémas, etc.
Alors, pour un système basé sur l'anglais, quel est l'ensemble complet? Qu'en est-il des ensembles pour d'autres langues? Qu'en est-il de l'UTF8, de l'UTF16, etc.?
Question bonus: combien de champs de nom sont nécessaires et quelles sont leurs longueurs maximales?
EDIT: Il y a certainement deux types différents de personnages impliqués dans les noms des personnes, ceux qui sont là dans le cadre du contexte et ceux qui sont là pour des raisons structurelles. Je ne veux pas limiter ou interférer avec les caractères de contexte, mais j'ai besoin de m'occuper des caractères structurels.
Par exemple, j'avais un nom entré qui était séparé par un tiret cadratin, mais il était difficile de le distinguer du caractère moins. Pour faciliter la recherche dans le système, je veux prendre les cinq types de tirets différents et les mapper sur un caractère unique (moins), de sorte que le chercheur n'a pas besoin de savoir spécifiquement quel symbole a été initialement entré.
Le problème existe pour les tirets, probablement aussi les guillemets, mais aussi combien d'autres symboles?
Il y a un bon article du W3C intitulé Noms personnels dans le monde qui explique assez bien les problèmes (et les solutions possibles) (c'était à l'origine un article de blog en deux parties de Richard Ishida: partie 1 et partie 2 )
Personnellement, je dirais: prend en charge tous les caractères Unicode imprimables et, pour être sûr, ne fournit qu'un seul "nom" de champ contenant le nom complet et formaté. De cette façon, vous pouvez stocker à peu près toutes les formes de nom. Vous pourriez avoir besoin d'un stockage plus structuré, mais ne vous attendez pas à pouvoir stocker chaque combinaison sous une forme structurée, car il y en a tout simplement trop.
La liste blanche des caractères qui pourraient apparaître au nom d'une personne n'est pas la bonne solution, si vous me le demandez. Bien sûr, [A-Za-z] est un bon point de départ, mais, comme vous l'avez dit, vous rencontrez des problèmes avec les noms "européens". Vous mappez donc tous les trémas, les circonflexes et ceux-là. Et les noms chinois? Japonais? Indien? Hébreu? Vous entrez dans une bataille contre les éoliennes.
Si vous devez absolument vérifier la validité du nom de quelqu'un, je vous suggère de faire une modeste liste noire de certains personnages. Les accolades, les caractères mathématiques, certains signes de ponctuation et autres peuvent être ignorés en toute sécurité. Mais je serais prudent, si j'étais toi.
Il serait peut-être préférable d'accepter tout ce qui entre. UTF-16 devrait être le jeu de caractères excessif d'aujourd'hui, qui devrait être suffisant pour quelques années à venir.
Edit: Quant à votre question sur la longueur du nom et la quantité de noms. Si vous voulez vraiment que les gens écrivent leurs noms réels et complets, je suppose que la seule réponse à toute épreuve à ces deux questions serait "infinie". Ne pas être en mesure de révéler de vrais exemples pour les êtres humains, mais il existe sûrement des exemples analogues pour les humains comme le nom natif de la ville de Bangkok .
Je ne pense pas qu'il y ait de réponse définitive. Après tout, certaines personnes ont des noms qui ne peuvent même pas être exprimés en UTF-16 ...
Il y a des gens étranges qui donneront à leurs enfants les noms les plus fous, y compris en mettant des signes de ponctuation étranges, des accents qui n'existent pas dans leur propre langue, etc.
Cependant, vous pouvez placer des restrictions arbitraires sur votre base de données. Si vous le souhaitez, vous pouvez insister sur les noms 7 bits ASCII. C'est un peu grossier pour les utilisateurs, mais ils vivront avec. Cela facilite certainement la recherche.
La fille de ma collègue s'appelle Amélie. Mais même certains (pas tous!) Les sites Web officiels du gouvernement britannique ("Veuillez entrer le nom exactement comme indiqué sur le certificat de naissance") n'accepteront pas l'unicode, il doit donc utiliser "Amélie" à la place.
Sur la question des champs de nom, la réponse [~ # ~] fausse [~ # ~] est prénom, milieu initiale, nom de famille, etc. pour de nombreuses raisons.
Beaucoup de gens sont connus par leur deuxième prénom et utilisent formellement une première initiale, un deuxième prénom, un format de nom de famille.
Dans certaines cultures, le nom de famille est le prénom et le prénom est le nom de famille.
Plusieurs prénoms et/ou prénoms sont de plus en plus courants. Comme le souligne @Dour High Arch, l'autre extrême concerne les personnes qui n'ont qu'un seul mot en leur nom.
Dans une base de données orientée objet, vous stockeriez un objet Name avec des méthodes pour renvoyer un nom de style répertoire ou de style signature; et le magasin de sauvegarde contiendrait toutes les données nécessaires pour prendre en charge ces méthodes.
Je n'ai pas encore vu de modèle de base de données relationnelle qui améliore le modèle de deux chaînes de longueur variable pour les noms de style répertoire et de style signature.
Tout caractère pouvant être représenté par un multiple de huit bits (supérieur à zéro) est un caractère possible pour le nom d'une personne. Les longueurs des noms et des encodages sont arbitraires, donc aucune limite supérieure ne doit être considérée.
Assurez-vous simplement de nettoyer vos entrées de base de données afin que les petites tables de dépôt Bobby ne vous obtiennent pas.
Cela dépend vraiment à quoi l'application est censée être utilisée.
Bien sûr, en théorie, c'est génial si vous permettez à tous les scripts sur la terre verte de Dieu d'être utilisés, mais si la base de données est également utilisée par le personnel de support, vont-ils être capables de gérer les noms en japonais, en hébreu et en thaï? Pouvez-vous imprimer, s'il est utilisé pour imprimer des étiquettes postales?
Vous pouvez ajouter un champ supplémentaire "Latin Transcription", mais IMO c'est vraiment OK de le limiter aux caractères ISO-8859-1 - Les gens qui n'utilisent pas les caractères latins sont maintenant tellement habitués à devoir utiliser une transcription qu'ils ne font pas " ça ne me dérange plus, à moins qu'ils ne soient des nationalistes inconditionnels.
Je crée des logiciels pour les écoles de conduite aux États-Unis, donc pour moi, ce qui importe le plus, ce que les DMV de l'État acceptent comme nom propre sur un permis de conduire. Dans mon cas, cela entraînerait des problèmes pour autoriser des noms au-delà de ce que le DMV permet, même si ces noms étaient légaux car le même nom doit être utilisé plus tard pour un permis de conduire.
De StackOverflow, je n'avais toujours pas confirmé la réponse dont j'avais besoin. Et je sais que dans mon état (Californie), ils utilisent des AS400 avec un logiciel probablement écrit en COBOL, et à ma connaissance, ceux-ci ne prennent en charge qu'un jeu de caractères 8 bits. (Est-ce EBCDIC?) Quoi qu'il en soit ... Ugh.
Donc, j'ai appelé le California DMV ... Effectivement, leur système permet A-Z et les espaces et absolument rien d'autre. Même les tirets ne sont pas autorisés - les tirets sont remplacés par des espaces. En fait, apparemment juste pour être difficile, ils n'utilisent que des majuscules. Et des noms tels que "O'Malley" doivent être remplacés par OMALLEY.
Laissez cela au gouvernement. Je dois dire que je suis ravi de ne pas être un développeur travaillant pour DMV. (Bien que je puisse vraiment utiliser ce genre de salaire.)
UTF-8 devrait être assez bon, en ce qui concerne les champs de nom, vous voudrez au moins un prénom et un nom.
Que faites-vous lorsque vous avez "The Artist Formerly Known as Prince". Ce symbole qu'il a utilisé n'est pas un personnage de l'ensemble unicode (AFAIK).
C'est une certaine légèreté, mais en même temps, les noms sont un concept assez large qui ne se prête pas bien à un format structuré. Dans ce cas, quelque chose de forme libre pourrait être le plus approprié.