首頁 後端開發 php教程 php字符串处理之全角半角变换

php字符串处理之全角半角变换

Jun 13, 2016 pm 12:28 PM
amp char return string unicode

php字符串处理之全角半角转换

半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路。

一、概念

全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理

二、实现思路

1. 找到目标unicode的字符,可以使用正则表达式解决

2. 修改unicode编码

三、实现

1. 首先是两个unicode与字符的转换函数:

<span style="color: #008080;"> 1</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">     * 将unicode转换成字符</span><span style="color: #008080;"> 3</span> <span style="color: #008000;">     * @param int $unicode</span><span style="color: #008080;"> 4</span> <span style="color: #008000;">     * @return string UTF-8字符</span><span style="color: #008080;"> 5</span> <span style="color: #008000;">     *</span><span style="color: #008000;">*/</span><span style="color: #008080;"> 6</span>     <span style="color: #0000ff;">function</span> unicode2Char(<span style="color: #800080;">$unicode</span><span style="color: #000000;">){</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$unicode</span> return <span style="color: #008080;">chr</span>(<span style="color: #800080;">$unicode</span><span style="color: #000000;">);</span><span style="color: #008080;"> 8</span>         <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$unicode</span> return <span style="color: #008080;">chr</span>((<span style="color: #800080;">$unicode</span> >> 6) + 192) .<span style="color: #008080;"> 9</span>                                       <span style="color: #008080;">chr</span>((<span style="color: #800080;">$unicode</span> & 63) + 128<span style="color: #000000;">);</span><span style="color: #008080;">10</span>         <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$unicode</span> return <span style="color: #008080;">chr</span>((<span style="color: #800080;">$unicode</span> >> 12) + 224) .<span style="color: #008080;">11</span>                                       <span style="color: #008080;">chr</span>(((<span style="color: #800080;">$unicode</span> >> 6) & 63) + 128) .<span style="color: #008080;">12</span>                                       <span style="color: #008080;">chr</span>((<span style="color: #800080;">$unicode</span> & 63) + 128<span style="color: #000000;">);</span><span style="color: #008080;">13</span>         <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$unicode</span> return <span style="color: #008080;">chr</span>((<span style="color: #800080;">$unicode</span> >> 18) + 240) .<span style="color: #008080;">14</span>                                       <span style="color: #008080;">chr</span>(((<span style="color: #800080;">$unicode</span> >> 12) & 63) + 128) .<span style="color: #008080;">15</span>                                       <span style="color: #008080;">chr</span>(((<span style="color: #800080;">$unicode</span> >> 6) & 63) + 128) .<span style="color: #008080;">16</span>                                       <span style="color: #008080;">chr</span>((<span style="color: #800080;">$unicode</span> & 63) + 128<span style="color: #000000;">);</span><span style="color: #008080;">17</span>         <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;</span><span style="color: #008080;">18</span> <span style="color: #000000;">    }</span><span style="color: #008080;">19</span>  <span style="color: #008080;">20</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">21</span> <span style="color: #008000;">     * 将字符转换成unicode</span><span style="color: #008080;">22</span> <span style="color: #008000;">     * @param string $char 必须是UTF-8字符</span><span style="color: #008080;">23</span> <span style="color: #008000;">     * @return int</span><span style="color: #008080;">24</span> <span style="color: #008000;">     *</span><span style="color: #008000;">*/</span><span style="color: #008080;">25</span>     <span style="color: #0000ff;">function</span> char2Unicode(<span style="color: #800080;">$char</span><span style="color: #000000;">){</span><span style="color: #008080;">26</span>         <span style="color: #0000ff;">switch</span> (<span style="color: #008080;">strlen</span>(<span style="color: #800080;">$char</span><span style="color: #000000;">)){</span><span style="color: #008080;">27</span>             <span style="color: #0000ff;">case</span> 1 : <span style="color: #0000ff;">return</span> <span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span><span style="color: #000000;">);</span><span style="color: #008080;">28</span>             <span style="color: #0000ff;">case</span> 2 : <span style="color: #0000ff;">return</span> (<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{1}) & 63) |<span style="color: #008080;">29</span>                             ((<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{0}) & 31) );<span style="color: #008080;">30</span>             <span style="color: #0000ff;">case</span> 3 : <span style="color: #0000ff;">return</span> (<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{2}) & 63) |<span style="color: #008080;">31</span>                             ((<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{1}) & 63) 32                             ((<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{0}) & 15) );<span style="color: #008080;">33</span>             <span style="color: #0000ff;">case</span> 4 : <span style="color: #0000ff;">return</span> (<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{3}) & 63) |<span style="color: #008080;">34</span>                             ((<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{2}) & 63) 35                             ((<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{1}) & 63) 36                             ((<span style="color: #008080;">ord</span>(<span style="color: #800080;">$char</span>{0}) & 7)  );<span style="color: #008080;">37</span>             <span style="color: #0000ff;">default</span> :<span style="color: #008080;">38</span>                 <span style="color: #008080;">trigger_error</span>('Character is not UTF-8!', <span style="color: #ff00ff;">E_USER_WARNING</span><span style="color: #000000;">);</span><span style="color: #008080;">39</span>                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;</span><span style="color: #008080;">40</span> <span style="color: #000000;">        }</span><span style="color: #008080;">41</span>     }
登入後複製

  2. 全角转半角

<span style="color: #008080;"> 1</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">     * 全角转半角</span><span style="color: #008080;"> 3</span> <span style="color: #008000;">     * @param string $str</span><span style="color: #008080;"> 4</span> <span style="color: #008000;">     * @return string</span><span style="color: #008080;"> 5</span> <span style="color: #008000;">     *</span><span style="color: #008000;">*/</span><span style="color: #008080;"> 6</span>     <span style="color: #0000ff;">function</span> sbc2Dbc(<span style="color: #800080;">$str</span><span style="color: #000000;">){</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">return</span> <span style="color: #008080;">preg_replace</span><span style="color: #000000;">(</span><span style="color: #008080;"> 8</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 全角字符 </span><span style="color: #008080;"> 9</span>             '/[\x{3000}\x{ff01}-\x{ff5f}]/ue',<span style="color: #008080;">10</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 编码转换</span><span style="color: #008080;">11</span> <span style="color: #008000;">            // 0x3000是空格,特殊处理,其他全角字符编码-0xfee0即可以转为半角</span><span style="color: #008080;">12</span>             '($unicode=char2Unicode(\'\0\')) == 0x3000 ? " " : (($code=$unicode-0xfee0) > 256 ? unicode2Char($code) : chr($code))',<span style="color: #008080;">13</span>             <span style="color: #800080;">$str</span><span style="color: #008080;">14</span> <span style="color: #000000;">        );</span><span style="color: #008080;">15</span>     }
登入後複製

3. 半角转全角

<span style="color: #008080;"> 1</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">     * 半角转全角</span><span style="color: #008080;"> 3</span> <span style="color: #008000;">     * @param string $str</span><span style="color: #008080;"> 4</span> <span style="color: #008000;">     * @return string</span><span style="color: #008080;"> 5</span> <span style="color: #008000;">     *</span><span style="color: #008000;">*/</span><span style="color: #008080;"> 6</span>     <span style="color: #0000ff;">function</span> dbc2Sbc(<span style="color: #800080;">$str</span><span style="color: #000000;">){</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">return</span> <span style="color: #008080;">preg_replace</span><span style="color: #000000;">(</span><span style="color: #008080;"> 8</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 半角字符 </span><span style="color: #008080;"> 9</span>             '/[\x{0020}\x{0020}-\x{7e}]/ue',  <span style="color: #008080;">10</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 编码转换</span><span style="color: #008080;">11</span> <span style="color: #008000;">            // 0x0020是空格,特殊处理,其他半角字符编码+0xfee0即可以转为全角</span><span style="color: #008080;">12</span>             '($unicode=char2Unicode(\'\0\')) == 0x0020 ? unicode2Char(0x3000) : (($code=$unicode+0xfee0) > 256 ? unicode2Char($code) : chr($code))',<span style="color: #008080;">13</span>             <span style="color: #800080;">$str</span><span style="color: #008080;">14</span> <span style="color: #000000;">        );</span><span style="color: #008080;">15</span>     }
登入後複製

四、测试

 示例代码:

<span style="color: #008080;">1</span> <span style="color: #800080;">$a</span> = 'abc12 345'<span style="color: #000000;">;</span><span style="color: #008080;">2</span> <span style="color: #800080;">$sbc</span> = dbc2Sbc(<span style="color: #800080;">$a</span><span style="color: #000000;">);</span><span style="color: #008080;">3</span> <span style="color: #800080;">$dbc</span> = sbc2Dbc(<span style="color: #800080;">$sbc</span><span style="color: #000000;">);</span><span style="color: #008080;">4</span> <span style="color: #008080;">5</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$a</span>, <span style="color: #800080;">$sbc</span>, <span style="color: #800080;">$dbc</span>);
登入後複製

结果:

<span style="color: #008080;">1</span> <span style="color: #0000ff;">string</span>(9) "abc12 345"<span style="color: #008080;">2</span> <span style="color: #0000ff;">string</span>(27) "abc12 345"<span style="color: #008080;">3</span> <span style="color: #0000ff;">string</span>(9) "abc12 345"
登入後複製

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 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的String.valueOf()函數將基本資料型別轉換為字串 使用java的String.valueOf()函數將基本資料型別轉換為字串 Jul 24, 2023 pm 07:55 PM

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數,可以使用return語句來提前結束函數的執行;2、對於傳回值型別不為void的函數,return語句的作用是將函數的執行結果傳回給呼叫者;3、提前結束函數的執行,在函數內部,我們可以使用return語句來提前結束函數的執行,即使函數並沒有回傳值。

怎麼把char數組轉string 怎麼把char數組轉string Jun 09, 2023 am 10:04 AM

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

Java中return和finally語句的執行順序是怎樣的? Java中return和finally語句的執行順序是怎樣的? Apr 25, 2023 pm 07:55 PM

原始碼:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}#輸出上述程式碼的輸出可以簡單地得出結論:return在finally之前執行,我們來看下字節碼層面上發生了什麼事情。下面截取case1方法的部分字節碼,並且對照源碼,將每個指令的含義註釋在

使用java的String.replace()函數替換字串中的字元(字串) 使用java的String.replace()函數替換字串中的字元(字串) Jul 25, 2023 pm 05:16 PM

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

2w字 詳解 String,yyds 2w字 詳解 String,yyds Aug 24, 2023 pm 03:56 PM

大家好,今天跟大家分享java基礎之String。 String類別的重要性就不必說了,可以說是我們後端開發用的最多的類,所以,很有必要好好聊聊它。

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

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

Golang函數的byte、rune和string型轉換技巧 Golang函數的byte、rune和string型轉換技巧 May 17, 2023 am 08:21 AM

在Golang程式設計中,byte、rune和string類型是非常基礎、常見的資料型別。它們在處理字串、檔案流等資料操作時發揮著重要作用。而在進行這些資料操作時,我們通常需要對它們進行相互的轉換,這就需要掌握一些轉換技巧。本文將介紹Golang函數的byte、rune和string類型轉換技巧,旨在幫助讀者更好地理解這些資料類型,並能夠熟練地在程式設計實踐中應用

See all articles