2009-09-21 12 views
10

Abbiamo un sito Web che utilizza ASP classico.Sostituzione di testo ASP classica e codifica UTF-8

Parte del nostro processo di rilascio sostituisce i valori in un file e abbiamo trovato un bug in esso in cui scriverà il file come UTF-8.

In questo modo la nostra applicazione inizia a sputare fuori spazzatura. Gli apostrofi vengono restituiti come caratteri codificati.

Se andiamo a rimuovere il BOM che dice che questo file è UTF-8, il testo precedentemente reso come garbage è ora visualizzato correttamente.

C'è qualcosa che IIS fa in modo diverso quando incontra un file UTF-8?

+0

Se la rimozione della UTF-8 BOM fa sì che la pagina per rendere correttamente allora il contenuto non è UTF-8 no? – AnthonyWJones

risposta

6

UTF-8 non utilizza BOM; è una fastidiosa disfunzione in alcuni software Microsoft che li mette lì. Devi trovare quale fase del processo di rilascio sta inserendo un BOM codificato in UTF-8 nei tuoi file e risolverlo: dovresti smettere di farlo anche se il tuo è utilizzando UTF-8, che in realtà in questi giorni è il migliore.

Ma dubito che sia IIS a causare il problema di visualizzazione. Più probabilmente il browser sta indovinando il set di caratteri della pagina finale visualizzata, e quando vede byte che sembrano codificati in UTF-8 indovina l'intera pagina è UTF-8. Si dovrebbe essere in grado di fermarlo farlo affermando un set di caratteri definitiva utilizzando un header HTTP:

Content-Type: text/html;charset=iso-8859-1 

e/o di un elemento meta nel codice HTML

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> 

Ora (supponendo ISO-8859- 1 è in realtà il set di caratteri in cui i dati sono inseriti) dovrebbe mostrare OK. Tuttavia, se il tuo file ha realmente un BOM con codifica UTF-8 all'inizio, ora lo vedrai come 'ï »¿' nella tua pagina, che è come appaiono questi byte in ISO-8859-1. Quindi hai ancora bisogno di sbarazzarti di quel misBOM.

+0

Questo ha senso. In realtà era un bug in un codice che è stato scritto appositamente per gestire questo tipo di problema. Grazie. –

+1

Devo ammettere che questa risposta mi confonde."UTF-8 non usa le distinte materiali" potresti eloborare? In che modo si tratta di una "disfunzione"? Non ho mai riscontrato un problema con i file UTF-8 che includono questo carattere di spazio a larghezza zero, quali problemi hai riscontrato? – AnthonyWJones

+0

Qualsiasi strumento di testo basato su byte (come shell, caricatori di file di configurazione ecc.) Cadrà immediatamente quando viene presentato con "ï" ¿"all'inizio di un file; è l'obiettivo esplicito di UTF-8 di essere compatibile con strumenti che non conoscono nulla di Unicode, ma UTF-8 + BOM rompe questo. Persino alcuni strumenti compatibili con Unicode si incastreranno su di esso perché ci si aspetta che una distinta base sia presente e rimossa automaticamente dal processo di decodifica Unicode per UTF-16. UTF-8 + BOM interrompe le applicazioni e non vi è alcuna giustificazione per l'utilizzo nelle specifiche Unicode; e non vi è nemmeno alcun vantaggio in quanto UTF-8 non ha problemi di ordine dei byte. – bobince

13

ero alla ricerca sullo stesso argomento esatto ieri e mi sono imbattuto:

http://blog.inspired.no/utf-8-with-asp-71/

parte importante da quella pagina, nel caso in cui se ne va ...

CODICE

ASP:

Response.ContentType = "text/html" 
Response.AddHeader "Content-Type", "text/html;charset=UTF-8" 
Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

e il seguente tag META HTML:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 

Stavamo usando il meta tag e la proprietà asp di CharSet, ma la pagina non è stata ancora visualizzata correttamente. Dopo aver aggiunto le altre tre righe al file asp, tutto ha funzionato.

Spero che questo aiuti!

+1

Non hai bisogno sia del meta tag sia di 'Response.CharSet =" UTF-8 "' dato che entrambi hanno lo stesso scopo, personalmente preferisco usare 'Response.CharSet =" UTF-8 "' piuttosto che impostare esplicitamente è un meta tag in [tag: HTML]. Anche 'Response.AddHeader" Content-Type "," text/html; charset = UTF-8 "' è solo una forma esplicita di scrittura 'Response.ContentType =" text/html "' e 'Response.CharSet =" UTF- 8 "' quello che stai suggerendo è inutile, attenersi all'utilizzo di 'Response.ContentType' e' Response.CharSet'. – Lankymart

+0

Molto hepfull @Werewolf grazie per il tuo contributo .. – Artemination

+0

Mi salvi la vita :) – kyawagwin

2

Se si utilizza l'accesso db si dovrebbe scrivere

Session.CodePage=65001 
Set tabtable= Conn.Execute("SELECT * FROM table") 
Problemi correlati