2011-06-08 65 views
6

我正在開發一個Zend應用程序。我的數據庫中的數據編碼爲「utf8_unicode_ci」。 我在的application.ini聲明:如何在Zend應用程序中將字符集設置爲UTF-8?

resources.view.encoding = "UTF-8" 

,但每當我試圖檢索包含特殊字符的字符串像

{ 'E', 'A', 'E',...}中分貝,字符串不顯示,除非我使用的功能:utf8_decode()

於是,我就字符集的設置爲UTF-8:

引導:

protected function _initDoctype() { 
     $this->bootstrap('view'); 
     $view = $this->getResource('view'); 
     $view->doctype('XHTML_STRICT'); 
     $view->setEncoding('UTF-8'); 
} 

protected function _initFrontControllerOutput() { 

    $this->bootstrap('FrontController'); 
    $frontController = $this->getResource('FrontController'); 

    $response = new Zend_Controller_Response_Http; 
    $response->setHeader('Content-Type', 'text/html; charset=UTF-8', true); 
    $frontController->setResponse($response); 

    $frontController->setParam('useDefaultControllerAlways', false); 

    return $frontController; 
} 

佈局:

$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf8'); 
echo $this->headMeta(); 

的application.ini:

resources.view.encoding = "UTF-8" 
resources.db.params.charset = "utf8" 

編輯:現在我可以在一個頁面上顯示特殊字符,但是當我從數據庫中檢索元素,不顯示特殊字符。

  • 轉義字符串返回null$this->escape($string)
  • echo $string替代特殊字符與?

,所以我還是要用utf8_decode()顯示它們。任何建議?

感謝您的幫助!

+0

順便說一句,我的源文件編碼設置爲UTF-8 – 2011-06-08 08:35:44

回答

1

也許你應該嘗試編輯你的源文件,保持utf-8作爲你的編輯器的編碼。有時候,即使你的HTML標題,數據庫編碼等使用了UTF-8,如果你的源文件使用不同的編碼,這可能會導致這種錯誤。

+0

我所有的源文件都是用UTF-8編碼的,但是雖然我確實設置了標題,但是當我顯示一些頁面時,它們都沒有在標題中包含字符集標記 – 2011-06-09 07:51:45

+0

瀏覽器的緩存是否會導致這種情況?例如,Google Chrome的緩存功能非常強大,如果您在網頁視圖中進行開發時沒有保持清除緩存,則可能會遇到此問題。我不確定這是否也發生在Firefox中,我使用螢火蟲並始終禁用緩存。 – 2011-07-12 17:58:10

+0

我已經解決了這個問題,這確實是由於數據庫和瀏覽器緩存 – 2011-07-13 07:28:17

3

您是否還嘗試過將標頭設置爲utf8?通常在php我這樣做

header ('Content-type: text/html; charset=utf-8'); 

在你的情況,我認爲你必須使用不同的東西。我已經採取了從Zend Framework documentation這個例子也許你應該使用不同的東西,我不是Zend_Framework的專家

// Within an action controller action: 
// Set a header 
$this->getResponse() 
    ->setHeader('Content-Type', 'text/html') 
    ->appendBody($content); 

如果設置標題,元和編碼它應該工作(從您的代碼在我看來,你是隻有設置元和編碼)

(看看這個問題,明白我的意思是,從貝瑞Langerak答案:PHP Display Special Characters

編輯 - 我還發現這篇文章的地方設置了標題爲在另一個例子控制器,看看它,也許這就是你要找的:http://www.chris.lu/en/news/show/4d56d0ecb058c/

這部分可能是你在找什麼:

protected function _initFrontControllerOutput() { 

    $this->bootstrap('FrontController'); 
    $frontController = $this->getResource('FrontController'); 

    $response = new Zend_Controller_Response_Http; 
    $response->setHeader('Content-Type', 'text/html; charset=UTF-8', true); 
    $frontController->setResponse($response); 

    $frontController->setParam('useDefaultControllerAlways', false); 

    return $frontController; 

} 
+0

我已經設置的標頭與這條線在我的佈局文件爲UTF8: 這個 - > headMeta( ) - > appendHttpEquiv('Content-Type','text/html; charset = utf8');但我也試過你的函數頭返回「Header()期望參數3長,字符串在... – 2011-06-08 09:07:37

+0

謝謝你的鏈接(chris.lu),但我試圖把我的功能 放入我的bootstrap,它不會改變任何東西 – 2011-06-08 09:12:44

+0

不,我認爲用這一行你只設置「元」:這意味着「'如果你看到我鏈接的其他問題,他們設置元和標題,但我不知道如何在Zend中設置標題 – 2011-06-08 09:13:12

-2

我曾經開發了許多種語言,包括RTL那些ZF應用。 和我曾經添加到我的引導文件,我發現它非常整齊。

也許這不是一個答案,但我認爲它很好的建議

public function _initMB(){ 
mb_internal_encoding("UTF-8"); 
} 

更多信息有關mb_internal_string退房:http://php.net/manual/en/function.mb-internal-encoding.php

+0

中以這種方式破壞了單元測試謝謝,我添加了這個函數,但它似乎並不工作 – 2011-06-08 12:21:06

16

有你設置以下,從MySQL作爲獲取數據UTF8?

resources.db.params.charset = "utf8" 

有必要做三兩件事,以獲得正確的字符顯示正確的:

  1. 保存PHP/HTML文件中UTF8編碼
  2. 從MySQL獲取數據的UTF8
  3. 發送權內容類型/字符集標題或使用元標記

有關更多信息,請參閱Rob Allen's article

+0

確實我沒有在配置文件中添加這個資源現在我的整個應用程序被設置爲UTF -8,但儘管我添加了一個'code'header(「Content-type:text/html; charset = utf-8」);'code' 沒有出現在源代碼中時我顯示頁面 – 2011-06-08 12:26:43

+0

header和meta是兩個不同的東西,爲了在你的html中獲得meta,你需要在你的佈局腳本中添加echo $ this-> headMeta(); – Maxence 2011-06-08 17:42:08

+0

你可以設置標題(或者讓Apache爲你設置)或者像Maxence描述的那樣添加meta標籤,你不需要兩個頭部AN D元標記,但它不會傷害,元標記將作爲備份。 – 2011-06-09 08:43:08

0

如果您需要使用utf8_encode(),這意味着您的數據庫中的數據不以UTF8編碼。 當你說你的數據庫是用「utf8_unicode_ci」編碼時,它實際上並不意味着你的數據是用UTF8編碼的。

要通過使用任何代碼驗證設置編碼是否與Zend Framework一起工作,這很容易。使用Firefox只需右鍵單擊頁面,然後單擊「查看頁面信息」,如果它顯示「編碼:UTF8」,這意味着您的頁面已正確編碼,但您的數據不是。

如果您使用的是utf8_decode(),那麼這將意味着Zend無法設置編碼。

+0

對不起,我犯了一個錯誤,我使用utf8_decode()來顯示數據,但是,當我檢查頁面信息時,字符集設置爲UTF-8 – 2011-06-09 08:14:53

+0

這絕對是很奇怪的...... utf8_decode()解碼爲ISO-8859- 1 – zzarbi 2011-06-10 03:20:50

0

如果你把所有的編碼和排序比如'utf8_general_ci'放在BD中,然後在application.ini中的mysql連接參數的下一個,resources.db.params.charset = "utf8"應該可以做到。

7

我在我的Zend Framework 2應用程序中使用Doctrine2模塊時遇到了同樣的問題。明確設置爲我Doctrine2模塊設置的字符解決了問題...

只需添加'charset' => 'utf8'到您的學說連接參數:

'params' => array(
    'host'  => 'localhost', 
    'port'  => 'yourport', 
    'user'  => 'username', 
    'password' => 'password', 
    'dbname' => 'yourdatabase', 
    'charset' => 'utf8', 
) 

也可能會爲您正常的數據庫連接工作。添加'charset=utf8'連接字符串:

'db' => array(
    'driver'   => 'Pdo', 
    'dsn'   => 'mysql:host=$localhost;dbname=$yourdatabase;charset=utf8', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ) 
), 
+0

我投這一個是被接受的答案:) – Lamy 2016-04-30 09:06:41

+0

在dsn上添加字符集= utf8和'charset'=>'utf8'在params工程爲我。最佳答案!謝謝! – Jimvirle 2017-03-07 16:26:33

0

我有同樣的問題,我固定它在配置/自動加載/全球。通過設置字符集值PHP :

'db' => [ 
    'adapters' => [ 
     'dummy' => [], 
     'myadapter' => ['charset' => 'utf-8',], 
    ], 
相關問題