Regex - 為什麼在正則不加模式修正符的時候,PHP去匹配的中文字元會是亂碼的

來源:互聯網
上載者:User


情況如下:

  • php 5.5.11
  • mac osx 10.9.2、win7、centOS 6.3

代碼如下:

echo preg_replace('/[\s-]+/', '-', '阿樹')."\n";

測試結果如下:

  • Mac 亂碼
  • windows、linux都正常

增加模式修正符後正常,如下:

echo preg_replace('/[\s-]+/u', '-', '阿樹')."\n";

尋找資料,是這麼說的:

u(PCRE_UTF8)

此修正符啟用了一個 PCRE 中與 Perl 不相容的額外功能。模式字串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。

請問:

  1. u的意思就是將匹配的字元當作utf8嗎,還有其他作用嗎
  2. My Code是utf8,但是為什麼只有mac(Unix)會亂碼呢?

回複內容:


情況如下:

  • php 5.5.11
  • mac osx 10.9.2、win7、centOS 6.3

代碼如下:

echo preg_replace('/[\s-]+/', '-', '阿樹')."\n";

測試結果如下:

  • Mac 亂碼
  • windows、linux都正常

增加模式修正符後正常,如下:

echo preg_replace('/[\s-]+/u', '-', '阿樹')."\n";

尋找資料,是這麼說的:

u(PCRE_UTF8)

此修正符啟用了一個 PCRE 中與 Perl 不相容的額外功能。模式字串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。

請問:

  1. u的意思就是將匹配的字元當作utf8嗎,還有其他作用嗎
  2. My Code是utf8,但是為什麼只有mac(Unix)會亂碼呢?

樹的utf8表示是e6 a0 91。敏感的話看到這裡就應該明白了。

第二個位元組a0\n是一樣的,從而被替換成了-,剩下左右兩邊的兩個位元組變成非法ASCII,顯示成問號了,至於平台差異性,估計是所謂PCRE的問題吧,有興趣可以鑽進去查查

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.