Domanda

Ho uno script php che accede a un database MSSQL2005, legge alcuni dati da esso e invia i risultati in una mail.

Esistono caratteri speciali sia nei nomi di alcune colonne che nei campi stessi.

Quando accedo allo script tramite il mio browser (webserver iis), la query viene eseguita correttamente e il contenuto della posta viene codificato correttamente (per il mio pubblico). Tuttavia, quando eseguo php dalla console, la query non riesce (a causa dei caratteri speciali nei nomi delle colonne). Se sostituisco i caratteri speciali nella query con le chiamate a chr () e il codice carattere in latino-1, la query viene eseguita correttamente, ma i risultati vengono anche codificati in latino-1 e quindi non vengono visualizzati correttamente nella posta. Perché PHP / il driver MSSQL / & # 8230; stai usando una codifica diversa nei due scenari? C'è un modo per aggirarlo?

Se ti chiedi, ho bisogno della console perché voglio pianificare lo script usando SQLAgent (o taskmanager o altro).

È stato utile?

Soluzione

A seconda del tipo di caratteri che hai nel tuo database, potrebbe essere una limitazione della console immagino. Se digiti chcp nella console, vedrai qual è la tabella codici attiva, che potrebbe essere simile a CP437 noto anche come ASCII esteso. Se hai caratteri fuori da questa tabella codici, come in UTF8, potresti riscontrare problemi. Puoi modificare la tabella codici attiva corrente digitando chcp 65001 per passare a UTF8.

Potresti anche voler cambiare il carattere Raster predefinito in Lucida Console a seconda dei caratteri richiesti poiché non tutti i caratteri supportano caratteri estesi (fai clic con il tasto destro sul titolo, proprietà, carattere della finestra del prompt dei comandi).

Come già detto, il supporto unicode di PHP non è l'ideale, ma puoi farcela in PHP5 con qualche chiamata di funzione ben posizionata di utf8_decode . Il segreto della codifica dei caratteri è capire bene qual è la codifica corrente di tutti gli strumenti che stai utilizzando: database, connessione al database, byte correnti nella tua variabile PHP, output sulla schermata della console, email codifica del corpo, il tuo client di posta elettronica e così via ...

Per tutto ciò che ha caratteri speciali, nei nostri giorni moderni, qualcosa come UTF8 è spesso raccomandato. Assicurati che tutto il percorso sia impostato su UTF8 e converti solo dove necessario.

Altri suggerimenti

Lo scarso supporto di PHP per il mondo non inglese è ben noto. Non ho mai usato un database con caratteri al di fuori del regno ASCII di base, ma ovviamente hai già un lavoro in giro e sembra che devi solo conviverci.

Se volessi fare un passo ulteriore, potresti: 1. Scrivere un array che contenga tutti i caratteri speciali e i loro equivalenti CHR 2. foreach l'array e str_replace sulla query

Ma se la query è hardcoded, suppongo che quello che hai va bene. Inoltre, assicurati di utilizzare l'ultimo PHP, almeno 4.4.x, c'è sempre un cambiamento che è stato risolto ma ho scremato le note di rilascio 4.x.x e non vedo nulla che riguardi il tuo problema.

La cosa da ricordare delle stringhe PHP è che sono flussi di byte. Se vuoi ottenere i dati nel set di caratteri corretto (per qualunque cosa tu stia facendo), devi farlo esplicitamente attraverso un qualche tipo di funzione o filtro. È tutto piuttosto di basso livello.

A seconda della configurazione, potresti dover conoscere il set di caratteri interno delle stringhe nel database, ma almeno devi sapere quale set di caratteri il database sta inviando a PHP (perché, ricorda, a PHP è solo un flusso di byte).

Quindi devi conoscere il set di caratteri di destinazione (e possibilmente specificarlo, cosa che dovresti davvero comunque). Ad esempio, supponiamo che stai ricevendo utf-8 dal database, ma desideri inviare un latino-1 (e quindi base64 o q-stampabile codificato come 'codifica trasferimento contenuto'):

$send_string = base64_encode(utf8_decode($database_string));

Ovviamente in questo caso, dovresti sapere che tutti i caratteri utf-8 esistono nel set di caratteri latino-1 e probabilmente non vorrai davvero base64 (purtroppo PHP non ha un buon q- funzione di codifica stampabile, anche se curiosamente, lo fa per la decodifica), e se non stai parlando di utf-8 < = > latin-1 ti consigliamo di estrarre invece le funzioni mbstring.

Per quanto riguarda la console, dovresti sapere cosa sta ottenendo PHP quando stai digitando caratteri speciali dalla console, che probabilmente dipende dalle impostazioni della shell e / o PHP. Ma ricorda che PHP capisce solo le stringhe come byte byte byte e dovresti essere in grado di risolverlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top