2015-04-22 39 views
3

我從MySQL db,varchar(255)utf8_general_ci字段獲取數據並嘗試使用PHP將文本寫入PDF。我需要確定PDF中的字符串長度以限制表格中文本的輸出。但我注意到mb_substr/substr的輸出真的很奇怪。使用UTF-8和mb_substr破壞數據

例如:

mb_internal_encoding("UTF-8"); 

$_tmpStr = $vfrow['title']; 
$_tmpStrLen = mb_strlen($vfrow['title']); 
for($i=$_tmpStrLen; $i >= 0; $i--){ 
    file_put_contents('cutoffattributes.txt',$vfrow['field']." ".$_tmpStr."\n",FILE_APPEND); 
    file_put_contents('cutoffattributes.txt',$vfrow['field']." ".mb_substr($_tmpStr, 0, $i)."\n",FILE_APPEND); 
} 

輸出該:

screen shot from npp

npp file link

數據庫:

enter image description here enter image description here

我的問題是額外角色從哪裏來?

+2

你不提供編碼mb_substr;你確定它獲得了正確的編碼嗎?看到[這個答案](http://stackoverflow.com/questions/13953248/php-mb-substr-not-working-correctly),以及。 – xathien

+0

您使用mb_strlen()/ mb_substr()而不是strlen()/ substr(),因爲它可以在中間切割多字節字符,這是正確的。甚至mb_strlen()/ mb_substr()可以做的事情是在中間分割一個複合序列,如「n」和頂部的重音。您可能會將內容轉碼爲非複合形式,其中存在重音字母。 –

+0

在變量設置後,你能向我們顯示'bin2hex($ _tmpStr)'的輸出嗎? – Michas

回答

1
  1. 你需要確保你實際上從數據庫中通過設置獲取數據的UTF-8編碼適當的連接編碼。這取決於您的數據庫適配器,有關詳細信息,請參見UTF-8 all the way through
  2. 您需要告訴您的mb_函數數據使用UTF-8才能正確處理。無論是使用mb_internal_encoding對所有的功能設置此全局或$encoding參數傳遞給你的函數時,你怎麼稱呼它:

    mb_substr($_tmpStr, 0, $i, 'UTF-8') 
    
+0

我確實使用了mb_internal_encoding,但將mb_substr的編碼參數設置爲UTF-8確實可行! – b3wii

0

除了將表和字段設置爲UTF-8,您還需要將mysqli_set_charset('UTF-8')設置爲UTF-8(如果您使用的是mysqli)。

你也試過嗎?

$_tmpStr = utf8_encode($vfrow['title']); 
+0

我已經做這就是爲什麼我不這已瞭解...行爲SET NAMES UTF8&SET CHARACTER SET「utf-8」 – b3wii

+0

你會改善與實際的表結構,並從它的資料很少你的問題? – Izzy

1

額外的字符是兩個字節的UTF-8序列的第一部分。多字節字符串函數的內部編碼可能有問題。您的代碼將文本視爲固定的1字節編碼。在UTF-8,十六進制C5 84 ń,被視爲L「在CP-1250和ļ [IND]在ISO-8859-2,兩個字符。

嘗試執行的腳本的頂部這一個:

mb_internal_encoding("UTF-8"); 

http://php.net/manual/en/function.mb-internal-encoding.php

+0

感謝您指出,但我確實設置了mb_internal_encoding utf-8 – b3wii