2009-08-05 18 views
12

Sul sito web che sto cercando di aiutare con, l'utente può digitare un URL nel browser, come seguenti caratteri cinesi,Handling codifica dei caratteri in URI su Tomcat

http://localhost:8080?a=测试 

Nel server, otteniamo

GET /a=%E6%B5%8B%E8%AF%95 HTTP/1.1 

Come si può vedere, è codificato in UTF-8, quindi codificato con URL. Possiamo gestirlo correttamente impostando la codifica su UTF-8 in Tomcat.

Tuttavia, a volte ci si arriva Latin1 codifica su alcuni browser,

http://localhost:8080?a=ß 

si trasforma in

GET /a=%DF HTTP/1.1 

è comunque di gestire questo correttamente in Tomcat? Sembra che il server debba fare qualche congettura intelligente. Non ci aspettiamo di gestire correttamente il Latin1 al 100%, ma tutto è meglio di quello che stiamo facendo ora assumendo che tutto sia UTF-8.

Il server è Tomcat 5.5. I browser supportati sono IE 6+, Firefox 2+ e Safari su iPhone.

+0

possibile duplicato di [Rileva automaticamente la codifica URI in Tomcat] (http://stackoverflow.com/questions/2657515/detect-the-uri-encoding-automatically-in-tomcat) – Ryan

risposta

5

Sfortunatamente, la codifica UTF-8 è un "dovrebbe" nello URI specification, che sembra presupporre che il server di origine genererà tutti gli URL in modo tale che siano significativi per il server di destinazione.

Ci sono un paio di tecniche che vorrei prendere in considerazione; tutti implicano l'analisi della stringa di query da soli (sebbene tu possa sapere meglio di me se l'impostazione della codifica della richiesta influisce sulla stringa della query sulla mappatura dei parametri o solo sul corpo).

Innanzitutto, esaminare la stringa di query per singoli "byte alti": una sequenza UTF-8 valida deve avere due o più byte (lo Wikipedia entry ha una bella tabella di byte validi e non validi).

Meno affidabile sarebbe guardare l'intestazione "Accept-Charset" nella richiesta. Non penso che questa intestazione sia richiesta (non ho guardato le specifiche HTTP per verificare), e so che Firefox, almeno, invierà un intero elenco di valori accettabili. Scegliere il primo valore nell'elenco potrebbe funzionare, oppure no.

Infine, hai fatto qualche analisi sui log, per vedere se un particolare user-agent utilizzerà costantemente questa codifica?

Problemi correlati