2010-12-04 12 views
1

"Percepço"のようにアクセント付き文字で関数にURLを入れようとすると、 "Percep%C3%A7%C3%A3o"が出力されます。正しく動作します。しかし、 "Percep%e7%e3o"は、それがすべき方法で動作します。アクセント付き文字に関するUri.EscapeUriString()の問題

String Result = Uri.EscapeUriString("Percepção"); 

ありがとうございます。

答えて

2

私はASCIIに元の文字列を符号化することによって、この問題を修正最初のバイト、再びUTF8にそれをコードします。

String Result = Uri.EscapeUriString(Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("Percepção"))); 

いくつかの詳細については、binarycoderに感謝します。

+0

'Uri.EscapeUriString()'は '&'や '='や '?'、RFC予約文字をエスケープしないことに注意してください。つまり、クエリパラメータにこれらの文字が含まれていると、URLが破られることになります。だから、 'Uri.EscapeDataString()'が使用する方法です。 –

7

文字列は、最初にUTF-8としてエンコードされ、バイトはリテラル文字またはパーセントエンコードされたシーケンスに変換されます。

新しいURIスキームは、からなるテキストデータを表すコンポーネントを定義する場合:標準が状態RFC3986、ある

Console.WriteLine(BitConverter.ToString(Encoding.UTF8.GetBytes("Percepção"))); 
// 50-65-72-63-65-70-C3-A7-C3-A3-6F 

これはにEscapeUriStringの結果を比較することによって見ることができますユニバーサルキャラクタセット[UCS]の文字のうち、データは最初にUTF-8文字エンコーディング[STD63]に従ってオクテットとしてエンコードされる必要があります。予約されていないセットの文字に対応していないオクテットだけがパーセントエンコードされている必要があります。

(余談として、Uri.EscapeDataStringはしばしばUri.EscapeUriStringを使用するより適切であることに注意してください。)

+0

感謝を取得します

MsgBox(UriEncode("Percepção")) 

。私はこの問題を解決しました。この質問に対する私の答えを見てください。 – Codecat

+1

Uri.EscapeDataStringを使用しますか?これは、次のような行為は避けてください:http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding。 aspx –

+0

@GordonThompsonその記事では、 'EscapeDataString()'ではなく '* Unescape * DataString()'を使わないと言っています。実際、記事の終わり近くでは、HttpUtility.UrlEncode()の代わりに 'EscapeDataString()'を使うことをお勧めします。 –

-1
if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) { 
    param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();      
} 

GOOD SOLUTION !!

+4

あなたの答えをここで明確にできますか? – tnw

+0

これは私の元の質問とどのように関連しているのか分かりません。 – Codecat

0

私はそれを動作させる最後の方法です。あなたが起動している場合、この機能に

Function UriEncode(ByVal cText As String) As String 
     Dim cRes As String = "" 
     For Each iBy As Byte In Encoding.GetEncoding(1252).GetBytes(cText) 
     Select Case iBy 
      Case Asc("%") 
       cRes &= "%25" 
      Case Asc(" ") 
       cRes &= "+" 
      Case Is > 127 
       cRes &= "%" & Hex(iBy) 
      Case Else 
       cRes &= Convert.ToChar(iBy) 
     End Select 
     Next 
     Return cRes 
    End Function 

を使用してください:あなたはこの回答のため

Percep%E7%E3o 
関連する問題