2017-02-24 130 views
0

我正在創建一個經過身份驗證的用戶可以爲索引站點編寫消息的站點。帶特殊字符的函數

關於消息創建站點我有一個文本框,用戶可以在其中提供消息的標題,以及一個可以編寫消息的文本框。

該消息將被導出到.txt文件,並從標題我創建的.txt文件的標題和這樣的:

標題:這是一個信息(文件名是:thisisamessage .txt)

作爲文件名的原始文本將被存儲在數據庫rekord中,其中的.txt文件名作爲路徑。

轉換用的標題文字我使用的功能,看起來像這樣:

function filenameconverter($title){ 
     $filename=str_replace(" ","",$title); 
     $filename=str_replace("ű","u",$filename); 
     $filename=str_replace("á","a",$filename); 
     $filename=str_replace("ú","u",$filename); 
     $filename=str_replace("ö","o",$filename); 
     $filename=str_replace("ő","o",$filename); 
     $filename=str_replace("ó","o",$filename); 
     $filename=str_replace("é","e",$filename); 
     $filename=str_replace("ü","u",$filename); 
     $filename=str_replace("í","i",$filename); 
     $filename=str_replace("Ű","U",$filename); 
     $filename=str_replace("Á","A",$filename); 
     $filename=str_replace("Ú","U",$filename); 
     $filename=str_replace("Ö","O",$filename); 
     $filename=str_replace("Ő","O",$filename); 
     $filename=str_replace("Ó","O",$filename); 
     $filename=str_replace("É","E",$filename); 
     $filename=str_replace("Ü","U",$filename); 
     $filename=str_replace("Í","I",$filename); 
     return $filename; 
    } 

但是它正常工作的大部分時間,但有時它不是做其工作。 例如:「Pamutkéztörlőadagolóéshigiéniaikéztörlőadagoló」。 它應該像一個.txt文件一樣:

pamutkeztorloadagoloeshigieniaikeztorloadagolo.txt,以及它的大部分時間。 但有時當即時消息給這個這將是:

pamutkă©ztă¶rlĺ'adagolăłă©shigiă©niaikă©ztă¶rlĺ'adagolăł.txt

我匈牙利這樣的標題文本也將匈牙利這就是爲什麼我必須改變角色。

我使用XAMPP與Apache和phpmyadmin。

+0

那麼,你爲什麼要將它保存到一個.txt文件?數據庫可以有一個UTF-8字符編碼,這意味着你不必做這樣的替換,從數據庫中獲取提交的文本會更有意義。或者你有特定的理由不這樣做? – FMashiro

+0

這將解決我認爲的問題,但任何想法爲什麼上述功能不能很好地工作? – zoldingo

+0

這是一個自制功能,我不知道究竟是什麼錯誤,但對類似問題的這個答案可能證明是有用的:http://stackoverflow.com/questions/1525830/how-do-i-use-filesystem -functions功能於PHP-使用UTF-8串 – FMashiro

回答

0

我寧願使用每個文件生成的唯一ID作爲其文件名並將真實姓名保存在單獨的列中。 這樣可以避免有人通過多次上傳文件來覆蓋文件。但是,如果這是你想要,你會在這裏清理的文件名上SO和一個很不錯的,我曾經發現幾個方法是什麼http://cubiq.org/the-perfect-php-clean-url-generator

0

國際

我不認爲這是明智的手動使用str_replace函數此目的。您可以使用自PHP 5.3.0起提供的捆綁的intl擴展。確保XAMPP設置中的擴展名爲turned on

然後,使用transliterator_transliterate()函數來轉換字符串。您也可以將它們轉換爲小寫字母。積分爲simonsimcity

<?php 
$input = 'Pamutkéztörlő adagoló és higiéniai kéztörlő adagoló'; 
$output = transliterator_transliterate('Any-Latin; Latin-ASCII; lower()', $input); 
print(str_replace(' ', '', $output)); //pamutkeztorloadagoloeshigieniaikeztorloadagolo 
?> 

P.S.不幸的是,這個函數的PHP手冊沒有詳細說明可用的音譯器字符串,但你可以看看Artefacto的回答here


的iconv

使用iconv仍然會返回一些很可能沒有預期的變音符號。

print(iconv("UTF-8","ASCII//TRANSLIT",$input)); //Pamutk'ezt"orl"o adagol'o 'es higi'eniai k'ezt"orl"o adagol'o 

mb_convert_encoding

雖然,利用匈牙利ISO編碼轉換爲ASCII或UTF-8也提供了你所提到類似的問題。

print(mb_convert_encoding($input, "ASCII", "ISO-8859-16")); //Pamutk??zt??rl?? adagol?? ??s higi??niai k??zt??rl?? adagol?? 
print(mb_convert_encoding($input, "UTF-8", "ISO-8859-16")); //PamutkéztörlŠadagoló és higiéniai kéztörlŠadagoló 

附:類似的問題也可以發現herehere