使用 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 DB 无法查询任何内容

PHP/MS ACCESS 本地用户可以写入数据库,但远程用户不能

将 MS Access 数据迁移到 MySQL:字符编码问题

字符串编码ord,chr,字面值

字符串编码ord,chr,字面值