使用PHP/MS访问的字符编码难题
注意:这是MS Access 2000,这个PHP文件是通过ajax调用调用的 在这个PHP文件的开头,我把使用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 ]; 当我有一个不带法语口音字符的令牌时,这
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
)
)