2008-10-06 24 views
25

我有一個textarea的窗體。用戶輸入存儲在數據庫中的文本塊。如何將字符串中的智能引號和電子郵件轉換爲字符串?

有時,用戶將從包含智能引號或emdashes的Word中粘貼文本。這些字符出現在數據庫爲:a€「’,“,â€

我應該輸入字符串調用什麼功能智能引號轉換爲常規報價和emdashes定期破折號

我正在使用PHP。

更新:感謝所有迄今爲止的出色答覆。在Joel的有關編碼網站的頁面是非常豐富:http://www.joelonsoftware.com/articles/Unicode.html

在我的環境中的一些注意事項:

MySQL數據庫使用UTF-8編碼。同樣,顯示內容的HTML頁面通過明確設置元內容類型使用UTF-8(更新:)。

在這些頁面上,智能引號和emdashes顯示爲帶有問號的菱形。

解決方案:

再次感謝您的回覆。該解決方案是雙重的:

  1. 確保數據庫和HTML文件 被明確設置爲使用 UTF-8編碼。使用htmlspecialchars()代替 htmlentities()

回答

1

我們經常使用標準字符串替換函數。儘管在這種情況下ASCII/Unicode的性質非常模糊,但它起作用。只要確保你的PHP文件保存在正確的編碼格式等

4

這聽起來像真正的問題是,您的數據庫不使用相同的字符編碼作爲您的網頁(應該可能是UTF-8)。在這種情況下,如果任何用戶提交非ASCII字符,您可能會在數據庫中看到奇怪的字符。找到並修復其中的一些(捲曲的引號和電子短劃線)並不能解決真正的問題。

這是關於migrating your database to another character encoding的一些信息,至少對於MySQL數據庫來說。

1

根據我的經驗,只需接受智能引語並確保您在任何地方使用相同的編碼就會更容易。首先,將此添加到您的表單標記:accept-charset="utf-8"

1

您可以嘗試從ISO-8859-1到UTF-8的mb_ convert_encoding

$str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1'); 

這是假設你想UTF-8,並轉換可以找到合理的替代品...如果不是,mb_str_replace或自己的preg_replace他們。

2

這是一個不幸的常見問題,沒有得到PHP對字符集處理很差的幫助。

我們做的是強制文本通過iconv

// Convert input data to UTF8, ignore any odd (MS Word..) chars 
// that don't translate 
$input = iconv("ISO-8859-1","UTF-8//IGNORE",$input); 

//IGNORE標誌意味着什麼,不能轉換會被扔掉。

如果追加字符串// IGNORE,則無法在目標字符集中表示的字符將被自動丟棄。

+1

這似乎是這樣一個完美的「快速修復」,但遺憾的是它增加了*更多*無效字符使得我的測試用例顯着變差。 – 2009-02-27 21:08:19

+4

如果您知道輸入字符集是拉丁語1,則只能從拉丁語1轉換爲UTF-8。但是,如果輸入字符已經是UTF-8,則只能通過將其從拉丁語1「翻譯」到UTF-8的第二次。 – 2011-02-08 21:17:04

9

MySQL數據庫使用UTF-8編碼 。同樣地,顯示內容的html頁面 正在使用UTF-8的 。

HTML的內容可以是UTF-8,是的,但是您是否明確地將HTML頁面(通過PHP生成)的內容類型(編碼)設置爲UTF-8?請嘗試返回的"text/html;charset=utf-8"一個Content-Type頁眉或添加<meta>標籤您的HTMLS:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> 

這樣,提交給PHP的數據內容類型也將是相同的。

我有一個類似的問題,並添加<meta>標籤爲我工作。

0

這可能不是最好的解決方案,但我會嘗試測試以找出PHP所看到的。假設它看到「 - 」(還有其他一些可能性,如簡單的「」「或」&#8220;「)。然後做一個str_replace來擺脫所有這些並用普通引號替換它們,然後將答案填充到數據庫中。

更好的解決方案可能會涉及使端到端數據通過所有UTF-8,因爲人們試圖在其他答案中提供幫助。

1

你必須確保你的數據庫連接被配置爲接受並向客戶端提供UTF-8(否則它將轉換爲「default」,通常是latin1)。

實際上這意味着運行查詢SET NAMES'utf8';

http://www.phpwact.org/php/i18n/utf-8/mysql

此外,智能引號是Windows-1252字符集,不是ISO-8859-1(Latin-1的)的一部分。與您的問題不太相關,但僅供參考。歐元符號也在那裏。

1

問題出在mysql的字符集上,我用這行代碼解決了我的問題。

mysql_set_charset('utf8',$link); 
+0

這也適用於我,直接添加到運行`INSERT` /`UPDATE`的查詢之上。其他所有內容都正確設置爲UTF8,表格字符集,列歸類和HTML輸出頁面。很高興這終於成功了! – purefusion 2014-02-21 21:41:57

1

您必須手動將單個列的排序規則更改爲UTF8;總體上改變數據庫不會改變這些。

1

如果你正在尋找的同時保持其外觀逃避這些字符的網站,所以你的字符串會出現這樣的:「很高興!」而非「這很無聊」 ...

您可以使用自己的自定義的HTMLEncode函數代替PHP的ヶ輛()的做到這一點:

$trans_tbl = false; 

function htmlEncode($text) { 

    global $trans_tbl; 

    // create translation table once 
    if(!$trans_tbl) { 
    // start with the default set of conversions and add more. 

    $trans_tbl = get_html_translation_table(HTML_ENTITIES); 

    $trans_tbl[chr(130)] = '&sbquo;'; // Single Low-9 Quotation Mark 
    $trans_tbl[chr(131)] = '&fnof;'; // Latin Small Letter F With Hook 
    $trans_tbl[chr(132)] = '&bdquo;'; // Double Low-9 Quotation Mark 
    $trans_tbl[chr(133)] = '&hellip;'; // Horizontal Ellipsis 
    $trans_tbl[chr(134)] = '&dagger;'; // Dagger 
    $trans_tbl[chr(135)] = '&Dagger;'; // Double Dagger 
    $trans_tbl[chr(136)] = '&circ;'; // Modifier Letter Circumflex Accent 
    $trans_tbl[chr(137)] = '&permil;'; // Per Mille Sign 
    $trans_tbl[chr(138)] = '&Scaron;'; // Latin Capital Letter S With Caron 
    $trans_tbl[chr(139)] = '&lsaquo;'; // Single Left-Pointing Angle Quotation Mark 
    $trans_tbl[chr(140)] = '&OElig;'; // Latin Capital Ligature OE 

    // smart single/ double quotes (from MS) 
    $trans_tbl[chr(145)] = '&lsquo;'; 
    $trans_tbl[chr(146)] = '&rsquo;'; 
    $trans_tbl[chr(147)] = '&ldquo;'; 
    $trans_tbl[chr(148)] = '&rdquo;'; 

    $trans_tbl[chr(149)] = '&bull;'; // Bullet 
    $trans_tbl[chr(150)] = '&ndash;'; // En Dash 
    $trans_tbl[chr(151)] = '&mdash;'; // Em Dash 
    $trans_tbl[chr(152)] = '&tilde;'; // Small Tilde 
    $trans_tbl[chr(153)] = '&trade;'; // Trade Mark Sign 
    $trans_tbl[chr(154)] = '&scaron;'; // Latin Small Letter S With Caron 
    $trans_tbl[chr(155)] = '&rsaquo;'; // Single Right-Pointing Angle Quotation Mark 
    $trans_tbl[chr(156)] = '&oelig;'; // Latin Small Ligature OE 
    $trans_tbl[chr(159)] = '&Yuml;'; // Latin Capital Letter Y With Diaeresis 

    ksort($trans_tbl); 
    } 

    // escape HTML  
    return strtr($text, $trans_tbl); 
} 
0

實際上這個問題並沒有在PHP中發生,但是它發生在JavaScript中,這是由於從Word複製/粘貼的,所以您需要在將文本傳遞給PHP之前用JavaScript解決您的問題,請參閱此答案https://stackoverflow.com/a/6219023/1857295

相關問題