嗯,从你的问题来看,我在这一点上并不完全清楚,但既然你想要一些转换,我假设你想要至少是人类可读的东西?
每个操作系统可能有不同的限制,但您是否足够接近平台,以便能够找出/测试用户名中可接受的内容?如果你能找到三个“特殊”字符,你可以用它们来替换'@', '.', '_'
你会很高兴。(那是全面的吗?如果不是,你需要确保你知道所有这些,否则你可能会发生冲突。)我搜索了一下,试图找到是否有 POSIX 标准,但找不到任何东西,所以这就是为什么我认为,如果您可以测试什么是有效的,那将是最直接的途径。
即使有一个特殊字符,您也可以进行 URL 编码,如果可用,则使用 '%',或者如果不可用,则使用任何您选择的字符,例如 '!",然后{ '@'->'!40", '_'->'!5F', '.'-> '!2E' }
。(规范 [RFC1738] http://www.rfc-editor .org/rfc/rfc1738.txt)将字符定义为 US-ASCII 所以你可以找到一个表格,例如在维基百科的 ASCII 文章中并在那里查找正确的十六进制数字。)或者,你可以自己做简单的映射,因为你不需要整个 ASCII 集,你可以做一个每个转义字符有两个字符的映射,并且有,比如说,'!a','!u','!p'
at,下划线,句点。
如果您有两个特殊字符,例如 '%' 和 '!',您可以分隔代表字符的文本,例如%at!
,&us!
和'&pd!'
。(这几乎是 html 样式的编码,但不是 '&' 和 ';' 您使用的是可用的,并且您正在编写自己的助记符。)另一个想法是您可以使用符号运行来确定翻译的字符,其中每个新字符都会翻转正在使用的符号。(如果我们需要将两个不允许的字符并排放置,这可以方便地停止运行。)因此假设 '%' 和 '!',句点为 1,下划线为 2,at-sign 为 3,'mickey._sample_@fake.out'
将变为'mickey%!!sample%%!!!fake%out'
. 还有其他变体,但这个很容易编码。
如果这些都不是一个选项(例如,根本没有符号,只有 [a-zA-Z0-9]),那么我真的认为 Base64 的答案听起来是正确的。真的,一旦我们得到除了简单替换(甚至那个)之外的任何东西,如果这是目标,那么输入已经变得困难了。但是如果你真的需要尽量保持电子邮件的可读性,你要做的就是实现某种转义。我想用'0'作为你的转义字符,所以现在'0'变成'00','@'变成'01','.' 变成“02”,“_”变成“03”。所以现在,'mickey01._sample_@fake.out'
会变成'mickey0010203sample0301fake02out'
. 不漂亮,但应该可以;因为我们转义了任何原始 0,所以请始终确保为您选择作为转义字符的任何内容定义一个映射,您应该没问题..
这就是我能想到的atm。:) 当然,如果这些用户名不需要在原始文件中可读,那么显然 Base64 似乎不起作用,因为它会产生斜杠。哎呀,好吧,只是每个字符的 2 位 US-ASCII 十六进制值,你就完成了……] 是一个好方法;那里有很多经过调试的、经过大量现场测试的代码,它可以很方便地解决您的问题。:)