2012-08-24 20 views
7

Attualmente sto lavorando a un'applicazione che estrae dati JSON dall'API della comunità Blizzard e la analizza con PHP. Tutto funziona bene finché non arrivo a un personaggio con un personaggio speciale nel loro nome.Caratteri speciali e riscrittura URL

Al fine di estrarre i dati dei personaggi, ho bisogno di conoscere il nome e il regno dei loro personaggi.

Ho il nome e il reame che sono passati attraverso l'URL alla pagina dei caratteri, e da lì usando queste informazioni per estrarre i dati dei personaggi.

A questo punto i miei URL sono in questo modo:

http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu 

A questo punto se provo a tirare i dati per un personaggio con un accento vengo reindirizzato alla mia pagina di errore perché non è una valida carattere.

Non è stato fino a quando ho iniziato la riscrittura dell'URL che ho scoperto il mio problema. Sono stato reindirizzato alla mia pagina di errore perché da qualche parte lungo la linea i personaggi speciali sono stati sostituiti per alcuni personaggi davvero stupidi.

Con i miei nuovi URL riscritti follow funziona:

http://localhost/guildtree/argent-dawn/ankzu 

Tuttavia, un personaggio con un carattere speciale nei loro risultati di nome in un messaggio di errore.

http://localhost/guildtree/argent-dawn/notúk 

risultati del seguente messaggio di errore:

"Not Found

L'URL richiesto/guildtree/argent-alba/notúk non è stato trovato su questo server"

Come si può vedere la ú viene sostituito  °, ma quando ho copiare e incollare l'URL del ú appare come% C3% BA

E 'la mia comprensione che il motivo per cui la ú sta comparendo come º è perché l'unicode a due byte ú viene squished in due caratteri ASCII di un byte risultanti nella visualizzazione di º.

ho assicurato che tutte le mie pagine hanno la seguente nell'intestazione:

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

Al fine per la mia applicazione per funzionare correttamente ho bisogno di quei caratteri speciali per visualizzare correttamente, quindi ho bisogno la u per visualizzare in realtà come ú, non appare come ú ma in realtà è º o% C3% BA.

Il nome caratteri viene tirato dalla URL semplicemente come:

$charName = $_GET['name']; 

E 'possibile codificare $ charName per visualizzare i caratteri speciali in modo corretto?

Ho provato tutto quello che riesco a pensare e ho cercato su Google ma non ha funzionato.

Inoltre, poiché sto utilizzando la riscrittura degli URL, quale sarebbe la regola di riscrittura per consentire questi caratteri speciali?

Ecco il mio attuale regola di riscrittura:

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC] 

Sono consapevole del fatto che ([a-zA-Z] +) non consente a tutti per i caratteri speciali, ho attualmente lavorato su come ottenere il caratteri speciali da visualizzare correttamente. Se uso ([a-zA-Z \ ú] +) funzionerà e visualizzerà la pagina in quanto deve essere visualizzata. L'aggiunta di \ ú alla regola sembra un modo molto povero per farlo e non sempre funziona mentre si utilizza il carattere corrispondente per i caratteri accentati.

Qualsiasi aiuto sarebbe molto apprezzato. Se avete bisogno di ulteriori informazioni si prega di chiedere.

Edit:

cambiare la mia regola di riscrittura al di sotto permette per le informazioni di essere tirato bene, ma crea un loop di reindirizzamento per il mio CSS.

RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$  characters.php?realm=$1&name=$2 [NC] 

Per esempio il mio CSS che viene reindirizzato a

http://localhost/guildtree/css/error 

invece di

http://localhost/guildtree/css/style2.css 

Aggiornamento:

Attraverso alcuni semplici test:

$charName = $_GET['name']; 
$charNameTEST = utf8_encode($charName); 

farà il cambiamento, ma quando applico questo alla mia pagina si tratta ancora in piedi dicendo:

"Not Found

L'URL richiesto non è stato trovato su questo server/guildtree/argent-alba/notúk ".

Penso che il problema principale ora è con il reindirizzamento dell'URL, perché i dati JSON possono essere analizzati perfettamente bene quando ha i caratteri accentati. Semplicemente non capisco perché continua a mostrarmi che è su guildtree/argent-dawn/notúk nella barra del browser, ma continua a cercare di tirare su/guildtree/argent-dawn/notõk.

risposta

3

ú non è un carattere valido per un URL.

Ovunque si colleghi il nome utente, è necessario codificarlo tramite URL.

qui l'URL corretto per indicare è:

http://localhost/guildtree/argent-dawn/not%C3%BAk 

Si consiglia di stampare in php come:

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>; 
+0

E quando qualcuno inserisce direttamente l'URL? – akari

+0

Si potrebbe anche voler considerare ASCIIfying i nomi utente. 'esempio.com/guildtree/argent-dawn/notuk /' invece di 'example.com/guildtree/argent-dawn/not% C3% BAk'. I tuoi utenti probabilmente lo troveranno più facile. –

+0

example.com/guildtree/argent-dawn/notuk e example.com/guildtree/argent-dawn/notúk potrebbero utilizzare due set di dati completamente diversi, ma il nome del personaggio deve essere esatto. – akari

2

penso this question potrebbe avere la risposta. Ho non provato io stesso, ma da quello che posso vedere, avresti bisogno di riscrivere il RewriteRule come:

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC,B] 

Il B bandiera garantirà che i caratteri speciali sono URL sfuggito, in modo che il il valore visto per nome in $ 2 sarebbe codificato per cento. Dato che non stai eseguendo un reindirizzamento, il carattere unicode originale dovrebbe essere ancora ciò che viene visualizzato nell'URL.

Avrete anche bisogno di alcune modifiche alla regex per assicurarsi che corrisponda ai caratteri Unicode. Non sono sicuro di cosa sarebbero.

C'è anche qualche altra descrizione di come unicode characters work in URLs over here.

+0

L'ho legato, ma sta creando un errore interno del server. Modifica: ha avuto un refuso, nessun errore interno ora, ma ancora non funziona. – akari

2

Per fare in modo che funzioni correttamente è necessario fare due cose.

In primo luogo aggiungere questo al tuo .htaccess

AddDefaultCharset On 
AddDefaultCharset UTF-8 
AddCharset UTF-8 .tpl 
AddCharset UTF-8 .js 
AddCharset UTF-8 .css 
AddCharset UTF-8 .php 

cambiano secondo la parte della vostra regola di riscrittura che ha bisogno di consentire i caratteri speciali a questo modo (*.):

RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$  characters.php?realm=$1&name=$2  [NC] 

Questa volontà causa alcuni loop di reindirizzamento per altre pagine, ma sto lavorando per risolverlo al momento.