2013-04-07 168 views
0

我閱讀了很多關於如何將UTF-16轉換爲UTF-8的帖子,但沒有人建議如果我同時使用這兩種方法。我試圖將使用PHP的UTF-16和UTF-8字符的電子郵件正文文本插入到SQL Server 2008表列(UTF-8)中。將UTF-16和UTF-8文本字符串轉換爲UTF-8

我用iconv()從UTF-16轉換爲UTF-8,但正如我說,這是不夠的,因爲它不處理UTF-8:

$email->description_html = iconv("UTF-16","UTF-8//TRANSLIT",$that->getMessageText(
           $msgNo, 'HTML', $structure, $fullHeader,$clean_email)); 
$email->description  = iconv("UTF-16","UTF-8//TRANSLIT",$that->getMessageText(
           $msgNo, 'PLAIN', $structure, $fullHeader,$clean_email)); 

我想這兩個UTF-16和UTF-8,但它不工作,給出了一個數據庫錯誤:

can't convert UTF-16 to UTF-8

$email->description_html= iconv('','UTF-8',$that->getMessageText(
           $msgNo, 'HTML', $structure, $fullHeader,$clean_email)); 

我不知道自己還能做什麼,請幫助。

+3

在一個文本字符串中不應該有「具有UTF-16和UTF-8」這樣的事物。如果是這樣,則字符串被破壞。必須有一個指示符說明使用哪種編碼,並且只有這種編碼。必須信任該指標以將字符轉換爲其他編碼。如果不起作用:指責錯誤地聲明編碼不正確的來源。 – Sven 2013-04-07 19:33:40

+0

謝謝Sven,在這種情況下,我在同一封電子郵件中使用了兩個ecodings:使用防病毒程序掃描的希伯來字符(UTF-8)的電子郵件,其中添加了一封電子郵件擴展文本,它被驗證 - 該電子郵件擴展或稱爲附件,只是它不完全是一個附件...)是UTF-16(就像NDR - 未送達報告擴展,自動添加到電子郵件文本)。當我嘗試插入到數據庫(UTF-8)時,出現字符串爲UTF-16的錯誤。當我把它作爲UTF-16處理時,我可以不知道有UTF-8的字符。 – Rodniko 2013-04-08 02:46:57

+1

然後你的防病毒程序就被打破了。它不應該使用不同的編碼將文本添加到電子郵件正文部分。 – nwellnhof 2013-04-08 13:57:50

回答

1

在一個文本字符串中不應該有「具有UTF-16和UTF-8」這樣的事物。如果是這樣,則字符串被破壞。必須有一個指示符說明使用哪種編碼,並且只有這種編碼。必須信任該指標以將字符轉換爲其他編碼。如果不起作用:指責錯誤地聲明編碼不正確的來源。

至於電子郵件:有可能有一個多部分郵件有兩個(閱讀:多於一個)不同的部分與兩個不同的多部分頭,他們都說不同的編碼。處理這一點必須通過應用解析多部分郵件的規則來完成,即不能將整個郵件視爲單個字符串,但必須先將這些部分分開 - 然後對每個部分都有一個完全有效的單一編碼方案。 :)

+0

術語「多部分郵件」是我一直在尋找的術語。這完全是我的情況!我只是不知道它被稱爲多部分,所以我不能谷歌它。謝謝! – Rodniko 2013-04-09 04:57:12