用户名中的感叹号和特殊字符

您好。

我们正在将一个大型社区从 vb3 迁移到 Discourse。
许多用户名——大约 1200 个——包含感叹号“!”,但我找不到任何重新启用它的选项。
我们已经启用了“unicode 用户名”,但没有效果。
对此问题有什么现成的解决方案吗?

谢谢!

1 个赞

不。更改用户名的法律字符实际上不是一个选项。我认为他们将不得不拥有不太令人兴奋的用户名。

哇,这似乎是个相当大的疏忽……对此有什么技术解释吗?我们是否可以通过插件或分叉来解决这个问题?

我没有做决定,但有很多系统不允许 ! 作为用户名的有效字符。如果你尝试在插件中(或者在分支版本中,如果你还想再次升级 Discourse,那将是一个非常非常糟糕的主意)允许它,那将很难。

! 在许多上下文中都有特殊含义,我怀疑如果你只是更改用户名验证器,很多其他东西都会中断。

我明白了。不过,这确实是应该解决的问题。其他所有 BB 解决方案都允许在用户名中使用该字符,而且这在游戏社区中很常见。用户名和用户 ID 应该分开处理,以免受到此类限制。我们大约有 95,000 名会员,联系其中的 1,200 人更改用户名将非常麻烦。不过,还是谢谢你的帮助!

1 个赞

我做过几十次,甚至上百次导入。我密切关注这里关于导入的提问。这是我第一次记得有人抱怨它。

你可以告诉所有人尝试使用他们的用户名和电子邮件地址(很多人也不知道这一点)。很有可能你还有其他用户名也发生了更改。

这将列出所有更改过的用户名:

UserCustomField.where(name: 'import_username').pluck(:value)
2 个赞

我找到了一些帖子:

https://meta.discourse.org/t/username-restrictions/126664

这可能比仅仅是感叹号要多得多。这似乎是一个奇怪的限制,因为你可以在其他任何地方使用这些字符。

无论如何,感谢你的帮助。

1 个赞

需要指出的是,名称和用户名并非同一事物。用户名用于 URL 路径,例如:

https://meta.discourse.org/u/pfaffman/summary

感叹号在 URL 中不是有效字符,而像 ?& 这样的字符在 URL 结构中有特殊用途,因此也不能作为用户名的组成部分。这并非 Discourse 特有,任何在 URL 结构中使用用户名的系统都必须遵守这一点。

用户名不能包含感叹号,但名称可以,您可以在 UI 中优先显示名称。

3 个赞

完全说得通,@Stephen,谢谢你的澄清。

我认为我们可以修改导入脚本,使其执行类似操作:

username_original = username
username = @htmlentities.decode(user["username"]).strip

{
          id: user["userid"],
          name: username_original,
          username: username,
          password: password,
[... ]

并在 Discourse 设置中启用用户“name”的优先级高于 username(如果存在)。

3 个赞

除此之外,用户名还用于“@提及”,因此期望用户名是简单易输入的;这就是为什么我们默认只允许 ASCII 字符(尽管可以通过 unicode_usernames 设置扩展到 Unicode,但仍然不允许标点符号)。

请注意,该迁移脚本使用的是非批量迁移脚本基类,它通过您链接的方法生成的每个用户记录都会执行此操作:

该方法会删除用户名中的任何无效字符。

代码中有许多地方会假定用户名的某些属性(例如“@提及”解析、更改用户名等),这就是我们强制执行这些限制的原因。

正如 Stephen 所说,用户名不是展示用户个性的地方;姓名和徽章字段才是 :slight_smile:

7 个赞

仍然有相当多的边缘情况,由于这种方式而难以管理。
名字不是唯一的,如果我们优先考虑名字的布局,你可以想象一下,在一个充斥着整天玩游戏和捣乱的不成熟青少年的论坛里,那会是什么样子 :slight_smile:

说这可能是一个低优先级的问題是可以的,但它确实需要一些思考和工作,而且肯定不是一个“功能”,也不是一个比能够选择一个没有像其他早已存在的论坛软件那样严格限制的唯一名称更有优势的东西。

1 个赞

如果用户是 pfaffman!,URL 通常会是:
https://meta.discourse.org/u/pfaffman!/summary
至少,我曾经用过的任何其他 CMS 都是这样工作的

1 个赞

哦,太棒了!现有技术。:+1:

您介意分享一些您使用过的开源CMS项目吗?我们可以看看它们是如何处理固定链接和用户引用的,并从它们的努力中学习。:slight_smile:

不过……我想知道内容管理系统是否和社区论坛是完全相同的东西?:thinking:

“vb3”是指vBulletin吗?

是的

另外,提到特殊字符编码并非 CMS 的独有功能,它只是标准的编码方式:Percent-encoding - Glossary | MDN

1 个赞

但是我们该如何提及用户呢,@Crius?!

:point_up: :smiley: :point_down:

但是我们该如何提及用户呢,@Crius?!

我们是否应该输入 @maiki! 来提及用户名是 maiki! 的用户?:thinking: vBulletin 是如何处理的?

1 个赞

vBulletin 3 没有该功能,vBulletin 5……我不知道它是否有该功能,因为它是一款在现代功能方面明显落后的软件。

当你在 discourse 中 ping 某人时,会出现一个自动建议。无需担心必须输入完整的昵称。
编辑:最终,如果你真的想要,这意味着需要解码用户名列表进行建议,或者对输入(输入部分内容的用户名)进行编码,以便能够适当地搜索用户名。

我的意思是,我们可以争论需要多少工作和精力,但不能争论“是否”可能。

无论如何,我不知道这是否只是媒体在传达情绪方面做得不好,但所有这些最近的回复都感觉有点“敌对”。人们来到 meta.discourse 寻求帮助和提出改进建议。如果你不同意,可以忽略该主题然后继续。

另外,我忘了补充。如果 discourse 有开放的 PR,我可以在一个 fork 中尝试处理它并打开一个 PR。虽然我不是 ruby 开发者,但我有多年的软件工程师/平台工程师工作经验。我很乐意尝试做出贡献 :slight_smile:

3 个赞

Just updating for posterity, ! are not a thing forbidden in URLs as mentioned above. I don’t know from where this notion came through.

However, Ruby seems to be using ? and ! in their functions which is a weird thing to be honest (at least in my 20+ years of software engineering) but each language has its own things :slight_smile:

Which might hint at why ! is forbidden. I’ll have to dig deeper into discourse source code to understand if this was a specific issue that couldn’t be solved or just something that overzealously prohibited to avoid potential issues between usernames and ruby going crazy in some edge cases.

为了方便以后查阅,我补充说明一下,正如上面提到的,URL 中并不禁止使用 !。我不知道这个说法是从哪里来的。

不过,Ruby 在函数中使用 ?! 确实有点奇怪(至少在我 20 多年的软件工程经验中是这样),但是 每种语言都有自己的特点 :slight_smile:

这或许可以解释为什么 ! 被禁止了。我需要深入研究 discourse 的源代码,才能明白这是否是一个无法解决的特定问题,或者仅仅是为了避免用户名和 Ruby 在某些极端情况下出现问题而过度禁止了它。

3 个赞

抱歉,我来回复这个老帖子,但我遇到了同样的问题,我猜想竖线 | 以及方括号 [] 也是用户名不允许的字符,并且无法以某种方式启用它们?

我即将把一个旧的论坛从 phpBB3 迁移到 Discourse,其中有很多用户名的格式是 Clan|Nickname[Clan]Nickname

1 个赞

我会编辑脚本以查找这些字符,并将它们替换为合法的字符,例如 _ 或 -。我认为它只会删除它们。您可以查看建议的用户名代码。

当我将第一个论坛迁移到 Discourse 时,我注意到非法字符(尤其是空格,但也有其他字符)被替换成了下划线。但在本论坛,最常见的非法字符是空格,而且不常出现,所以它不是现在可能出现的问题。不过,这不会成为阻碍。也许我会在名称字段中输入旧用户名。我们拭目以待——等我解决了我的导入容器无法构建的另一个问题……