2009-12-29 96 views
24

當我使用substr()我在最後PHP函數SUBSTR()錯誤

$articleText = substr($articleText,0,500); 

得到一個奇怪的角色,我有500個字符的輸出和< -

我怎樣才能解決這個問題?這是一個編碼問題嗎?我的語言是希臘語。

+0

有沒有看到(英國)英語同樣的事情。 – alimack 2014-08-25 11:03:32

回答

56

substr使用字節計數,而不是字符。

希臘語可能意味着您正在使用一些多字節編碼,如UTF-8 - 並且每個字節的計數對這些不太好。

也許使用mb_substr可以提供幫助,在這裏:mb_*函數專門爲多字節編碼創建。

+4

每一天學習越來越多...謝謝你stackoverflow! – 2011-12-19 10:07:07

+1

非常感謝。但就我而言,主要的是在使用'mb_ *'函數之前添加'mb_internal_encoding(「UTF-8」);''。沒有添加它,我仍然看到正方形。 – ivkremer 2013-12-27 15:46:25

+0

@Kremchik如果你使用'mb_substr($ short,0,75,'utf-8')',你將看不到正方形。那麼你不需要在'mb_substr'之前使用'mb_internal_encoding'。 – trejder 2014-06-23 12:39:21

6

看起來像是在一半的地方切一個unicode角色。使用mb_substr代替unicode安全的字符串切片。

+1

...在使用'utf-8'作爲'mb_substr'的​​第四個參數之前調用'mb_internal_encoding('utf-8')'。 Doc說,它是可選的,當它被省略時,將使用內部字符編碼值,但想法是(在PHP doc中的其他地方解釋),PHP的「內部編碼」幾乎總是「別的東西」而不是你的頁面編碼。因此,爲了切分UTF8字符串,需要此第四個參數或調用'mb_internal_encoding('utf-8')'。 – trejder 2014-06-23 12:42:49

19

使用mb_substr相反,它是能夠處理多種編碼,不僅是單字節的字符串作爲substr

$articleText = mb_substr($articleText,0,500,'UTF-8'); 
+2

「UTF-8」部分對我很重要 - 不要忘記它偷看! – JoeRocc 2013-07-10 19:47:23

+1

「UTF-8」作爲可選參數適用於我。請記住,如果您使用字符串長度來確定是否必須剪切,您可能還想使用mb_strlen()。 – 2013-07-15 11:20:35

+2

另一種方法是在任何'mb_ *'命令之前使用mb_internal_encoding('utf-8')'。 – trejder 2014-06-23 12:40:12

0

ms_substr()也適用很好地去除奇怪尾隨換行符爲好,這是我解析HTML代碼後遇到問題。

trim() 

或:

var_dump(preg_match('/^\n|\n$/', $variable)); 

或:

str_replace (array('\r\n', '\n', '\r'), ' ', $text) 

不要趕這個問題沒有被處理。

1

UTF-8編碼字符串的替代解決方案 - 這將在切割子字符串之前將UTF-8轉換爲字符。

$articleText = substr(utf8_decode($articleText),0,500); 

爲了讓articleText字符串返回到UTF-8,將需要額外的操作:

$articleText = utf8_encode(substr(utf8_decode($articleText),0,500)); 
1

使用這個功能,它爲我

function substr_unicode($str, $s, $l = null) { 
    return join("", array_slice(
     preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l)); 
} 

積分:http://php.net/manual/en/function.mb-substr.php#107698

+0

請使用反向鏈接,c/p不正確回答問題。 – 2015-02-14 02:57:44

0

您試圖剪切unicode字符。所以我寧願代替substr()在php中試用mb_substr()

SUBSTR()

substr (string $string , int $start [, int $length ]) 

mb_substr()

mb_substr (string $str , int $start [, int $length [, string $encoding ]]) 

爲SUBSTR()的詳細信息 - Credits => Check Here