簡體   English   中英

PHP MySQL 查詢導致亂碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM