无法从Access获取正确的utf-8文本

时间:2013-11-10 16:21:04

标签: php ms-access encoding utf-8

当我试图从数据库中获取中文字符时,我得到了奇怪的文字。 我尝试了几乎所有内容,例如html_entity_decodehtmlentities,使用utf-8保存文件,使用utf-8编码,但我似乎无法正确使用。

我如何获得正确的文字?

这是我的代码:

<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> 
<?php
header('Content-Type: text/html; charset=utf-8');
$conn=odbc_connect('vocab','',''); 
$rs1=odbc_exec($conn,"SELECT MAX(ID) AS MaxId FROM vocab");
$NewMaxID=odbc_result($rs1,"MaxId");
$rand=rand(1,$NewMaxID);


            $sql="SELECT word,part_of_speech,chinese FROM vocab WHERE ID=".$rand.";";
            $rs=odbc_exec($conn,$sql);


            $i=1;
            odbc_fetch_row($rs);
$a=(odbc_result($rs,1));
$b=(odbc_result($rs,2));    
$c=(odbc_result($rs,3));


//$c="&#37806;";
//$d=html_entity_decode($c);
//$c=htmlentities($d, ENT_NOQUOTES , "UTF-8");
$rows=array("first"=>$a,"second"=>$b,"third"=>$c);
echo json_encode($rows);
?>

ps:我使用的是繁体中文版的MS Office。

1 个答案:

答案 0 :(得分:0)

我前一段时间遇到过这个问题,我能让它工作的唯一方法是将HTML写入ADODB.Stream对象,将其保存到文件中,然后echo该文件:

<?php
define("TEMP_FOLDER", "C:\\__tmp\\");
header('Content-Type: text/html; charset=utf-8');

$stm = new COM("ADODB.Stream") or die("Cannot create COM object.");
$stm->Type = 2;  // adTypeText
$stm->Charset = 'utf-8';
$stm->Open();
$stm->WriteText('<html>');
$stm->WriteText('<head>');
$stm->WriteText('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />');
$stm->WriteText('<title>ADODB test</title>');
$stm->WriteText('</head>');
$stm->WriteText('<body>');

$con = new COM("ADODB.Connection"); 
$con->Open(
        "Driver={Microsoft Access Driver (*.mdb, *.accdb)};" .
        "Dbq=C:\\Users\\Public\\Database1.accdb");
$rst = $con->Execute("SELECT word FROM vocab WHERE ID=3");
$stm->WriteText($rst->Fields("word"));
$rst->Close();
$con->Close();

$stm->WriteText('</body>');
$stm->WriteText('</html>');

$tempFile = TEMP_FOLDER . uniqid("", TRUE) . ".txt";
$stm->SaveToFile($tempFile, 2);  // adSaveCreateOverWrite
$stm->Close();
echo file_get_contents($tempFile);
unlink($tempFile);
?>