使用 PHP/MS Access 的字符编码难题
Posted
技术标签:
【中文标题】使用 PHP/MS Access 的字符编码难题【英文标题】:character encoding puzzle with PHP/MS Access 【发布时间】:2013-04-26 10:03:59 【问题描述】:注意这是 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();
但是虽然 SQL 带有像“référé”这样的法语单词看起来不错(像这样):
=== SQL is SELECT * FROM tblFrEng WHERE French = 'référé'
不幸的是,查询返回 0 行......即使它应该返回记录......所以在我看来,字符编码可能是问题所在
注意,我也尝试使用 utf8_encode 进行编码,但正如所指出的那样,这没有任何意义,并且使 SQL 字符串出现乱码...
【问题讨论】:
你从哪里得到这个$token
?
token 取自 GET 字符串...我将把这些行放入
我觉得你文件的编码不是UTF8...
在这里调用utf8_encode()
没有意义。该函数将 ISO-8859-1 转换为 UTF-8。 $token
应该已经是 UTF-8 了。如果你得到了什么,那么可能是数据库中的文本编码不正确。
@cleong 谢谢...这是有道理的。知道如何解决不正确的 dbase 编码问题吗?问题是我已经有另一个程序,用 Jython(即 Java)编写,它管理这个查找函数(在这个数据库上)没有任何问题......包括法语重音字符。
【参考方案1】:
这是我开始工作的 PHP 代码。我不得不使用mb_convert_encoding()
,它是 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);
从 Windows 命令行运行时的结果:
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
)
)
注意命令行输出本身有点乱码,但至少SQL查询返回了结果....
【讨论】:
你是个天才!我发现我必须对返回的东西进行 reverse 编码(我在 PHP 文件中而不是在 CLI 中进行编码)......所以我去 echo mb_convert_encoding( $row[ 'Def' ], 'UTF-8', 'Windows-1252'); 啊,美中不足(不足为奇)......似乎完全忽略了访问“备忘录”字段中的换行符(我已将传入的字符串拆分为字符)。 ..这些换行符一直是个问题...我想我可能会在适当的时候转换为 mysql,但非常感谢以上是关于使用 PHP/MS Access 的字符编码难题的主要内容,如果未能解决你的问题,请参考以下文章
PHP/MS ACCESS 本地用户可以写入数据库,但远程用户不能