PHP: substr() vs. mb_substr()

substr v mb_substr utf-8

Ada satu permasalahan. Kadang kala akan berlaku masalah data rosak (corrupt) apabila ditarik menggunakan XHR. Tetapi bukan pada setiap masa. Cuma akan berulang dalam beberapa hari mengikut ‘mood’ sistem.

Suspek #1

Driver PHP-PDO-MSSQL mempunyai bug yang mungkin memberikan data yang tidak betul dalam beberapa keadaan.

Hujah: Masalah tidak berlaku di development dan staging server.

Tetapi masalah ini agak disangsi kerana data di live tidak pernah dimasukkan ke dalam development atau staging server sebagai testing.

Suspek #2

Tulisan cina.

Hujah: Masalah ini hanya akan berlaku apabila terdapat di dalam kumpulan data yang dipanggil menggunakan XHR tersebut adalah karakter cina. Aku dah cuba untuk tulis tulisan bahasa cina untuk melihat adakah disebabkan tetapan unicode tetapi masih sama. Tiada masalah di staging dan development server.

Tetapi aku nampak sudah dekat dengan masalah kerana klunya ada disitu. Tulisan cina/jepun/korea. Aku cari adakah masalah tersebut hanya akan keluar jika tulisanya panjang berjela.

Ya betul. Apabila sampai ke sesuatu kepanjangan, akan ada masalah. Tetapi apabila kurang daripada itu tiada masalah.

Bedah Kod

Aku buka kod untuk melihat dimana masalah tersebut berlaku, dan aku lihat ada data yang melebihi sesuatu kepanjangan akan dipotong kepada ayat yang lebih pendek. Kaedah yang digunakan adalah substr(). Sebenarnya tiada apa masalah pun menggunakan substr() sebab selama ini memang aku pun guna substr(). Tetapi masalah ini perlu aku kaji kenapa karakter cina mempunyai masalah tersebut.

substr-for-utf-8-mb-substr

Di dalam ruangan komen di php.net ada komen mengatakan bahawa untuk UTF-8, sila gunakan mb_substr().  Sebenarnya aku tak pasti apa tu mb_substr().

multi-byte safe substr() operation

Ah. Itu dia, substr() bukan multi-byte safe kalau nak buat potongan ayat untuk ayat yang mempunyai UTF-8. Aku cuba sendiri membandingkan antara substr() dengan mb_substr()

substr mb_substr chinese character

Daripada contoh dalam gambar tu apabila aku gunakan substr() akan keluar ralat (gambar atas sekali) atau ? pada gambar di atas. Tetapi pada contoh kedua aku berjaya potong ayat tersebut tanpa masalah. Ini kerana dalam satu karakter UTF-8 seperti jepun atau cina mempunyai lebih daripada satu byte. Daripada tekaan aku, perkara sama akan terjadi kalau gunakan tulisan jawi. Tapi aku tak rajin nak cuba.

Konklusi

Kalau kau perlu potong ayat daripada ayat yang panjang dan ada kemungkinan orang masukkan bukan huruf latin biasa, sila gunakan mb_substr(). Jika tidak, substr() sudah memadai.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.