Как установить кодировку для распространяемой базы данных через ODBC в PHP?

Я разработал скрипт PHP, который должен подключаться к распространяющейся системе баз данных:

$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;dbq=@test";
$conn = odbc_connect($connection_string,"administrator","password");

Если я выполню запрос, возвращаемые данные не будут UTF8. mb_detect_encoding говорит мне, кодировка ASCII. Я пытался преобразовать данные с помощью iconv, но это не работает. Поэтому я попытался что-то подобное изменить кодировку после подключения скрипта:

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

Но ничего не помогает! Может кто-нибудь мне помочь? Благодарю.

—————————— редактировать ——————————-

Вот полный сценарий, потому что пока ничего не работает:

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;dbq=@test;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"]));

}

}

Журнал сервера говорит следующее:

--- 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 обозначает á, но должно быть ß (немецкий символ)

\ xe1 означает á, но это должен быть ß (немецкий символ)

5

Решение

Ваша база данных находится в расширенном ASCII, а не «Just ASCII»

Ключ лежит здесь:

% E1 обозначает á, но должно быть ß (немецкий символ)

% E1, или 225 для простоты, обозначает UTF8,. В расширенной ASCII его ß. Удерживая Alt и наберите 225, вы получите ß.

Если следующее из вашего вопроса на самом деле правильно:

Если я выполню запрос, возвращаемые данные не будут UTF8.

Потому что данные не в UTF8.

В вашей базе данных есть расширенные символы ASCII. Обычный ASCII — это подмножество UTF8, которое до 128 символов, расширенное — нет.

Если вы попробовали это, это не сработает;

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

Сначала вы можете попробовать это, поскольку он наименее инвазивен, похоже, что MySQL поддерживает cp850, поэтому вы можете попробовать это в верхней части вашего скрипта:

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

Это может сработать, если ваше первоначальное утверждение верно:

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

или это, моя первая догадка, что ваша база данных находится в латинице-1:

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

В IBM CP850 есть все печатные символы, которые есть у ISO-8859-1 (латиница-1), просто ß находится в 223 в ISO-8859-1.

Вы можете увидеть положение ß в таблице на этой странице:
https://en.wikipedia.org/wiki/Western_Latin_character_sets_%28computing%29

В качестве вопроса о замене существующего кода, по вашему вопросу, посмотрите, работает ли это:

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

Это будет работать, если вся ваша база данных находится в одной кодировке.

Если ваша база данных не всегда соответствует одной кодировке, возможно, что ни один ответ не является полностью правильным. Если это так, вы также можете попробовать ответ здесь, но с другой кодировкой:

Latin-1 / UTF-8 кодировка 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');
}

Мой настоящий правильный ответ, если вы можете, вставить данные в UTF8 правильно, так что у вас нет таких проблем. Конечно, это не всегда возможно.

Ссылка:

Принудительное кодирование из US-ASCII в UTF-8 (iconv)

3

Другие решения

Попробуйте добавить Client_CSet=UTF-8 к вашей строке подключения.

2

Если вы знаете кодировку на сервере, попробуйте добавить это в строку подключения,

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

Убедитесь, что ваша кодировка базы данных utf8

попробуй это
$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;dbq=@test;charset=UTF-8";

это может помочь вам кодирование

1
$connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;dbq=@test;  CharacterSet => UTF-8";
$conn = odbc_connect($connection_string,"administrator","password");

дайте мне знать, если это работает .. я пытаюсь помочь. была похожая проблема немного назад 🙂

0

попробуй это ..

<?
# 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);
?>
0
По вопросам рекламы [email protected]