1. 程式人生 > >php常用編碼UTF-8設定

php常用編碼UTF-8設定

簡介

目前,PHP 仍未在底層實現對 Unicode 的支援。雖然有很多途徑可以確保 UTF-8 字串能夠被正確地處理,但這並不是很簡單的事情,通常需要對 Web 應用進行全方面的檢查,從 HTML 到 SQL 再到 PHP。我們將爭取進行一個簡潔實用的總結。

PHP 層面的 UTF-8

最基本的字串操作,像是連結兩個字串或將字串賦值給變數,並不需要對 UTF-8 做特別的處理。然而大多數字符串的函式,像 strpos() 和 strlen(),確實需要特別的處理。這些函式名中通常包含 mb_*:比如,mb_strpos() 和 mb_strlen()。這些 mb_* 字串是由 Multibyte String Extension 提供支援的,它專門為操作 Unicode 字串而特別進行了設計。

在操作 Unicode 字串時,請你務必使用 mb_* 函式。例如,如果你對一個 UTF-8 字串使用 substr(),那返回的結果中有很大可能會包含一些亂碼。正確的方式是使用 mb_substr()。

最難的地方在於每次都要記得使用 mb_* 函式。如果你哪怕只有一次忘記了使用,你的 Unicode 字串就有在接下來的過程中變成亂碼的風險。

不是所有的字串函式都有一個對應的 mb_* 函式。如果你想要的功能沒有對應的 mb_* 函式的話,那隻能說你運氣不佳了。

你應該在你所有的 PHP 指令碼(或全域性包含的指令碼)的開頭使用 mb_internal_encoding() 函式,然後緊接著在會對瀏覽器進行輸出的指令碼中使用 mb_http_output()。在每一個腳本當中明確宣告字串的編碼可以免去很多日後的煩惱。

另外,許多對字串進行操作的函式都有一個可選的引數用來指定字串編碼。當可以設定這類引數時,你應該始終明確指定使用 UTF-8。例如,htmlentities() 有一個字元編碼的選項,你應該始終將其設為 UTF-8。從 PHP 5.4.0 開始, htmlentities() 和 htmlspecialchars() 的編碼都已經被預設設為了 UTF-8。

資料庫層面的 UTF-8

如果你使用 PHP 來操作到 MySQL,有些時候即使你做到了上面的每一點,你的字串仍可能面臨在資料庫中以非 UTF-8 的格式進行儲存的問題。

為了確保你的字串從 PHP 到 MySQL都使用 UTF-8,請檢查確認你的資料庫和資料表都設定為 utf8mb4 字符集和整理,並且確保你的 PDO 連線請求也使用了 utf8mb4 字符集。請看下方的示例程式碼,這是 非常重要 的。

請注意為了完整的 UTF-8 支援,你必須使用 utf8mb4 而不是 utf8!你會在進一步閱讀中找到原因。

瀏覽器層面的 UTF-8

使用 mb_http_output() 函式來確保 PHP 向瀏覽器輸出 UTF-8 格式的字串。

隨後瀏覽器需要接收 HTTP 應答來指定頁面是由 UTF-8 進行編碼的。以前這一步是通過在頁面 標籤下包含字符集 標籤實現的,這是一種可行的方式。但更好的做法是在 Content-Type 響應頭中進行設定,因為這樣做的速度會更快。

<?php
// Tell PHP that we're using UTF-8 strings until the end of the script
mb_internal_encoding('UTF-8');

// Tell PHP that we'll be outputting UTF-8 to the browser
mb_http_output('UTF-8');

// Our UTF-8 test string
$string = 'Êl síla erin lû e-govaned vîn.';

// Transform the string in some way with a multibyte function
// Note how we cut the string at a non-Ascii character for demonstration purposes
$string = mb_substr($string, 0, 15);

// Connect to a database to store the transformed string
// See the PDO example in this document for more information
// Note the `charset=utf8mb4` in the Data Source Name (DSN)
$link = new PDO(
    'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4',
    'your-username',
    'your-password',
    array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT => false
    )
);

// Store our transformed string as UTF-8 in our database
// Your DB and tables are in the utf8mb4 character set and collation, right?
$handle = $link->prepare('insert into ElvishSentences (Id, Body) values (?, ?)');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->bindValue(2, $string);
$handle->execute();

// Retrieve the string we just stored to prove it was stored correctly
$handle = $link->prepare('select * from ElvishSentences where Id = ?');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->execute();

// Store the result into an object that we'll output later in our HTML
$result = $handle->fetchAll(\PDO::FETCH_OBJ);

header('Content-Type: text/html; charset=UTF-8');
?><!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>UTF-8 test page</title>
    </head>
    <body>
        <?php
        foreach($result as $row){
            print($row->Body);  // This should correctly output our transformed UTF-8 string to the browser
        }
        ?>
    </body>
</html>

相關推薦

php常用編碼UTF-8設定

簡介 目前,PHP 仍未在底層實現對 Unicode 的支援。雖然有很多途徑可以確保 UTF-8 字串能夠被正確地處理,但這並不是很簡單的事情,通常需要對 Web 應用進行全方面的檢查,從 HTML 到 SQL 再到 PHP。我們將爭取進行一個簡潔實用的總結。

php 多語言(UTF-8編碼)導出Excel、CSV亂碼解決辦法之導出UTF-8編碼的Excel、CSV

csv tex 完整 多語 繁體 HP 項目 .html agen 轉自: https://www.cnblogs.com/kclteam/p/5278926.html 新項目,大概情況是這樣的:可能存在多國、不同語種使用者,比喻有中文、繁體中文,韓文、日本等等,開發

設定MYSQL資料庫編碼UTF-8 設定MYSQL資料庫編碼UTF-8

設定MYSQL資料庫編碼為UTF-8   1、  編輯MySql的配置檔案 MySql的配置檔案Windows下一般在系統目錄下或者在MySql的安裝目錄下名字叫my.ini,可以搜尋,Linux下一般是/etc/my.cnf  

IntelliJ IDEA 設定編碼UTF-8

1.  安裝路徑下的:idea.exe.vmoptions 增加 -Dfile.encoding=UTF-8 2. Run/Debug Configurations 下的 VM options 文字框中 -Dfile.encoding=UTF-8

Python2.7 中文字元編碼 & Pycharm utf-8設定、Unicode與utf-8的區別

Python2.7 中文字元編碼 & Pycharm utf-8設定、Unicode與utf-8的區別 [email protected] 作者:Zhouwan  2017-6-6  一、關於編碼和亂碼,有以下幾個重要的概念需要搞清楚:     二、Pycharm 設定編碼, 可以

windows設定新建文字文件預設編碼UTF-8

1. 開啟記事本新建一個空白的文字文件,不輸入任何文字,然後儲存此文件,在“另存為”對話方塊中將編碼由預設的 ANSI 修改為 Unicode 或 UTF-8,接著為檔案取名,在此假設將新文件命名為 UNICODE.TXT。2. 將 utf-8.txt 複製至隱含的系統資料夾 C:\Windows\Shell

android studio 設定編碼UTF-8

在 android studio 中直接建立專案和匯入其他專案都會有一個檔案編碼設定的問題,在 android studio (version 1.2.0)中設定檔案的編碼,只需要兩步:1.開啟Setting->Editor->File Encoding 進行編碼設定2.開啟module的 bui

php從資料庫中讀取編碼utf-8的中文內容輸出到瀏覽器顯示問號的解決方案

要保證瀏覽器的編碼,以及資料庫讀取出來的編碼都是一致的utf-8. 資料庫讀取的時候在mysqli_connect()之後要設定連線字元編碼mysqli_query($db, “set names ‘utf8'”);這樣才能保證在瀏覽器顯示的結果為中文。 瀏覽器編碼可以通

ant編譯報錯“錯誤: 編碼UTF-8的不可映射字符”

ant 編譯報錯 error 根據報錯 的提示是編碼的問題,build.xml文件使用的是ANSI,文件中首行使用,網上查資料都是將encoding設置為GBK,設置之後是之前報錯的文件“AdvertiserAction.java”正常了,但是又會產生新的文件“PageUtil.java”報錯“錯

Linux(Ubuntu)使用日記------Mysql編碼(utf-8)的設置

img clu mysql5.7 inf sof 圖片 tex rac mysql配置文件 Mysq版本:5.7.21 操作系統:Linux(Ubuntu) 整個操作的基本思路如下(包括問題的解決思路,想要直接解決問題的可以先看最後的命令總結) 檢查mysql編碼

windows設置新建文本文檔默認編碼UTF-8

編輯 windows 文本 修改 復制 管理 目的 roo shell 1. 打開記事本新建一個空白的文本文檔,不輸入任何文字,然後保存此文檔,在“另存為”對話框中將編碼由默認的 ANSI 修改為 Unicode 或 UTF-8,接著為文件取名,在此假設將新文檔命名為 UN

eclipse中如何設置在新建JSP/XML文件時就指定編碼UTF-8

cli Language family ref 發現 encoding 需要 unicode tty eclipse新建jsp文件默認字符編碼為ISO-8859-1,很煩人,每次都需要更改 <%@ page language="java" contentType=

Python中的編碼問題:ASCII碼 Unicoden編碼 UTF-8編碼

分享 動態 src 服務 .com 傳輸 ascii 函數計算 row 編碼 字符串是一種數據類型,但是,字符串比較特殊的是還有一個編碼問題。 因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的計算機在設計時采用8個比特(bit)作為一個字節(

關於字元編碼UTF-8

字元編碼 我們已經講過了,字串也是一種資料型別,但是,字串比較特殊的是還有一個編碼問題。 因為計算機只能處理數字,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用8個位元(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進位制11

ANT 編譯警告: 編碼 UTF-8 的不可對映字元解決方法

今天開始學ant自動構建工具。在編譯原始檔的時候碰到一個警告: 9: 警告:編碼 UTF8 的不可對映字元     [javac]  System.out.println("ʹ��jar�ļ����");     [javac]                      

常見的字元編碼UTF-8UTF-16、UTF-32

字符集 字符集為每個字元分配了一個唯一的編號,通過這個編號就能找到對應的字元。在程式設計過程中我們經常會使用字元,而使用字元的前提就是把字元放入記憶體中,毫無疑問,放入記憶體中的僅僅是字元的編號,而不是真正的字元實體。 如何才能將字元編號放入記憶體中呢? 對於

oracle資料庫字元編碼utf-8改為ZHS16GBK

首先檢視服務端字符集 select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET' NLS_CHARACTERSET WE8MSWIN1252 然後用sys使用者進行修改 >sqlplus  >co

深入理解Python的字元編碼utf-8 & unicode

參考:http://lukejin.iteye.com/blog/598303 一,通過例子理解字元編碼 在Python中有兩個和字元很相關的型別,一個是str型別,一個是unicode型別。 這兩種型別的物件都是sequece序列,其中str是位元組序列,而unicode

Java 的亂碼解決方法 統一編碼UTF-8

一、介紹兩個類URLEncoder//編碼URLDecoder//解碼 看看下面的測試輸出,你就明白是做什麼的了 import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import jav

Ant打包出現 編碼utf-8不可對映字元 的解決辦法

做android開發過程中,用ant打包新建的專案,結果出現"編碼utf-8不可對映字元"的問題,網上的解決辦法說是因為編譯時的編碼和檔案儲存的編碼格式不一致,但是並沒有起作用,最後發現,原因是我建立專