String dan Karakter

Perbedaan tipe Char dan String, penggabungan serta interpolasi string, dan dukungan pengenal Unicode pada Julia.

Daftar isi

Topik ini membahas teks pada Julia, yaitu tipe Char untuk satu karakter dan String untuk rangkaiannya, beserta penggabungan, repetisi, dan interpolasi string. Pembahasan juga menyentuh dukungan Unicode, sifat string yang tidak dapat diubah (immutable), dan pencarian teks sederhana. Setelah membacanya, teks dapat disusun, diukur, dan diperiksa menggunakan fungsi pustaka standar.

Char dan String adalah tipe yang berbeda#

Kutip tunggal menandai Char, yaitu satu karakter, sedangkan kutip ganda menandai String, yaitu rangkaian karakter. Keduanya tipe berbeda dan tidak saling dipertukarkan secara diam-diam.

julia
println(typeof('a'))
println(typeof("a"))
println('a' == "a")
text Keluaran
Char
String
false

Walaupun isinya terlihat sama, 'a' bertipe Char sedangkan "a" bertipe String, sehingga perbandingannya bernilai false. Char menyimpan satu titik kode (code point) Unicode, dan nilainya dapat dibaca sebagai angka.

julia
println(Int('a'))
println('a' + 1)
text Keluaran
97
b

Konversi Int('a') menghasilkan 97, yaitu posisi huruf a pada tabel Unicode, sedangkan 'a' + 1 menghasilkan karakter b. Aritmetika semacam ini berguna untuk menggeser huruf, misalnya pada sandi sederhana.

Penggabungan dengan * dan repetisi dengan ^#

Penggabungan string menggunakan operator *, sedangkan repetisi menggunakan operator ^. Operator + tidak didefinisikan untuk string, sehingga penggabungan dengan + memicu MethodError.

julia
sapaan = "selamat" * " " * "pagi"
println(sapaan)
println("ab" ^ 3)
try
    println("ab" * 3)
catch err
    println(typeof(err))
end
text Keluaran
selamat pagi
ababab
MethodError

Pilihan * dan ^ mengikuti aljabar sederhana, yaitu penggabungan "ab" sebanyak tiga kali sama dengan "ab" ^ 3, sebagaimana pangkat merupakan perkalian berulang. Pemanggilan "ab" * 3 tidak memiliki makna yang terdefinisi, sehingga Julia menolaknya alih-alih menebak maksud penulisnya.

Interpolasi dengan tanda dolar#

Interpolasi menanamkan nilai ke dalam string menggunakan tanda $. Variabel ditulis langsung setelah $, sedangkan ekspresi yang lebih panjang diapit tanda kurung.

julia
nama = "Dewi"
umur = 16
println("Nama: $nama")
println("Umur tahun depan: $(umur + 1)")
text Keluaran
Nama: Dewi
Umur tahun depan: 17

Interpolasi $nama membaca variabel pada saat string disusun, dan $(umur + 1) menghitung ekspresinya terlebih dahulu. Tanpa tanda kurung, Julia hanya mengenali nama variabel setelah $, sehingga penulisan $umur + 1 menyisipkan nilai umur lalu menambahkan teks + 1 apa adanya. Alternatif tanpa interpolasi adalah memberikan beberapa argumen ke println(), yang menyambungnya tanpa spasi tambahan. Untuk string yang disimpan atau diteruskan ke fungsi lain, interpolasi lebih ringkas, sedangkan println() multi-argumen praktis untuk keluaran program.

Karakter Unicode, length, dan sizeof#

Julia menyimpan String sebagai byte yang disandikan dalam UTF-8. Fungsi length() menghitung karakter, sedangkan sizeof() menghitung byte yang digunakan untuk menyimpannya, dan keduanya hanya sama untuk teks ASCII murni.

julia
println(length("naïve"))
println(sizeof("naïve"))
println(length("こんにちは"))
println(sizeof("こんにちは"))
text Keluaran
5
6
5
15

Kata naïve memiliki lima karakter tetapi enam byte, karena huruf ï menggunakan dua byte dalam UTF-8. Rangkaian こんにちは berisi lima karakter yang masing-masing menggunakan tiga byte, sehingga totalnya lima belas byte. Pengenal Unicode seperti δ yang muncul pada aturan penamaan variabel memanfaatkan dukungan yang sama.

String tidak dapat diubah#

String pada Julia bersifat immutable, yaitu isinya tidak dapat diganti setelah dibuat. Operasi yang tampak seperti pengubahan memicu error, sedangkan fungsi pemroses teks menghasilkan string baru.

julia
kata = "kucing"
try
    kata[1] = 'K'
catch err
    println(typeof(err))
end
kata_baru = replace(kata, "k" => "K")
println(kata_baru)
println(kata)
text Keluaran
MethodError
Kucing
kucing

Penugasan pada indeks pertama ditolak dengan MethodError karena string tidak menyediakan mekanisme pengubahan elemennya. Fungsi replace() menghasilkan string baru Kucing, dan variabel kata tetap memuat kucing. Pola ini berlaku umum, yaitu fungsi seperti replace() atau uppercase() menghasilkan string baru tanpa menyentuh string aslinya.

Pencarian teks sederhana#

Fungsi occursin() memeriksa apakah sebuah potongan teks muncul di dalam string lain dan menghasilkan true atau false. Pemeriksaannya peka huruf besar-kecil.

julia
kalimat = "Julia dirancang untuk komputasi numerik"
println(occursin("numerik", kalimat))
println(occursin("julia", kalimat))
text Keluaran
true
false

Kata numerik ditemukan, sedangkan julia tidak, karena kalimatnya memuat huruf kapital J. Untuk pola yang lebih kompleks, fungsi match() menerima ekspresi reguler (regular expression) dan mengembalikan kecocokannya, dan keduanya mencukupi kebutuhan pencarian sehari-hari.

Berkas berikut menyatukan beberapa operasi string menjadi satu program kecil yang menyusun baris identitas.

julia identitas.jl
# Penyusun baris identitas sederhana
const JENJANG = "SMA"

nama = "budi"
kelas = "XI-A"

baris = uppercase(nama) * " | " * JENJANG * " " * kelas

println(baris)
println("Panjang karakter: ", length(baris))
println("Panjang byte: ", sizeof(baris))
println("Memuat jenjang: ", occursin(JENJANG, baris))
text Keluaran
BUDI | SMA XI-A
Panjang karakter: 15
Panjang byte: 15
Memuat jenjang: true

Fungsi uppercase() mengkapitalkan nama, operator * menyambungkan potongan-potongannya, dan occursin() memeriksa hasil akhirnya. Karena seluruh karakternya ASCII, panjang karakter dan panjang byte bernilai sama, yaitu lima belas.

Kesalahan umum#

Kesalahan pertama adalah menggabungkan string dengan +, yang selalu memicu MethodError karena operator tersebut tidak didefinisikan untuk string. Perbaikannya menggunakan operator * atau interpolasi $(), tergantung apakah potongan teksnya berdiri sendiri atau tertanam di dalam kalimat.

Kesalahan kedua adalah membandingkan 'a' dengan "a" dan mengharapkan hasil true. Keduanya tipe yang berbeda, sehingga perbandingannya bernilai false. Apabila perbandingan teks memang dikehendaki, konversikan terlebih dahulu dengan string('a') agar kedua sisi bertipe String.

Kesalahan ketiga adalah mengandalkan sizeof() sebagai jumlah karakter. Pada teks dengan aksara non-ASCII, byte yang tersimpan lebih banyak daripada karakter yang terlihat, sehingga penghitungan yang benar menggunakan length().

Kesalahan keempat adalah mencoba mengganti satu karakter melalui indeks. Penugasan semacam itu ditolak karena string bersifat immutable, dan perbaikannya adalah menyusun string baru dengan replace() lalu mengikat ulang namanya apabila diperlukan.

Ringkasan#

  • Char ditulis dengan kutip tunggal dan String dengan kutip ganda, sehingga 'a' == "a" bernilai false karena tipenya berbeda.
  • Penggabungan menggunakan * dan repetisi menggunakan ^, sedangkan interpolasi $nama dan $(ekspresi) menanamkan nilai ke dalam string.
  • length() menghitung karakter dan sizeof() menghitung byte UTF-8, sehingga keduanya berbeda pada teks non-ASCII.
  • String bersifat immutable, sehingga fungsi seperti replace() menghasilkan string baru dan occursin() menangani pencarian.

Referensi#