0

すべてのユーザーwinforms applicationに小さな を作成する を作成しました。SQLite databaseにはユーザーのdatabase nameが含まれe-mailaddressます。

シナリオ:

e-mailaddress: を持つユーザーがtest@test.com アプリケーションを使用すると、以下databaseが作成されます。

test@test.com.sqlite

パスに変換された電子メールアドレスが有効なパスに変換されないというシナリオがあることは知っています。

次の文字はパスによって予約されています。/ \ ? % * : | " < > . 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」に置き換えることは可能ですが、それは「クリーン」な方法ではないと思います

誰かがもっと「きれいな」方法を思い付くことができますか?

前もって感謝します!

4

1 に答える 1

0

ユーザーの電子メールを使用してデータベースに名前を付けるのではなく、数値 ID で各ユーザーを識別し、それを使用してデータベースに名前を付けます。

ファイル名として常に有効であることに加えて、これにより、ユーザーは正しいデータベースを指していることを心配することなく、電子メール アドレスを変更できます。


または、名前に電子メール アドレスを使用するように設定している場合は、電子メール アドレスで有効な文字についてこの回答を参照してください。すべての電子メール アドレスが有効である限り、電子メールには有効でパスには無効な文字のエスケープについてのみ心配する必要があります。

パスに対して有効で電子メールに対して無効な文字を使用してエスケープシーケンスを開始するか (エスケープする必要がある文字ごとに異なるシーケンス)、または両方に有効なあまり一般的ではない文字を選択し、次を使用することをお勧めします。それをエスケープ文字として使用します (エスケープすることも忘れないでください!)。

例:

%との両方?が、電子メールには有効で、パスには無効としてリストされています。エスケープするために使用すると仮定すると&(両方に有効です!)、次のようなマッピングを作成します。

"&" = &00;
"%" = &01;
"?" = &02;

各電子メール アドレスを調べて、無効な文字が出現するたびにエスケープされた対応する文字に置き換えて、電子メール アドレスと同じくらい一意であり、パス名として安全であるようにします。

「a&b?100%@example.com」は「a&00;b&02;100&01;@example.com」になります。

于 2013-04-26T12:57:04.387 に答える