如何在PHP中通过ODBC设置普及数据库的编码?

托比亚斯(Tobias Bambullis)

我开发了一个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"])); 

如果您的整个数据库使用相同的编码,则此方法有效。

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

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java数据库ODBC中设置路径

来自分类Dev

如何在PHP中使用数据库中的数据设置更多按钮

来自分类Dev

如何通过ODBC从系统间缓存数据库中获取数据?

来自分类Dev

如何通过ODBC从系统间缓存数据库中获取数据?

来自分类Dev

如何通过 ODBC 使用参数更新数据库?

来自分类Dev

通过ODBC访问内存中的sqlite数据库

来自分类Dev

如何在Oracle中设置数据库链接?

来自分类Dev

如何在Codeigniter 3数据库中设置会话?

来自分类Dev

如何在Meteor.js中设置数据库?

来自分类Dev

如何在quarkus框架中设置sqlite数据库

来自分类Dev

如何在sqlite数据库中设置字段?

来自分类Dev

如何在PHP中建立数据库链接

来自分类Dev

如何在PHP中连接Oracle数据库

来自分类Dev

如何在PHP中管理嵌套的数据库事务?

来自分类Dev

PHP如何在数据库中插入NULL?

来自分类Dev

如何在PHP中获取基本的数据库信息

来自分类Dev

如何在PHP中动态选择Mongo数据库

来自分类Dev

如何在从数据库中检索到的编辑框中设置文本(使用php文件)

来自分类Dev

如何在从数据库中检索的编辑框中设置文本(使用php文件)

来自分类Dev

与普及数据库的连接速度很慢

来自分类Dev

如何在PDO类构造函数中为PHP PgSQL数据库设置UTF-8

来自分类Dev

如何在本地 Windows 7 中设置 adminer.php(如果数据库没有密码)

来自分类Dev

如何使用PHP从数据库编码UTF8

来自分类Dev

如何通过ODBC在Microsoft Access数据库中执行具有参数(即,PARAMETERS声明)的预定义查询?

来自分类Dev

如何在议程作业计划库中设置数据库配置身份验证?

来自分类Dev

如何通过在php mqsql中获取用户的输入来显示数据库中的数据?

来自分类Dev

如何使用我在 javascript 中通过 php 获得的数据库中的数据?

来自分类Dev

如果列包含 Laravel 中的 JSON 编码数据,我如何在数据库中搜索值

来自分类Dev

创建使用数据库优先模型后,如何在实体框架中设置由数据库在数据库中生成的ID密钥

Related 相关文章

  1. 1

    如何在Java数据库ODBC中设置路径

  2. 2

    如何在PHP中使用数据库中的数据设置更多按钮

  3. 3

    如何通过ODBC从系统间缓存数据库中获取数据?

  4. 4

    如何通过ODBC从系统间缓存数据库中获取数据?

  5. 5

    如何通过 ODBC 使用参数更新数据库?

  6. 6

    通过ODBC访问内存中的sqlite数据库

  7. 7

    如何在Oracle中设置数据库链接?

  8. 8

    如何在Codeigniter 3数据库中设置会话?

  9. 9

    如何在Meteor.js中设置数据库?

  10. 10

    如何在quarkus框架中设置sqlite数据库

  11. 11

    如何在sqlite数据库中设置字段?

  12. 12

    如何在PHP中建立数据库链接

  13. 13

    如何在PHP中连接Oracle数据库

  14. 14

    如何在PHP中管理嵌套的数据库事务?

  15. 15

    PHP如何在数据库中插入NULL?

  16. 16

    如何在PHP中获取基本的数据库信息

  17. 17

    如何在PHP中动态选择Mongo数据库

  18. 18

    如何在从数据库中检索到的编辑框中设置文本(使用php文件)

  19. 19

    如何在从数据库中检索的编辑框中设置文本(使用php文件)

  20. 20

    与普及数据库的连接速度很慢

  21. 21

    如何在PDO类构造函数中为PHP PgSQL数据库设置UTF-8

  22. 22

    如何在本地 Windows 7 中设置 adminer.php(如果数据库没有密码)

  23. 23

    如何使用PHP从数据库编码UTF8

  24. 24

    如何通过ODBC在Microsoft Access数据库中执行具有参数(即,PARAMETERS声明)的预定义查询?

  25. 25

    如何在议程作业计划库中设置数据库配置身份验证?

  26. 26

    如何通过在php mqsql中获取用户的输入来显示数据库中的数据?

  27. 27

    如何使用我在 javascript 中通过 php 获得的数据库中的数据?

  28. 28

    如果列包含 Laravel 中的 JSON 编码数据,我如何在数据库中搜索值

  29. 29

    创建使用数据库优先模型后,如何在实体框架中设置由数据库在数据库中生成的ID密钥

热门标签

归档