當前位置: 首頁> 最新文章列表> iconv_substr 截取字符串時,如何防止發生"字符截斷" 錯誤?

iconv_substr 截取字符串時,如何防止發生"字符截斷" 錯誤?

M66 2025-07-25

三、導致“字符截斷”錯誤的原因

  • :默認編碼可能不是你字符串的實際編碼,導致截取字節數錯誤。

  • 截取長度超出實際字符數:截取位置超出字符串長度時,可能報錯。

  • 字符串本身編碼不一致或損壞


四、如何防止“字符截斷”錯誤?

  1. 明確指定編碼

<span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$offset</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
</span></span>
  1. 保證截取的長度和偏移都是基於字符,不是字節

iconv_substr$offset$length是字符計數,不是字節,但字符串必須是指定的編碼。

  1. 提前檢測字符串長度

使用iconv_strlen來確定字符串長度,避免越界:

 <span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_strlen</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$offset</span></span><span> &gt; </span><span><span class="hljs-variable">$length</span></span><span>) {
    </span><span><span class="hljs-comment">// 處理偏移越界</span></span><span>
}
</span></span>
  1. 錯誤處理

iconv_substr出錯時可能返回false ,要做好判斷:

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$offset</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-comment">// 處理截取失敗,避免程序異常</span></span><span>
}
</span></span>
  1. 使用mbstring 函數作為替代

mb_substr也是多字節安全的字符串截取函數,常用於替代iconv_substr

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_substr</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$offset</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
</span></span>

五、示例代碼

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"這是一個測試字符串,用於演示 iconv_substr 的用法。"</span></span><span>;
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
</span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-number">3</span></span><span>;
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>;

</span><span><span class="hljs-variable">$totalLength</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_strlen</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$offset</span></span><span> &gt; </span><span><span class="hljs-variable">$totalLength</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"截取起始位置超過字符串長度。"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-variable">$substr</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-variable">$offset</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$substr</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"字符串截取失敗,可能存在編碼問題。"</span></span><span>;
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"截取結果:"</span></span><span> . </span><span><span class="hljs-variable">$substr</span></span><span>;
    }
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>