Chapter String Syntax telah menegaskan bahwa string PHP tersimpan sebagai deretan byte tanpa informasi encoding. Fakta tersebut langsung terasa begitu kita mengukur panjang teks: berapa karakterkah nama yang diinput pengguna, dan apakah deskripsi produk masih muat dalam batas tampilan? Pada Chapter ini kita akan membedah perbedaan antara menghitung byte dengan strlen() dan menghitung karakter dengan mb_strlen(), membangun model mental byte versus karakter, lalu menutup dengan cara memotong teks UTF-8 dengan aman memakai mb_strcut().

Mengukur Panjang dengan strlen #

strlen() adalah fungsi bawaan yang mengembalikan jumlah byte sebuah string. Untuk teks yang seluruh karakternya berada dalam rentang ASCII — huruf a sampai z, digit 0 sampai 9, dan tanda baca umum — satu karakter tepat menempati satu byte, sehingga hasil strlen() cocok dengan hitungan manusia. Sebagian besar teks sehari-hari seperti kode pos atau nama barang berada dalam kondisi aman ini.

php
<?php
$kodePos = "60293";
$mataUang = "Rupiah";

echo strlen($kodePos) . "\n";
echo strlen($mataUang) . "\n";

Output yang Dihasilkan:

text
5
6

Kedua pemanggilan mengembalikan angka yang persis seperti menghitung huruf dengan mata: 60293 memiliki lima karakter, sedangkan Rupiah memiliki enam. Selama teks Anda murni ASCII, strlen() memang cukup dan menjadi pilihan yang ringan. Masalah baru muncul begitu satu karakter tidak lagi sama dengan satu byte.

Byte versus Karakter #

Encoding UTF-8 menyandikan satu karakter ke dalam satu sampai empat byte. Huruf Latin biasa hanya membutuhkan satu byte, tetapi huruf beraksen seperti ç dan õ membutuhkan dua byte, sedangkan emoji umumnya membutuhkan empat byte. Karena PHP tidak melekatkan informasi encoding pada string, strlen() hanya sanggup menghitung byte mentah. Fungsi mb_strlen() dari ekstensi mbstring mengambil jalan berbeda: fungsi tersebut mendekode byte menurut encoding tertentu — secara default UTF-8 — lalu menghitung karakter hasil dekode tersebut.

php
<?php
$kata = "ações";

echo strlen($kata) . "\n";
echo mb_strlen($kata) . "\n";
echo bin2hex($kata) . "\n";

Output yang Dihasilkan:

text
7
5
61c3a7c3b56573

Mari kita bedah keluaran di atas dengan bantuan notasi byte dari bin2hex():

KarakterByte UTF-8Jumlah byte
a611
çc3 a72
õc3 b52
e651
s731

Lima karakter tersebut ternyata tersusun dari tujuh byte. Itulah alasan strlen() mengembalikan 7 sedangkan mb_strlen() mengembalikan 5. Tabel berikut merangkum model mental yang perlu Anda bawa ke setiap penanganan teks:

Aspekstrlen()mb_strlen()
Yang dihitungbytekarakter
Asal fungsiekstensi standardekstensi mbstring
Teks ASCII murnisama dengan jumlah karaktersama dengan jumlah byte
Teks UTF-8 di luar ASCIIlebih besar dari jumlah karaktersesuai hitungan manusia

mb_strlen() juga menerima parameter kedua untuk menyebut encoding secara eksplisit, misalnya mb_strlen($kata, "UTF-8"); tanpa parameter tersebut fungsi memakai encoding internal yang nilainya default UTF-8. Perlu dicatat pula bahwa emoji adalah kasus ekstrem: strlen("🎉") mengembalikan 4 karena satu emoji menempati empat byte, sementara mb_strlen() menghitungnya sebagai satu karakter.

Memvalidasi Panjang Input #

Batas panjang input adalah penggunaan paling umum dari pengukuran string. Bayangkan formulir pendaftaran yang membatasi nama pengguna maksimal sepuluh karakter; pilihan fungsi pengukur menentukan apakah pengguna diperlakukan adil. Dengan mb_strlen(), huruf beraksen dihitung satu karakter sebagaimana mestinya, bukan dua byte.

php
<?php
$namaPengguna = "Budi Santoso";
$batasKarakter = 10;

var_dump(mb_strlen($namaPengguna) > $batasKarakter);
echo "Panjang nama: " . mb_strlen($namaPengguna) . " karakter\n";

Output yang Dihasilkan:

text
bool(true)
Panjang nama: 12 karakter

Nama Budi Santoso terdiri dari dua belas karakter, sehingga perbandingan mb_strlen($namaPengguna) > $batasKarakter bernilai true — sinyal bahwa input tersebut melebihi batas. Ekspresi perbandingan seperti ini nantinya menjadi kondisi pada struktur kontrol di Section Control Flow; untuk sekarang, var_dump() cukup untuk melihat nilainya. Bayangkan sebaliknya batas dihitung memakai strlen(): nama dengan huruf beraksen akan ditolak lebih cepat daripada seharusnya karena tiap huruf dihitung dua.

Memotong Teks dengan mb_strcut #

Kebutuhan berikutnya setelah mengukur adalah memotong: memangkas deskripsi yang terlalu panjang atau menyisakan cuplikan artikel sesuai anggaran tampilan. Fungsi substr() memotong berdasarkan offset dan panjang byte, sehingga potongan bisa jatuh tepat di tengah karakter multibyte dan menghasilkan byte rusak. Fungsi mb_strcut() juga memotong dengan anggaran byte, tetapi tidak pernah membelah sebuah karakter: bila karakter berikutnya tidak muat utuh dalam sisa anggaran, pemotongan berhenti sebelum karakter tersebut.

php
<?php
$kata = "ações";

$potonganByte = substr($kata, 0, 2);
$potonganAman = mb_strcut($kata, 0, 4);

echo bin2hex($potonganByte) . "\n";
echo $potonganAman . "\n";

Output yang Dihasilkan:

text
61c3
aç

Mari kita bedah kedua hasil di atas. substr($kata, 0, 2) mengambil dua byte pertama: 61 (huruf a) dan c3 — setengah dari ç. Byte c3 yang terpotong itulah yang membuat keluaran heksadesimalnya 61c3 bukan karakter utuh; bila byte rusak ini dicetak ke browser, ia tampil sebagai simbol aneh. Sementara itu, mb_strcut($kata, 0, 4) diberi anggaran empat byte: huruf a (satu byte) dan ç (dua byte) terpakai menjadi tiga byte, lalu õ yang membutuhkan dua byte akan membuat total lima — melebihi anggaran — sehingga pemotongan berhenti dan hasilnya aç dengan karakter yang tetap utuh.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh chapter ini dalam satu program utuh yang dapat langsung Anda jalankan.

Ringkasan #

strlen() menghitung byte sedangkan mb_strlen() menghitung karakter — keduanya benar, hanya berbicara dalam satuan yang berbeda. Pilih strlen() untuk urusan ukuran data dan mb_strlen() untuk urusan tampilan serta validasi input manusia. Saat harus memotong teks, mb_strcut() dan mb_substr() menjaga karakter UTF-8 tetap utuh. Dengan kemampuan mengukur dan memotong ini, kita siap bergerak lebih jauh: mencari posisi teks di dalam string, pokok bahasan Chapter Searching dalam String.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

// Mengukur panjang string: byte versus karakter

$kodePos = "60293";
$kata = "ações";

echo "Panjang kode pos: " . strlen($kodePos) . " byte\n";
echo "Panjang kata multibyte menurut strlen: " . strlen($kata) . " byte\n";
echo "Panjang kata multibyte menurut mb_strlen: " . mb_strlen($kata) . " karakter\n";

// Validasi panjang input pengguna
$namaPengguna = "Budi Santoso";
$batasKarakter = 10;

var_dump(mb_strlen($namaPengguna) > $batasKarakter);

// Memotong teks tanpa membelah karakter UTF-8
echo "Hasil substr dalam heksadesimal: " . bin2hex(substr($kata, 0, 2)) . "\n";
echo "Hasil mb_strcut: " . mb_strcut($kata, 0, 4) . "\n";