2016-05-20 11 views
5

ho sviluppato uno script PHP che dovrebbe connettersi a un sistema di database pervasivo:Come impostare la codifica per il database pervasivo via ODBC in PHP?

$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;[email protected]"; 
$conn = odbc_connect($connection_string,"administrator","password"); 

Se eseguo una query, i dati di ritorno non è UTF8. mb_detect_encoding mi dice che la codifica è ASCII. Ho provato a convertire i dati tramite iconv, ma non funziona. Così ho provato qualcosa di simile a modificare la codifica dopo che lo script collegato:

odbc_exec($conn, "SET NAMES 'UTF8'"); 
odbc_exec($conn, "SET client_encoding='UTF-8'"); 

Ma niente aiuta! Qualcuno può aiutarmi? Grazie.

------------------------------ modifica --------------- ----------------

ecco lo script completo, perché non funziona niente finora:

class api { 

    function doRequest($Url){ 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $Url); 
     curl_setopt($ch, CURLOPT_REFERER, "http://www.example.org/yay.htm"); 
     curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0"); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8'); 
     $output = curl_exec($ch); 
     curl_close($ch); 
    } 

} 

$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;[email protected];Client_CSet=UTF-8;Server_CSet=UTF-8"; 
$conn = odbc_connect($connection_string,"administrator","xxx"); 

if ($conn) { 

    $sql = "SELECT field FROM table where primaryid = 102"; 
    $cols = odbc_exec($conn, $sql); 

    while($row = odbc_fetch_array($cols)) { 

     $api = new api(); 
     // --- 1 --- 
     $api->doRequest("http://example.de/api.html?value=" . @urlencode($row["field"])); 
     // --- 2 --- 
     $api->doRequest("http://example.de/api.html?value=" . $row["field"]); 
     // --- 3 --- 
     $api->doRequest("http://example.de/api.html?value=" . utf8_decode($row["field"])); 

    } 

} 

il log del server dice il follwing:

--- 1 --- [24/May/2016:14:05:07 +0200] "GET /api.html?value=Talstra%E1e+7++++++++++++++++++++++++++++++++++++++++++++++++ HTTP/1.1" 200 93 "http://www.example.org/yay.htm" "MozillaXYZ/1.0" 
--- 2 --- [24/May/2016:11:31:10 +0200] "GET /api.html?value=Talstra\xe1e 7             HTTP/1.1" 200 83 "http://www.example.org/yay.htm" "MozillaXYZ/1.0" 
--- 3 --- [24/May/2016:14:05:07 +0200] "GET /api.html?value=Talstra?e 7             HTTP/1.1" 200 93 "http://www.example.org/yay.htm" "MozillaXYZ/1.0" 

% E1 stand per una, ma dovrebbe essere SS (personaggio tedesco)

\ XE1 stand per una, ma dovrebbe essere ß (personaggio tedesco)

risposta

3

Il database è in ASCII esteso, non "solo ASCII"

L'indizio si trova qui:

% E1 sta per á, ma dovrebbe essere ß (carattere tedesco)

% E1 o 225 per semplicità, sta per in UTF8,. Nell'ASCII esteso è ß. Tieni premuto alt e digita 225, ottieni un ß.

Se la seguente dalla tua domanda è in realtà corretto:

Se eseguo una query, i dati di ritorno non è UTF8.

Poiché i dati non sono in UTF8.

Quello che hai nel tuo database è esteso caratteri ASCII. L'ASCII regolare è un sottoinsieme di UTF8, che non ha carattere esteso a 128 caratteri.

Se si è provato, non funzionerà;

iconv("ASCII", "UTF-8", $string); 

Si può provare questo primo, perché la sua la meno invasiva, si presenta come MySQL supporta cp850, in modo da poter provare questo nella parte superiore dello script:

odbc_exec($conn, "SET NAMES 'CP850'"); 
odbc_exec($conn, "SET client_encoding='CP850'"); 

Questo potrebbe funzionare, se la vostra asserzione originale è corretto:

iconv("CP437", "UTF-8", $string); 

o di questo, la mia impressione iniziale, che il database è in latin-1:

iconv("CP850", "UTF-8", $string); 

IBM CP850 ha tutti i caratteri stampabili che ISO-8859-1 (latin-1) ha, è solo che ß è a 223 in ISO-8859-1.

Si può vedere la posizione di ß nella tabella in questa pagina: https://en.wikipedia.org/wiki/Western_Latin_character_sets_%28computing%29

Come un rimpiazzo per il codice esistente, nella sua interrogazione, vedere se questo funziona:

$api->doRequest("http://example.de/api.html?value=" . $iconv("CP850", "UTF-8",$row["field"])); 
    // --- 2 --- 
    $api->doRequest("http://example.de/api.html?value=" . $iconv("CP850", "UTF-8",$row["field"])); 
    // --- 3 --- 
    $api->doRequest("http://example.de/api.html?value=" . $iconv("CP850", "UTF-8",$row["field"])); 

Funzionerà se l'intero database si trova nella stessa codifica.

Se il database non aderisce in modo coerente a una codifica, è possibile che nessuna risposta sia completamente corretta. Se questo è il caso, si può anche provare la risposta qui, ma con una diversa codifica:

Latin-1/UTF-8 encoding php

// If it's not already UTF-8, convert to it 
if (mb_detect_encoding($row["field"], 'utf-8', true) === false) { 
    $row["field"] = mb_convert_encoding($row["field"], 'utf-8', 'iso-8859-1'); 
} 

La mia vera risposta corretta è, se è possibile, inserto i dati in UTF8 correttamente , quindi non hai problemi come questo. Certo, non è sempre possibile.

Riferimento:

Force encode from US-ASCII to UTF-8 (iconv)

+0

grazie mille! Alla fine ho cambiato il seguente e funziona: $ connection_string = "Driver = {Pervasive Client Interface ODBC}; ServerName = 127.0.0.1; dbq = @ test; Client_CSet = UTF-8; Server_CSet = CP850"; e iconv ("CP850", "UTF-8", $ row ["campo"]) –

0

1 prova

$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;[email protected]; CharacterSet => UTF-8"; 
$conn = odbc_connect($connection_string,"administrator","password"); 

fatemi sapere se funziona .. cerco di dare una mano. ha avuto un problema similuar un po 'fa :)

1

Assicurarsi che il set di caratteri database è utf8

provare questo
$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;[email protected];charset=UTF-8";

questo può aiutare encoding

2

Prova ad aggiungere al vostro Client_CSet=UTF-8 stringa di connessione.

+0

non funziona per me, così ho aggiunto l'intero script alla mia domanda - Hai un'idea? –

+0

Esiste un'opzione corrispondente a 'Server_CSet' che potrebbe essere richiesta. Consente di specificare sia la codifica server e client per facilitare le regole di confronto. – DonBoitnott

+0

Ho aggiornato la mia domanda con le modifiche e i risultati ancora una volta - che è molto fastidioso, ho provato quasi tutto ciò che è possibile. Sarebbe bello se tu avessi un'altra idea :) –

2

Se si conosce la codifica sul server di cercare di aggiungere questo per la stringa di connessione,

Client_CSet=UTF-8;Server_CSet=SERVER_ENCODING // for example WINDOWS-1251 
0

provare questo ..

<? 
# connect to a DSN "mydb" with a user and password "marin" 
$connect = odbc_connect("mydb", "marin", "marin"); 


# query the users table for name and surname 
$query = "SELECT name, surname FROM users"; 



# perform the query 
$result = odbc_exec($connect, $query); 



# fetch the data from the database 
while(odbc_fetch_row($result)){ 
    $name = odbc_result($result, 1); 
    $surname = odbc_result($result, 2); 
    print("$name $surname\n"); 
} 



# close the connection 
odbc_close($connect); 
?>