2015-02-05 79 views
3

我很難從一些$string中刪除變音符號。我的代碼是strtr表演怪異 - 從字符串中刪除變音符號

<?php 
$string = "Příliš žluťoučký kůň úpěl ďábelské ódy."; 
$without_diacritics = strTr($string, "říšžťčýůúěďó", "risztcyuuedo"); 
echo $without_diacritics; 

而預期產出將是Prilis zlutoucky kun upel dabelske ody.

相反,我收到非常奇怪的反應:

Puiszliuc uuluueoudoks� ku�u� s�pd�l d�scbelsks� s�dy. 

我認爲它可能是與多有問題字節字符,但我發現strtr是多字節安全的。我的假設錯了嗎?我錯過了什麼?

+1

[這](http://stackoverflow.com/a/3635607/2518525)可能是(基於函數)或[this](http://stackoverflow.com/a/1770306/2518525)。 – Darren

+2

或[this](http://stackoverflow.com/questions/2758736/multibyte-strtr-mb-strtr)(「multibyte strtr() - > mb_strtr()」) – Matmarbon

+0

謝謝你的建議,我會決定確實使用其中之一,但我仍然期待着瞭解爲什麼我的代碼不能正常工作。 –

回答

4

問題是您的輸入轉換字符串是輸出轉換字符串的兩倍(因爲Unicode),而strtr()使用字節而不是字符;翻譯陣列將是在這種情況下較好的:

$string = "Příliš žluťoučký kůň úpěl ďábelské ódy."; 

echo strtr($string, [ 
    'ř' => 'r', 
    'í' => 'i', 
    'š' => 's', 
    'ž' => 'z', 
    'ť' => 't', 
    'č' => 'c', 
    'ý' => 'y', 
    'ů' => 'u', 
    'ú' => 'u', 
    'ě' => 'e', 
    'ď' => 'd', 
    'ó' => 'o' 
]); 

輸出:

Prilis zlutoucky kuň upel dábelské ody. 

Demo

1

一個簡單且經過嘗試的解決方案(基於this answer),線束​​將字符串「從給定編碼轉換爲ASCII字符」。

$input = 'Příliš žluťoučký kůň úpěl ďábelské ódy.'; 
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input); 
echo $input; 

Example


說明

你面臨的問題是,由於串/文檔的編碼。 strtr()的問題在於它沒有多字節意識,因爲@ChrisForrence在他的comment中說過。

這可能是因爲其中一些字符多於一個字節,所以 它沒有正確映射。

+0

不幸的是,這個解決方案給了我'P ?? li? ?盧?歐·K? ķ? ?p?l ?? belsk?由於某種原因,「dy.'。是否需要設置一些內部PHP設置? –

+0

你使用的是什麼PHP版本,以及你的'.php'文件是什麼文件編碼? – Darren

+0

它以不含BOM的UTF-8編碼。 PHP版本5.4.36-1 –