我创建了winforms application
,为每个用户创建一个小SQLite database
。 database name
包含用户的e-mailaddress
。
情境:
拥有电子邮件地址的用户:test@test.com
使用该应用程序,将创建以下database
:
test@test.com.sqlite
我知道有一种情况是e-mailaddress转换为路径,不会转换为有效路径。
路径保留以下字符:/ \ ? % * : | " < > . and a space
我目前正在使用下一种方法来过滤电子邮件:
public string ReturnFilteredUsername(string username)
{
username = username.Replace("<", "x"); username = username.Replace(">", "x"); username = username.Replace(":", "x"); username = username.Replace("\"", "x");
username = username.Replace("/", "x"); username = username.Replace(@"\", "x"); username = username.Replace("|", "x"); username = username.Replace("?", "x");
username = username.Replace("*", "x");
return username;
}
此时所有保留字符都被“x”替换,我想将所有无效字符转换为“%20”。我可以将“x”替换为“%20”,但我不认为这是一种“干净”的方法
有人可以提出更“干净”的方法吗?
提前致谢!
答案 0 :(得分:0)
不是使用用户的电子邮件来命名数据库,而是使用数字ID标识每个用户,并使用它来命名数据库。
除了始终作为文件名有效之外,这还允许用户更改其电子邮件地址,而无需担心仍指向正确的数据库。
或者,如果您已开始使用电子邮件地址作为名称,请参阅this answer,了解哪些字符在电子邮件地址中有效。只要所有电子邮件地址都有效,您只需担心转义那些对电子邮件有效且对路径无效的字符。
我建议使用有效路径和无效电子邮件字符来启动转义序列(每个字符的不同序列,您必须转义),或者选择一个对两者都有效的不太常见的字符,并将其用作转义字符(记住也要逃避它!)。
示例:
%
和?
都列为对电子邮件有效,对路径无效。假设我们使用&
来转义(对两者都有效!),我们将创建一个这样的映射:
"&" = &00;
"%" = &01;
"?" = &02;
您将浏览每个电子邮件地址,并将每个无效字符替换为其转义的等效字符,使其既与电子邮件地址一样唯一,也可以作为路径动画安全。
“a&amp; b?100%@ example.com”将成为“a&amp; 00; b&amp; 02; 100&amp; 01; @ example.com”。