我开发了一个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代表á,但应为ß(德语字符)
您的数据库使用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);
或者,这是我的最初直觉,即您的数据库位于latin-1中:
iconv("CP850", "UTF-8", $string);
IBM CP850具有ISO-8859-1(latin-1)具有的所有可打印字符,只是ß在ISO-8859-1中为223。
您可以在此页的表中看到ß的位置: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"]));
如果您的整个数据库使用相同的编码,则此方法有效。
如果您的数据库未始终遵循一种编码,则可能没有一个答案是完全正确的。如果是这种情况,您也可以在这里尝试答案,但是使用不同的编码:
// 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中正确插入数据,这样就不会出现这样的问题。当然,这并不总是可能的。
参考:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句