首頁 後端開發 PHP問題 php utf8怎麼轉unicode

php utf8怎麼轉unicode

Jul 18, 2020 am 09:29 AM
unicode utf8

php utf8轉unicode的方法:先建立一個PHP範例檔;然後定義一個「utf8_str_to_unicode」方法;接著透過ord以及dechex等函數實作轉換功能;最後執行該檔即可。

php utf8怎麼轉unicode

PHP實作Unicode和Utf-8編碼的互相轉換

最近剛好要用到unicode編碼的轉換,就去查了一下php的函式庫函數,居然沒找到一個函數可以對字串進行Unicode的編碼和解碼!也罷,找不到的話就自己實現了。 。 。

Unicode和Utf-8編碼的區別

Unicode是字元集,而UTF-8是Unicode的其中一種,Unicode是定長的都為雙字節,而UTF-8是可變的,對於漢字來說Unicode佔有的位元組比UTF-8佔用的位元組少1個位元組。 Unicode為雙位元組,而UTF-8中漢字佔三個位元組。

UTF-8編碼字元理論上可以最多到6個位元組長,然而16位元BMP(Basic Multilingual Plane)字元最多只用到3位元組長。下面看一下UTF-8編碼表:

U-00000000 - U-0000007F: 0xxxxxxx 
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx 
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
登入後複製

xxx 的位置由字元編碼數的二進位表示的位元填入, 越靠右的x 具有越少的特殊意義,只用最短的那個足夠表達一個字元編碼數的多位元組字串。注意在多位元組字串中, 第一位元組的開頭"1"的數目就是整個字串中位元組的數目。而第一行中以0開頭,是為了相容ASCII編碼,為一個字節,第二行就為雙字節字串,第三行為3字節,如漢字就屬於這種,以此類推。 (個人認為:其實我們可以簡單的把前面的1的個數看成字節數)

#Unicode怎麼轉換成Utf-8呢

為了要將Unicode轉換為UTF-8,當然要知道他們的差別到底在什麼地方。下面來看一下,在Unicode中的編碼是怎麼轉換成UTF-8的,在UTF-8中,如果一個字符的字節小於0x80(128)則為ASCII字符,佔一個字節,可以不用轉換,因為UTF-8相容於ASCII編碼。假如在Unicode中漢字“你”的編碼為“u4F60”,把它轉換為二進制為100111101100000,然後按照UTF-8的方法進行轉換。可以將Unicode二進制從低位往高位取出二進制數字,每次取6位,如上述的二進制就可以分別取出為如下所示的格式,前面按格式填補,不足8位用0填補。

unicode: 100111101100000                   4F60
utf-8:    11100100,10111101,10100000       E4BDA0
登入後複製

從上面就可以很直覺的看出Unicode到UTF-8之間的轉換,當然知道了UTF-8的格式後,就可以進行逆運算,就是按照格式把它在二進位中對應的位置上取出,然後在轉換就是所得到的Unicode字元了(這個運算可以透過「位移」來完成)。如上述的「你」的轉換,由於其值大於0x800小於0x10000,因此可以判斷為三字節存儲,則最高位需要向右移「12」位再根據三字節格式的最高位為11100000(0xE0 )求或(|)就可以得到最高位的值了。同理第二位則是右移「6」位,則還剩下最高位和第二位的二進位值,可以透過與111111(0x3F)求按位於(&)操作,再和11000000(0x80)求或(|)。第三位就不用移位了,只要直接取最後六位(與111111(ox3F)取&),在與11000000(0x80)求或(|)。

Utf-8怎麼逆轉回Unicode呢

當然在UTF-8到Unicode的轉換也是透過移位等來完成的,就是把UTF-8那些格式對應的位置的二進制數給揪出來。在上述例子中「你」為三個字節,因此要每個位元組進行處理,有高位到低位進行處理。

在UTF-8中「你」為11100100,10111101,10100000。從高位起即第一個位元組11100100就是把其中的"0100"給取出來,這個很簡單只要和11111(0x1F)取與(&),由三字節可以得知最到位肯定位於12位之前,因為每次取六位。

所以還要將得到的結果左移12位,最高位也就這樣完成了0100,000000,000000。而第二位則是要把「111101」給取出來,只需將第二位元組10111101和111111(0x3F)取與(&)。在將所得的結果左移6位與最高位元組所得的結果取或(|),第二位就這樣完成了,得到的結果為0100,111101,000000。

以此類推最後一位直接與111111(0x3F)取與(&),再與前面所得的結果取或(|)即可得到結果0100,111101,100000。

PHP程式碼實作

/**
 * utf8字符转换成Unicode字符
 * @param  [type] $utf8_str Utf-8字符
 * @return [type]           Unicode字符
 */
function utf8_str_to_unicode($utf8_str) {
    $unicode = 0;
    $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
    $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
    $unicode |= (ord($utf8_str[2]) & 0x3F);
    return dechex($unicode);
}
/**
 * Unicode字符转换成utf8字符
 * @param  [type] $unicode_str Unicode字符
 * @return [type]              Utf-8字符
 */
function unicode_to_utf8($unicode_str) {
    $utf8_str = &#39;&#39;;
    $code = intval(hexdec($unicode_str));
    //这里注意转换出来的code一定得是整形,这样才会正确的按位操作
    $ord_1 = decbin(0xe0 | ($code >> 12));
    $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f));
    $ord_3 = decbin(0x80 | ($code & 0x3f));
    $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));
    return $utf8_str;
}
登入後複製

測試一下了

$utf8_str = &#39;我&#39;;
//这是汉字“你”的Unicode编码
$unicode_str = &#39;4f6b&#39;;
//输出 6211
echo utf8_str_to_unicode($utf8_str) . "<br/>";
//输出汉字“你”
echo unicode_str_to_utf8($unicode_str);
登入後複製

以上這些轉換是針對中文漢字【往大了說是非ASCII】的測試,因為如果是ASCII的話,轉來轉去都是一樣的,也用不著費那麼大工夫。

還有就是這兩個函數只是簡單的實作了一下,只支援單一字元【一個完整的utf8字元或是一個完整的Unicode字元】互相轉換,大家如果明白得話就可以盡情去擴展了。 。 。

推薦:《PHP教學

以上是php utf8怎麼轉unicode的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1253
24
utf8編碼漢字佔多少位元組 utf8編碼漢字佔多少位元組 Feb 21, 2023 am 11:40 AM

utf8編碼漢字佔3個位元組。在UTF-8編碼中,一個中文等於三個位元組,一個中文標點佔三個位元組;而在Unicode編碼中,一個中文(含繁體)等於兩個位元組。 UTF-8使用1~4位元組為每個字元編碼,一個US-ASCIl字元只需1位元組編碼,帶有變音符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文等字母則需要2位元組編碼。

深入了解PHP:JSON Unicode轉中文的實作方法 深入了解PHP:JSON Unicode轉中文的實作方法 Mar 05, 2024 pm 02:48 PM

深入了解PHP:JSONUnicode轉中文的實作方法在開發中,我們經常會遇到需要處理JSON資料的情況,而JSON中的Unicode編碼在一些場景下會為我們帶來一些問題,特別是當需要將Unicode編碼轉換為中文字元時。在PHP中,有一些方法可以幫助我們實現這個轉換過程,以下將介紹常用的方法,並提供具體的程式碼範例。首先,讓我們先來了解一下JSON中Un

unicode怎麼轉中文 unicode怎麼轉中文 Dec 14, 2023 am 10:57 AM

Unicode是一種字元編碼標準,用於表示各種語言和符號。若要將Unicode編碼轉換為中文字符,可使用Python的內建函數chr()和ord()。

解決Eclipse中文亂碼問題的方法試試看 解決Eclipse中文亂碼問題的方法試試看 Jan 03, 2024 pm 05:28 PM

Eclipse中文亂碼困擾?試試這些解決方案,需要具體程式碼範例一、背景介紹隨著電腦科技的不斷發展,中文在軟體開發中扮演越來越重要的角色。然而,許多開發者在使用Eclipse進行中文開發時會遇到亂碼問題,影響了工作效率。那麼,本文將介紹一些常見的亂碼問題,並給出對應的解決方案及程式碼範例,幫助讀者解決Eclipse中文亂碼問題。二、常見亂碼問題及解決方案文件

PHP教學:如何將JSON Unicode轉換為中文字符 PHP教學:如何將JSON Unicode轉換為中文字符 Mar 05, 2024 pm 06:36 PM

JSON(JavaScriptObjectNotation)是一種輕量級的資料交換格式,通常用於Web應用程式之間的資料交換。在處理JSON資料時,我們經常會遇到Unicode編碼的中文字元(例如"u4e2du6587"),需要將其轉換為可讀的中文字元。在PHP中,我們可以透過一些簡單的方法來實現這個轉換。接下來,我們將詳細介紹如何將JSONUnico

unicode和ascii有哪些差別 unicode和ascii有哪些差別 Sep 06, 2023 am 11:56 AM

unicode和ascii的差異包括編碼範圍不同、儲存空間不同和相容性不同等。詳細介紹:1、編碼範圍不同,ascii的編碼範圍是0-127,主要用於表示英語字母,而unicode的編碼範圍廣闊得多,可以表示幾乎所有的語言字符;2、存儲空間不同,ascii通常使用1個位元組來儲存一個字符,而unicode可能使用2個或更多的位元組來儲存一個字符;3、相容性不同等等。

解決Java連接MySQL資料庫時Unicode字元集編碼不一致的問題 解決Java連接MySQL資料庫時Unicode字元集編碼不一致的問題 Jun 10, 2023 am 11:39 AM

隨著大數據、雲端運算等技術的發展,資料庫成為了企業資訊化的重要基石之一。在Java開發的應用程式中,連接MySQL資料庫已成為常態。然而,在這個過程中,我們常常會遭遇一個棘手的問題──Unicode字元集編碼不一致。這不僅會影響我們的開發效率,還會影響應用程式的效能和穩定性。本文將介紹如何解決這個問題,讓Java連接MySQL資料庫更順暢。一、Unicode

node utf8漢字亂碼怎麼辦 node utf8漢字亂碼怎麼辦 Feb 08, 2023 am 10:29 AM

node utf8漢字亂碼的解決方法:1、透過「typeof」查看「SarchName」的型別;2、使用「Name=iconv.decode(name,'gbk')」方式轉換編碼為utf8即可。

See all articles