55

有标准的 AZ、az 字符,也有连字符、破折号、引号等。

此外,还有所有的国际字符,如变音符号等。

那么,对于一个基于英语的系统,完整的集合是什么?其他语言的集合呢?UTF8、UTF16 等呢?

额外问题:需要多少个名称字段,它们的最大长度是多少?

编辑:人名中肯定有两种不同类型的字符,一种是作为上下文的一部分,另一种是出于结构原因。我不想限制或干扰上下文字符,但我确实需要处理结构字符。

例如,我输入了一个用 em 破折号分隔的名称,但很难将其与减号字符区分开来。为了使系统更易于搜索,我想采用所有五种不同类型的破折号,并将它们映射到一个唯一字符(减号)上,这样搜索者就不需要具体知道最初输入的是哪个符号。

破折号存在问题,可能还有引号,还有多少其他符号?

4

10 回答 10

54

W3C 有一篇名为Personal names 的好文章在世界各地 很好地解释了问题(和可能的解决方案)(它最初是 Richard Ishida 的两部分博客文章:第 1部分和第 2 部分

我个人会说:支持每个可打印的 Unicode 字符,并且为了安全起见,只提供一个包含完整格式名称的字段“名称”。这样您就可以存储几乎所有形式的名称。您可能需要更结构化的存储,但不要期望能够以结构化形式存储每个组合,因为不同的组合太多了。

于 2009-01-07T16:48:02.933 回答
16

如果您问我,将可能出现在人名中的字符列入白名单是错误的做法。当然,[A-Za-z] 是一个公平的起点,但是,正如您所说,您会遇到“欧洲”名称的问题。所以你映射所有的变音符号,抑扬符和那些。中文名字呢?日本人?印度人?希伯来语?您正在与风力涡轮机进行战斗。

如果您绝对必须检查某人姓名的有效性,我建议您对某些字符进行适度的黑名单。大括号、数学字符、一些标点符号等可能是可以安全忽略的。但如果我是你,我会小心的。

最好只接受进来的任何东西。UTF-16 应该是今天的过度杀伤字符集,在未来几年应该足够了。

编辑:至于您关于名称长度和名称数量的问题。如果你真的想让人们写下他们真实而完整的名字,我想这两个问题的唯一万无一失的答案就是“无限”。无法为人类找出任何真实的例子,但作为曼谷市的本地名称,人类肯定有类似的例子。

于 2009-01-07T16:49:29.560 回答
12

我不认为有一个确定的答案。毕竟,有些人的名字甚至无法用 UTF-16 表达……

王子符号

那里有一些奇怪的人,他们会给他们的孩子起最疯狂的名字,包括使用奇怪的标点符号、他们自己的语言中不存在的口音等等。

但是,您可以对数据库设置任意限制。如果您愿意,您可以坚持使用 7 位 ASCII 名称。这对用户有点粗鲁,但他们会接受它。它当然使搜索更容易。

我同事的女儿叫 Amélie。但即使是一些(不是全部!)英国政府官方网站(“请准确输入出生证明上显示的姓名”)也不接受 unicode,因此他不得不使用“Amelie”。

于 2009-01-07T16:56:14.943 回答
4

任何可以由 8 位的任意倍数(大于零)表示的字符都是人名的可能字符。名称和编码的长度都是任意的,因此不应考虑上限。

只要确保你清理了你的数据库输入,那么小 Bobby Drop-tables 就不会得到你。

于 2009-01-07T16:50:44.033 回答
4

在姓名字段的问题上,错误的答案是名字、中间名首字母、姓氏等,原因有很多。

  1. 许多人以他们的中间名而闻名,并正式使用首字母、中间名、姓氏的格式。

  2. 在某些文化中,姓是名,名是姓。

  3. 多个名字和/或中间名越来越普遍。正如@Dour High Arch 指出的那样,另一个极端是名字中只有一个单词的人。

在面向对象的数据库中,您将存储一个 Name 对象,其中包含返回目录样式或签名样式名称的方法;并且后备存储将包含支持这些方法所需的任何数据。

我还没有看到一个关系数据库模型改进了目录样式和签名样式名称的两个可变长度字符串的模型。

于 2009-01-07T17:27:49.920 回答
4

我正在为美国的驾驶学校制作软件,所以对我来说最重要的是州 DMV 接受的驾驶执照上的专有名称。就我而言,允许使用超出 DMV 允许范围的名称会导致问题,即使这些名称是合法的,因为以后必须将相同的名称用于驾驶执照。

从 StackOverflow,我仍然没有确认我需要的答案。而且我碰巧知道,在我所在的州(加利福尼亚州),他们使用的软件可能是用 COBOL 编写的 AS400,据我所知,这些软件仅支持 8 位字符集。(是 EBCDIC 吗?) 无论如何……呃。

所以,我给加州 DMV 打了电话……果然,他们的系统允许 AZ 和空间,绝对没有别的。连连字符都不允许——连字符被替换为空格。事实上,显然只是为了难,他们只使用大写字母。并且必须将“O'Malley”等名称替换为 OMALLEY。

交给政府吧。我必须说我很高兴没有成为 DMV 的开发人员。(虽然我真的可以用那种薪水。)

于 2012-10-26T18:20:55.933 回答
2

这实际上取决于应用程序应该用于什么。

当然,理论上如果你允许使用上帝的绿色地球上的每一个脚本是很好的,但如果数据库也被支持人员使用,他们是否能够处理日文、希伯来文和泰文的名字?如果它用于打印邮资标签,您可以打印机吗?

您可能会添加一个额外的字段“拉丁语转录”,但 IMO 将其限制为 ISO-8859-1 字符真的没问题 - 不使用拉丁字符的人现在已经习惯了不得不使用他们不使用的转录本别再介意了,除非他们是铁杆民族主义者。

于 2009-01-08T00:17:42.133 回答
0

UTF-8 应该足够好,就名称字段而言,您至少需要名字和姓氏。

于 2009-01-07T16:47:29.390 回答
0

当你有《艺术家原名王子》时,你会怎么做。他使用的那个符号不是 unicode 集 (AFAIK) 中的字符。

这有点轻率,但与此同时,名称是一个相当广泛的概念,不适合结构化格式。在这种情况下,自由形式的东西可能是最合适的。

于 2009-01-07T16:55:56.160 回答
-1

根据您的名称结构的复杂性,我可以看到:

  1. 中间名首字母/中间名
  2. 后缀(Jr. Sr. II、III、IV 等)
  3. 前缀(先生、夫人、女士等)
于 2009-01-07T16:51:56.293 回答