2014-05-11 18 views
6

Ho questo frammento di codice nel mio file cshtml:NancyFx: impostare set di caratteri di default utf8

Expires on: @Model.EndDate.ToString("MMM dd yyyy") 

E ottengo questo nella risposta:

HTTP/1.1 200 OK 
Content-Type: text/html 

... 
Expires on: ׳�׳�׳™ 05 2013 

Come faccio a dire a Nancy da usare UTF8 da impostazione predefinita per le risposte?


Edit: Per chiarire, questo non è un problema di localizzazione, l'uscita è già localizzato - è solo che la stringa UTF8 localizzata viene inviato al client senza dichiarazione UTF8 charset, quindi diventa mucked nel tentativo di trattarlo come latin1.

Quello che sto cercando è questo:

HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8 

... 

e mi piacerebbe non dover specificare per ogni risposta individualmente.

Sto usando il NancyFx framework web

+0

Qual è l'output desiderato? Ad esempio è '2013 05 aprile'? O vuoi un nome di mese localizzato? – Kamyar

+0

La data è localizzata, ma la stringa localizzata viene persa nella codifica. Quindi la risposta è: "Voglio un nome di mese localizzato". –

+0

Hai provato a specificare la cultura? Ad esempio: @ Model.EndDate.ToString ("ddd d MMM", CultureInfo.CreateSpecificCulture ("ar-SA")) – Kamyar

risposta

8

Se si desidera specificare dichiarazione UTF8 charset nella risposta del modulo, è possibile definire un After interceptor. Ecco come è possibile definire un Dopo Interceptor nel costruttore del modulo:

After += ctx => 
{ 
    ... 
} 

È anche possibile definire hook a livello di applicazione nel vostro programma di avvio automatico:

pipelines.AfterRequest += (ctx) => { ... }; 

Aggiornamento: Sulla base delle osservazioni, migliore approccio sarebbe utilizzare il seguente codice nel gancio:

if (ctx.Response.ContentType == "text/html") 
    ctx.Response.ContentType = "text/html; charset=utf-8"; 
+0

Mi aspettavo che Nancy avesse qualcosa di più dedicato, ma questo risolve il problema. :-) –

+0

In realtà questo non funziona ... il valore impostato su 'Response' in qualsiasi intercettore dopo viene ignorato. Se inserisci il codice sopra in "NegotiationContext", allora funziona, ma elimina le richieste json perché viene chiamato prima che il renderer della vista Json abbia la possibilità di impostare il tipo di contenuto. In altre parole, la prima parte di if non verrà mai chiamata. Quindi la ricerca della risposta corretta continua, ho paura ...: - \ –

+2

OK l'approccio corretto è usare 'Response.ContentType'. Poiché sembra che solo HtmlResponse non gestisca il charset, è sicuro limitarlo a: 'if (ctx.Response.ContentType ==" text/html ") ctx.Response.ContentType =" text/html; charset = utf8 ";'. Se modifichi la risposta, la accetto :-) –

Problemi correlati