2014-11-06 17 views
11

System.Web'den HttpUtility kullanıldığında, yöntemi her aradığımda buluyorum .ParseQueryString Unicode eşdeğer temsilcilerine kodlayan özel karakterler yaşıyorum. Birçok farklı kodlama türüyle çalıştım ve hepsi aynı sonucu veriyor gibi görünüyor. Benim kodun bir örneği buradadır:HttpUtility.ParseQueryString() her zaman unicode için özel karakterleri kodlar

string text = "ich möchte diese Bild für andere freigeben" 
var urlBuilder = new UriBuilder(url); 
var query = HttpUtility.ParseQueryString(urlBuilder.Query, Encoding.UTF8); 
query["text"] = text;  
urlBuilder.Query = query.ToString(); 
string finalUrl = urlBuilder.ToString(); 

Ve olacağını bundan cekti ararken finalUrl dize:

text = ich + m% u00f6chte + diese + Bild + f% u00fcr + andere + freigeben Ben Encoding.UTF8, ve Encoding.Default ve hepsi aynı sonucu üretmek kullanarak denedi

. Ben URLencoding benim istenen biçimi ulaşmak için ne yapabilirim:

metin = ich% 20m% C3% B6chte% 20diese% 20Bild% 20f% C3% BCR% 20andere% 20freigeben

Her zaman olduğu gibi Yardım/öneri için şimdiden teşekkür ederiz!

+0

Ne önerirsiniz? – tezromania

+0

Bir yan not olarak, bunları kodlanmamış olarak göstermek isteyebilirsiniz, ancak URL belirtimi bunların açıkça kodlanması gerektiğini gösterir. https://www.ietf.org/rfc/rfc1738.txt (sayfa 2 işaretleyici etrafında) – Nathan

+0

Ben onları kodlamak istemiyorum değil, ben onun unicode kodlama vs standart URL kodlama olarak göstermek istiyorum. – tezromania

cevap

1

ParseQueryString'e aşina değilim, ancak düzgün biçimlendirilmiş bir sorguyu ad değeri çiftlerine dönüştürmek için belgeden görünüyor. Gönderinizden tersi yapmaya çalıştığınız görünüyor: veri çiftlerini düzgün biçimlendirilmiş bir sorguya dönüştürün.

urlBuilder.Query = query.ToString(); 

HttpUtility.ParseQueryString bir NameValueCollection döndürür ama aslında HttpValueCollection adlandırılan dahili sınıftır: Bunun yerine

string text = "ich möchte diese Bild für andere freigeben" 
var urlBuilder = new UriBuilder(url); 
String query = "text=" + HttpUtility.UrlEncode(text); 
urlBuilder.Query = query; 
string finalUrl = urlBuilder.ToString(); 
13

HttpUtility.UrlEncode sorunu kullanarak deneyebilirsiniz içindedir. Bu sınıf, ToString() yönteminin geçersiz kılınmasına sahiptir. Kodlanmış bir sorgu dizesi oluşturur, ancak URL kodlaması için HttpUtility.UrlEncodeUnicode (tinyurl.com/HttpValue) kullanır. Bu% uXXXX değerleriyle sonuçlanır.

URL kodlama farklı türde bir gerekiyorsa HttpUtility.ParseQueryString önlemek veya ToString() sonucunu çözmek ve sonradan kodlamak isteyebilirsiniz:

urlBuilder.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString())); 
5

Bu soru oldukça eski, ama iken ben sadece karşıya geldi Bu problemi araştırmak ve geçerli bir cevap eksik olduğunu fark etti.

düzeltme web.config basitçe aşağıdaki ayarı eklemek (test edilmiş ve .NET 4.5 çalışır) içinde, oldukça basittir:

<appSettings> 
    <add key="aspnet:DontUsePercentUUrlEncoding" value="true" /> 
</appSettings> 

NET belirli karakterleri kodlar ne kadar doğru kontrollere Bu değerin URL. Özellikle ä, ë, ö gibi karakterler. Sanırım bunun nedeni, bu karakterlerin kodlanmasının birkaç yolu vardır. Bu genellikle, aşağıdaki karakterin bir gösterime sahip olduğunu belirten %C3 öneki ile ilgilidir (bu şekilde çalıştığından eminim).

HttpUtility.ParseQueryString yolu, varsayılan olarak farklıdır. Karakteri, gerçek yüzde kodlanmış unicode karakteri %u00f6 olarak kodlar. Bu, bazı sorunlara neden olabilir, çünkü bu, içinde bile varsayılan değil.NET'in kendisi, HttpUtility.UrlEncode örneğin %C3%B6 kodlayacaktır. Yukarıdaki ayarı değiştirmek, her iki yöntemin de benzer sonuçları döndürmesini sağlayacaktır.

İlgili konular