[英]PHP MySQL-query results in jibberish
我正在使用 PDO 進行 MySQL 查詢。 我正在使用charset=utf8
。 查詢找到一個答案(應該是一個全名)。 但是,結果始終如下所示:
=?UTF-8?B? somejibber ?=
任何想法可能是錯誤的?
謝謝!
編輯
這是我正在做的事情:我正在使用 fmbiete 的 Z-Push-Contrib 從我的 ispconfig3 數據庫中獲取 dovecot 用戶的全名。
https://github.com/fmbiete/Z-Push-contrib/blob/master/backend/imap/config.php https://github.com/fmbiete/Z-Push-contrib/blob/master/backend/imap /imap.php
define('IMAP_FROM_SQL_DSN', 'mysql:host=localhost;dbname=dbispconfig;charset=utf8');
define('IMAP_FROM_SQL_USER', 'z-push');
define('IMAP_FROM_SQL_PASSWORD', 'XXXYYY');
define('IMAP_FROM_SQL_OPTIONS', serialize(array(PDO::ATTR_PERSISTENT => true)));
define('IMAP_FROM_SQL_QUERY', 'select name, email from mail_user where login = "#username"');
define('IMAP_FROM_SQL_FIELDS', serialize(array('name', 'email')));
define('IMAP_FROM_SQL_FROM', '#name <#email>');
_
private function getFromSql($username, $domain) {
$from = $username;
$dbh = $sth = $record = null;
try {
$dbh = new PDO(IMAP_FROM_SQL_DSN, IMAP_FROM_SQL_USER, IMAP_FROM_SQL_PASSWORD, unserialize(IMAP_FROM_SQL_OPTIONS));
ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getFromSql() - Connected to SQL Database"));
$sql = str_replace('#username', $username, str_replace('#domain', $domain, IMAP_FROM_SQL_QUERY));
ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getFromSql() - Searching From with filter: %s", $sql));
$sth = $dbh->prepare($sql);
$sth->execute();
$record = $sth->fetch(PDO::FETCH_ASSOC);
if ($record) {
ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getFromSql() - Found entry in SQL Database. Generating From"));
$from = IMAP_FROM_SQL_FROM;
foreach (unserialize(IMAP_FROM_SQL_FIELDS) as $field) {
$from = str_replace('#'.$field, $record[$field], $from);
}
$from = $this->encodeFrom($from);
}
else {
ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->getFromSql() - No entry found in SQL Database"));
}
}
catch(PDOException $ex) {
ZLog::Write(LOGLEVEL_WARN, sprintf("BackendIMAP->getFromSql() - Error getting From value from SQL Database: %s", $ex));
}
$dbh = $sth = $record = null;
return $from;
}
編輯
正如@rocket-hazmat 在評論中指出的那樣,這似乎是預期的行為,並且原樣很好——這是一個無用的線程;-)
=?utf-8?B?gibberish?=
表示有人將信息存儲為 BASE64 UTF8 ENCODED。
這在電子郵件系統中很常見,其中主題和發件人:字段可能不是低 ASCII 碼,甚至根本不是任何西方編碼。
所以如果你想恢復信息,你需要解析那個值。
例如:
$gibberish = '=?utf-8?B?UmVuw6llIERldXhpw6htZQo=?=';
if (preg_match('#=\\?utf-8\\?B\\?(.*)\\?=#', $gibberish, $gregs)) {
$clean = base64_decode($gregs[1]);
// You may need to utf_decode or iconv the value to suit your needs.
} else {
// Do not clean :-(
$clean = $gibberish;
}
print $clean;
產出
Renée Deuxième
作為旁注,另一種可能的編碼是 Quoted-Printable UTF8,它可以通過前綴=?utf-8?Q
識別(注意 Q 而不是 B)。
這里沒有錯,也沒有胡說八道。
=?UTF-8?B?somejibber?=
是某人存儲在數據庫中的完全有效的值。 你可以問他們為什么這樣做。 我們不能告訴你。
嘗試將名稱設置為 utf-8
$example->exec("set names utf8");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.