2015-10-26 90 views
1

欲替換strtr函數的效率或str_replace函數一些無用的字符(錯誤是與兩個相同)str_replace函數/ strtr函數的效率和替換字符

在這裏與德塞夫勒無用字符的測試:

U + 201E:DOUBLE LOW -9引號(「)

U + 00AF:長音符號(¯)

<?php 

$string = "This „ is a ­ test"; 

$string = strtr($string, chr(ord("„")), " "); 
$string = strtr($string, chr(ord("­")), " "); 

echo $string; 

在結果,我得到This �� is a � test與替換字符(Unicod e U + FFFD)

它們是什麼,以及如何刪除它們?

+1

php字符串函數不能識別unicode。你正在損壞你的文本。這就是爲什麼有'mb _ *()'版本,它是多字節感知的。 –

回答

0

您打電話的方式strtr它會逐個翻譯「字符」,並且由於它不是編碼,所以它是一個字節。這將破壞多字節字符串。

此外,chr(ord())是毫無意義的,並且會進一步損壞您的數據。 ord只是將單個字節轉換爲單個整數,而chr則相反。這些函數對於您的目的沒有用處,也不能處理多字節字符串。

簡單地做:

str_replace(array('„', "\xC2\xAF"), ' ', $string) 

str_replace沒有編碼感知要麼,但它並沒有「做」與給定的字符串任何東西,它只是尋找確切的字節模式來代替。這是UTF-8的安全操作。

我已經在上面放置了字符「」「字符,但是使用字節符號對macron進行了編碼。由於macron是一個組合字符,因此在源代碼中看到或處理爲文字可能會產生問題。如果您的源代碼文件保存爲UTF-8並且$string也是UTF-8編碼的,那麼這樣做會很好。

如果這不能代替所需的字符,那麼這些確切的字符不在您的字符串中。使用bin2hex檢查您的字符串以查看它包含的確切字節。

1

您的代碼不工作,因爲您正在使用多字節字符串。

strtr將一個字節視爲一個字符,這對您的編碼不安全。您需要使用多字節字符串函數http://php.net/manual/en/ref.mbstring.php或指定要替換的字節序列並在其上使用二進制安全字符串函數,例如str_replace