2016-05-20 6 views
5

ich einen PHP-Skript entwickelt, die zu einem allgegenwärtigen Datenbanksystem verbinden sollen:Wie setze ich die Codierung für pervasive Datenbank über ODBC in PHP?

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

Wenn ich eine Abfrage ausführen, die zurückgegebenen Daten ist nicht UTF8. mb_detect_encoding sagt mir, die Codierung ist ASCII. Ich habe versucht, die Daten über zu konvertieren, aber es funktioniert nicht. Also habe ich so etwas versucht, um die Kodierung nach dem verbundenen Skript zu ändern:

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

Aber nichts hilft! Kann mir jemand helfen? Vielen Dank.

------------------------------ bearbeiten --------------- ----------------

hier ist die komplette Skript, weil bisher nichts funktioniert:

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"])); 

    } 

} 

der Server-Log sagt der folgende Städte:

--- 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 steht für á, aber es sollte ß sein (deutsches Zeichen)

\ xe1 für einen Stand, aber es sollte ß (Deutsch Zeichen)

Antwort

3

Ihre Datenbank in ASCII verlängert wird, nicht "Just ASCII"

Der Schlüssel liegt hier:

% E1 steht für á, aber es sollte ß sein (deutsches Zeichen)

% E1, oder 225 der Einfachheit halber, steht für á in UTF8,. Im erweiterten ASCII ist das ß. Halte alt und tippe 225, du bekommst ein ß.

Wenn die aus Ihrer Frage finden Sie in der Tat richtig:

Wenn ich eine Abfrage, die zurückgegebenen Daten ausführen nicht UTF8 ist.

Weil die Daten nicht in UTF8 sind.

In Ihrer Datenbank haben Sie erweiterte ASCII-Zeichen. Reguläres ASCII ist eine Teilmenge von UTF8, die bis zu einem Zeichen bei 128 steht, nicht erweitert.

Wenn Sie dies versucht haben, wird es nicht funktionieren;

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

Sie können versuchen, diese erste, weil es das am wenigsten invasive, sieht aus wie mysql CP850 unterstützt, so können Sie dies am Anfang des Skripts versuchen:

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

Dies könnte funktionieren, wenn Ihr Original Behauptung ist richtig:

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

oder diese, meine erste Vermutung, dass Ihre Datenbank ist in Latin-1:

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

IBM CP850 hat alle druckbaren Zeichen, die ISO-8859-1 (latin-1) hat, nur dass ß bei 223 in ISO-8859-1 ist.

Sie die Position von ß auf dieser Seite in der Tabelle sehen: https://en.wikipedia.org/wiki/Western_Latin_character_sets_%28computing%29

Als ein direkter Ersatz zu Ihrem vorhandenen Code, in Ihrer Frage, ob dies funktioniert:

$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"])); 

Dies funktioniert, wenn Ihre gesamte Datenbank dieselbe Kodierung hat.

Wenn Ihre Datenbank nicht konsistent an einer Kodierung festhält, ist es möglich, dass keine einzige Antwort völlig richtig ist. Wenn das der Fall ist, können Sie auch die Antwort versuchen hier, aber mit einer anderen Kodierung:

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'); 
} 

habe ich wirklich richtige Antwort ist, wenn Sie können, Einsatz die Daten in UTF8 korrekt , also hast du keine Probleme wie diese. Natürlich ist das nicht immer möglich.

Referenz:

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

+0

vielen dank! Schließlich habe ich folgendes geändert und es funktioniert: $ connection_string = "Treiber = {Pervasive ODBC-Client-Schnittstelle}; ServerName = 127.0.0.1; dbq = @ test; Client_CSet = UTF-8; Server_CSet = CP850"; und iconv ("CP850", "UTF-8", $ row ["Feld"]) –

0

1 try wissen

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

lassen Sie mich, wenn es funktioniert .. ich versuche zu helfen. Vor etwas hatte ein similuar Problem :)

1

Vergewissern Sie sich, dass Ihre Datenbank charset utf8 ist

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

dies möglicherweise encoding

2

Versuchen helfen Hinzufügen Client_CSet=UTF-8 zu Ihrem Verbindungszeichenfolge

+0

es nicht für mich funktioniert, so dass ich das ganze Skript auf meine Frage hinzugefügt - Sie haben eine Idee? –

+0

Es gibt eine passende Option "Server_CSet", die möglicherweise erforderlich ist. Ermöglicht Ihnen, sowohl die Server- als auch die Clientcodierung anzugeben, um die Sortierung zu erleichtern. – DonBoitnott

+0

ich habe meine frage mit ihren änderungen und den ergebnissen aktualisiert - das ist sehr nervig, ich habe fast alles versucht, was möglich ist. Es wäre toll, wenn Sie eine andere Idee haben :) –

2

Wenn Sie wissen, die Codierung auf dem Server versuchen, dies zu Verbindungszeichenfolge hinzufügen,

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

dies versuchen ..

<? 
# 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); 
?> 
Verwandte Themen