Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP/MS访问的字符编码难题_Php_Sql_Ms Access_Character Encoding - Fatal编程技术网

使用PHP/MS访问的字符编码难题

使用PHP/MS访问的字符编码难题,php,sql,ms-access,character-encoding,Php,Sql,Ms Access,Character Encoding,注意:这是MS Access 2000,这个PHP文件是通过ajax调用调用的 在这个PHP文件的开头,我把 ini_set('default_charset', 'utf-8'); 下面的$token来自这些行 $search_string = $_GET[ 'search_string' ]; $search_tokens = explode( " ", $search_string ); $token = $search_tokens[ 0 ]; 当我有一个不带法语口音字符的令牌时,这

注意:这是MS Access 2000,这个PHP文件是通过ajax调用调用的

在这个PHP文件的开头,我把

ini_set('default_charset', 'utf-8');
下面的$token来自这些行

$search_string = $_GET[ 'search_string' ];
$search_tokens = explode( " ", $search_string );
$token = $search_tokens[ 0 ];
当我有一个不带法语口音字符的令牌时,这可以正常工作:

$sql="SELECT * FROM tblFrEng WHERE French = '$token'";
echo "=== SQL is $sql<br>";
$sth = $dbh->prepare( $sql );
$sth->execute();
很遗憾,查询返回0行。。。即使有记录,它也应该返回。。。所以在我看来,字符编码很可能是个问题


注意,我也尝试使用utf8_encode进行编码,但正如前面所指出的,这没有任何意义,并且将SQL字符串弄乱了…

这是我得到的PHP代码。我必须使用mb_convert_编码,这是PHP多字节字符串mbstring扩展的一部分

守则:

<?php
// NB: save this PHP script as an ANSI text file, not a UTF-8 encoded file

$dbh = new PDO(
        'odbc:Driver={Microsoft Access Driver (*.mdb)};' .
        'Dbq=C:\\Users\\Public\\acc2000.mdb;' .
        'Uid=Admin;Pwd=;');

// this is our test case
$city = 'Montréal';
echo '$city: ' . $city . "\r\n";

// this is the UTF-8 "token" we'd get from the AJAX call...
$token = utf8_encode($city);
echo '$token: ' . $token . "\r\n";

// ...and here we convert to the Access_2000 character set
$win_token = mb_convert_encoding($token, 'Windows-1252', 'UTF-8');
echo '$win_token: ' . $win_token . "\r\n";

$sth = $dbh->prepare('SELECT * FROM Cities WHERE City = ?');
$sth->Execute(array($win_token));
$rst = $sth->fetchAll();
echo '$rst: ';
print_r($rst);

请注意,命令行输出本身有点混乱,但至少SQL查询返回了一个结果……

从何处获取此$token?token取自一个get字符串。。。我将把这些行放在我认为文件的编码不是UTF8…在这里调用UTF8\U编码是没有意义的。该函数将ISO-8859-1转换为UTF-8$令牌应该已经在UTF-8中了。如果您得到了一些信息,那么可能是数据库中的文本编码不正确。@cleong谢谢。。。这是有道理的。知道如何解决数据库编码错误的问题吗?问题是,我已经有了另一个程序,用Jython编写,即Java,它在这个数据库上管理这个查找函数,没有任何问题。。。包括带法国口音的角色。你真是个天才!我发现我必须对返回的内容进行反向编码,我在PHP文件中而不是在CLI中进行编码。。。所以我使用echo mb_convert_编码$row['Def'],'UTF-8','Windows-1252';啊,只是美中不足一点也不奇怪。。。似乎Access Memo字段中的换行符被完全忽略了我已将传入的字符串拆分为字符。。。这些换行符总是有问题的。。。我想我可能会在适当的时候转换成MySQL,但是非常感谢
<?php
// NB: save this PHP script as an ANSI text file, not a UTF-8 encoded file

$dbh = new PDO(
        'odbc:Driver={Microsoft Access Driver (*.mdb)};' .
        'Dbq=C:\\Users\\Public\\acc2000.mdb;' .
        'Uid=Admin;Pwd=;');

// this is our test case
$city = 'Montréal';
echo '$city: ' . $city . "\r\n";

// this is the UTF-8 "token" we'd get from the AJAX call...
$token = utf8_encode($city);
echo '$token: ' . $token . "\r\n";

// ...and here we convert to the Access_2000 character set
$win_token = mb_convert_encoding($token, 'Windows-1252', 'UTF-8');
echo '$win_token: ' . $win_token . "\r\n";

$sth = $dbh->prepare('SELECT * FROM Cities WHERE City = ?');
$sth->Execute(array($win_token));
$rst = $sth->fetchAll();
echo '$rst: ';
print_r($rst);
C:\__tmp>\php\php odbcTest.php
$city: MontrΘal
$token: Montréal
$win_token: MontrΘal
$rst: Array
(
    [0] => Array
        (
            [City] => MontrΘal
            [0] => MontrΘal
        )

)