【问题标题】:How to set encoding for pervasive database via ODBC in PHP?如何在 PHP 中通过 ODBC 为普遍数据库设置编码?
【发布时间】:2016-09-17 17:27:36
【问题描述】:

我开发了一个 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 代表á,但应该是ß(德语字符)

【问题讨论】:

    标签: php encoding pervasive


    【解决方案1】:

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

    让我知道它是否有效.. 我会尽力提供帮助。不久前有一个类似的问题:)

    【讨论】:

      【解决方案2】:

      确保您的数据库字符集是 utf8

      试试这个
      $connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;dbq=@test;charset=UTF-8";

      这可能会帮助你encoding

      【讨论】:

        【解决方案3】:

        尝试将Client_CSet=UTF-8 添加到您的连接字符串中。

        【讨论】:

        • 它对我不起作用,所以我将整个脚本添加到我的问题中 - 你有什么想法吗?
        • 可能需要匹配的Server_CSet 选项。允许您指定服务器和客户端编码以方便排序。
        • 我已经用您的更改和结果再次更新了我的问题 - 这很烦人,我几乎尝试了所有可能的方法。如果您有其他想法,那就太好了:)
        • 我开始怀疑数据库编码不是你想象的那样。打开 PCC,右键单击数据库,单击属性。在代码页中,单击Change connection encoding 链接。在弹出窗口中,PCC connection encoding 下拉菜单显示什么?
        【解决方案4】:

        如果您知道服务器上的编码,请尝试将其添加到您的连接字符串中,

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

        【讨论】:

          【解决方案5】:

          您的数据库是 ASCII 扩展的,而不是“只是 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"])); 
          

          如果您的整个数据库采用相同的编码,这将起作用。

          如果您的数据库没有始终遵循一种编码,则可能没有一个答案是完全正确的。如果是这种情况,您也可以在这里尝试答案,但使用不同的编码:

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

          我真正正确的答案是,如果可以的话,插入 UTF8 格式的数据正确,所以你不会有这样的问题。当然,这并不总是可能的。

          参考:

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

          【讨论】:

          • 非常感谢!最后我更改了以下内容,它可以工作: $connection_string = "Driver={Pervasive ODBC Client Interface};ServerName=127.0.0.1;dbq=@test;Client_CSet=UTF-8;Server_CSet=CP850";和 iconv("CP850", "UTF-8",$row["field"])
          猜你喜欢
          • 1970-01-01
          • 2018-03-28
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多