2009-03-04 2 views
3

友好的なURLが必要なWebアプリケーションを作成していますが、7ビット以外のASCII文字を扱う方法がわかりません。アクセント付きの文字をURLでエンコードされたエンティティに置き換えることは望ましくありません。この種の変換を可能にするC#メソッドがありますか、または処理したいすべてのケースを実際にマップする必要がありますか?文字列をURLにする(例:モントリオールをモントリオールに変換する)

+0

私はこの質問のURLから、StackOverflowデザイナーが気にしなかったものを見ています:) –

+0

lol patrick、確かに、それらが戻ってきていないことがわかります:) – eglasius

答えて

3

私はC#でそれを行う方法がわかりませんが、あなたが望む魔法の言葉は "Unicode分解"です。 "é"のような構成された文字を分解する標準的な方法があります。そして、ASCII以外のものをフィルタリングするだけでよいはずです。

編集:thisあなたが探しているものかもしれません。

0

私はこれらの文字があまりないと思いますが、文字列クラスのReplace()メソッドを使用すると、文字列を非常に簡単に置き換えることができます。上の類似した何かがある

1

URL Routing: Handling Spaces and Illegal Characters When Creating Friendly URLs

はそれにもかかわらず、私は自動変換をお勧めしません。これらのタイプの変更を行うときには、いくつかの単語が意味を変えることがあります。素敵な言葉を不適切な言葉に変えることができます。

+0

ありがとうございました。私は検索で何も見つかりませんでした。 –

1

このリンクは役立つかもしれない:http://www.codeproject.com/KB/cs/UnicodeNormalization.aspx

private string LatinToAscii(string InString) 
{ 
string newString = string.Empty, charString; 
char ch; 
int charsCopied; 

for (int i = 0; i < InString.Length; i++) 
{ 
    charString = InString.Substring(i, 1); 
    charString = charString.Normalize(NormalizationForm.FormKD); 
    // If the character doesn't decompose, leave it as-is 

    if (charString.Length == 1) 
     newString += charString; 
    else 
    { 
     charsCopied = 0; 
     for (int j = 0; j < charString.Length; j++) 
     { 
      ch = charString[j]; 
      // If the char is 7-bit ASCII, add 

      if (ch < 128) 
      { 
       newString += ch; 
       charsCopied++; 
      } 
     } 
     /* If we've decomposed non-ASCII, give it back 
     * in its entirety, since we only mean to decompose 
     * Latin chars. 
     */ 
     if (charsCopied == 0) 
      newString += InString.Substring(i, 1); 
    } 
} 
return newString; 
} 
0

http://Montréal.com

(ブラウザでのコピー/貼り付け、それが動作?)

+0

ドメイン名のUnicode文字は、パス/クエリ部分とは異なる働きをしますが、IDNの "punycode"規則を使用してエンコードしています。 – bobince

2

使用UTF-8:

非ASCII の文字は、まずUTF-8 [STD63]に従ってコード化し、次に 対応するUTF-8シーケンスの各オクテットは、URI文字として表されるようにエンコードされたパーセント-でなければなりません。 - RFC 3986

+0

+1。パス部分に非ASCII文字を使用することは完全に許可されています。 UTF-8バイトを16進数でエンコードし、ブラウザはアドレスバーにUnicodeバージョンを表示します。これがうまくいくところはWikipediaを参照してください。 – bobince

+0

2番目の文は「アクセント付きの文字をURLエンコードされたエンティティに置き換えたくない」と言っても、「URIで表現するにはパーセントエンコードする必要があります」ということをするように指示しますか?私たちがここで持っているのは、コミュニケーションの失敗です。 – Ken

+0

彼は、そのようなエンコードされた単語は、それが表す文字ではなく、 '%xx'として表示されると仮定していると思います。しかし、これはUTF-8でエンコードされていない場合にのみ当てはまります。 – Gumbo

1

ここにいくつかの良い回答があります。これらのメソッドは機能します。しかし、私はあなたの基本的な前提に疑問を呈しなければなりません。私はあなたが議論しているこれらの値は、基本的にクエリーストリングのパラメータであると推測します、はい?これは、特殊文字を除外する必要がある最も一般的な理由です。

2〜3年の間、私は文字列のエンコード/デコードの手法を使用して、このようなものをクエリ文字列で渡しました。私たちの方法は、ここで概説されているものほど洗練されていませんでしたが、それでもなお断続的な問題がありました。 2005年に、私が取り組んでいたシステムの大部分を書き直している間に、私たちはquerystringを通してID値を渡すことに決心しました。そのアプローチは非常にうまくいっていて、私はそれには何の欠点も考えられません。とにかくデータベースのバックエンドを持っているなら、あなたはすでにほとんどすべての文字列にidを付けています。検索などのためのものであれば、いつでもフォームポスト経由で送ることができます。または、最初に別のページを読み込む必要のないAJAXソリューションを使用することもできます。

これらの方法は、あらゆる状況に最適ではありません。他の場所よりも魔法の弾丸はありませんが、このアプローチは、私と私のチームにとって単純で非常に機能的です。それが少なくともあなたが考えているものだと思ってください。

+0

これらはクエリーストリング変数ではありません。 http:/ server/name/of-montreal のURLのURLを作成しています。このURLスラッグ「of-montreal」を「OfMontréal」という値で自動的に生成します。 翻訳がうまくいかない場合は、常に手動で上書きされます。 –

+0

それから、あなたは間違いなく他の人の提案を見ています。これらを一度生成してデータベースに保存することができます。これはさらに優れています。リアルタイムでエンコード/デコードすることは効率が悪いです。 – x4000

関連する問題