用户名称是否区分大小写?

11

我正在查看一些代码,它将用户名转换为小写字母后进行存储。我90%确定这是可以的,但是否有系统实际上要求对用户名称区分大小写(特别是在医疗行业)?

注意:我的特定代码不在输入点处。我们从其他系统中获取用户名。我担心的是依赖于那些系统(可能不在我们的控制范围内)以一致的方式传递给我们相同用户的用户名时,它们会以相同的大小写格式传递给我们。

另外需要注意的是 - 该代码是:

userName.toLowerCase(Locale.ENGLISH)

所有用户名都是英文吗?这只是为了与数据库中的排序规则匹配吗?请注意,(至少在Java中)String.toLowerCase()被定义为String.toLowerCase(Locale.getDefault())

8个回答

23

Unix登录区分大小写...

还有其他系统也是这样吗?


1
有人能告诉我为什么这个被踩了吗?虽然它不是我的情况下的具体答案,但我认为它对其他人也会有用。怎么回事? - Stephen
好的,这正好回答了问题。它指出了用户名区分大小写的情况。我点赞了这个回答。 - Daniel C. Sobral
“还有其他系统也这样做吗?” 当然有,例如Wikipedia的用户名是区分大小写的。 - Sadeq
1
不确定自2016年以来是否有所改变,但在维基百科登录后,我的用户名显示为标题大小写,但我使用全小写的用户名登录 ¯\(ツ)/¯。 - Oskar Austegard

7

toLowerCase只有一个原因需要接受locale的支持:

因为在所有标准语言中,小写字母i上面都有一个点,所以大写字母I被转换为带有一个点的小写字母i。

但是在土耳其语中,还有一个带有一个点的大写字母İ。这会被转换为小写字母i。

“常规”的土耳其大写字母I会被转换为没有点的小写字母ı。

因此,除非您的土耳其用户名都叫IiI1I1iiII,否则我不太担心这个问题。

除土耳其语外,其他语言都有相同的toLowerCase实现。因此,您可以选择Locale.ENGLISH或Locale.GERMAN等等...只需确保不选择土耳其语。

请参阅javadoc以获取更详细的信息

编辑:感谢utku karatas,我能够/复制并粘贴此帖子中的正确字形。


有土耳其语的问题吗?无论如何,使用不变的区域设置就可以支持数百万潜在用户所需的所有工作,没有理由偷懒。 - Robert Gould
1
没有土耳其键盘 Andreas? :) 让我来说明一下这个问题... lower("I") = "ı",lower("İ") -> "i"。 - utku_karatas
顺便提一下,Jeff在这个问题上发表了一篇长篇博客.. http://www.codinghorror.com/blog/archives/001075.html - utku_karatas
2
我想指出的是,不仅土耳其语具有不同的 toLocaleLowerCase 实现。 目前有三种语言有不同的规则,分别是立陶宛语、土耳其语和阿塞拜疆语。 来源 - Stefnotch
“除土耳其语外,其他语言都有一个与 toLowerCaseImplementation 相同的实现” - 情况比这更复杂。例如,在德语中,SS -> ß。希腊语有两种写小写Σ的方式,取决于单词位置。 - martinkunev

3
使用区分大小写的用户名/密码是增加安全性的简单方法,所以问题是,您在安全性和易用性之间如何权衡。请记住,您考虑解决大小写不敏感性的方式可能会有一些本地化问题,但如果您不关心,则不必担心。

2

使用英语区域设置来将用户名转换为小写肯定会导致问题。我建议使用不变的文化来将其转换为小写。


在Java中,这将是Locale.ROOT。 - Stephen
在.NET中,不变文化(Invariant culture)无论如何都是英语环境。 - Joshua
3
@Joshua - 这是一个内部实现细节,您不应该依赖它。 - Franci Penov

1

Kerberos可以在Windows环境中使用,但存在大小写敏感的问题。您可以按照特定的方式进行配置,以确保不会出现大小写敏感的问题,但也可能会出现相反的情况。


1

这取决于上下文,但在Informix SQL语言中,有'owners'(基本上相当于标准SQL中的模式),而你编写所有者名称的方式很重要。

SELECT *
    FROM someone.sometable, "someone".sometable,
         SOMEONE.sometable, "SOMEONE".sometable

这两个带引号的名称肯定是不同的;这两个不带引号的名称映射到相同的名称,这取决于数据库模式,可能是其他两个中的任何一个。周围有一些代码对(未加引号的)名称进行大小写转换。幸运的是,大多数情况下您不需要指定名称,当您需要时,您会写出没有引号的名称,所有东西都可以正常工作;或者您用引号写出名称并保持一致,所有东西都可以正常工作。然而,偶尔像我这样的人必须真正理解细节,以便在所有的困难中使程序正常工作。
此外,(正如Stephen所指出的那样)Unix登录名区分大小写,一直以来都是如此。我相信Windows登录名大多是不区分大小写的——但我不会在这方面进行实验(在Windows上有太多的方式可以搞砸了,不需要将这种技巧添加到游戏中)。
如果你真的想在Unix上让某人感到困惑,给他们一个数字用户名(例如123),但给他们一个不同的UID(例如234)。

0

如果您的唯一目标是区分一个用户和另一个用户,那么您需要考虑比大小写更多的因素。


0

我从来没有遇到过在用户名上强制使用区分大小写的系统(也不想要这样的系统)。

很可能代码会在输入时将它们强制转换为小写,以尝试避免后面的区分大小写问题。


我已经编辑说明我们的系统不是提供访问的那个系统。 - Stephen
维基百科用户名区分大小写,但第一个字母始终会自动大写。 - Jakob
虽然Wikimedia / Wikipedia / MediaWiki的用户名区分大小写,但该软件会防止仅由大小写不同的两个用户名。 - John Vandenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接