【问题标题】:character encoding puzzle with PHP/MS Access使用 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)编写,它管理这个查找函数(在这个数据库上)没有任何问题......包括法语重音字符。

标签: php sql ms-access character-encoding


【解决方案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,但非常感谢
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2010-10-23
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多