Aku percaya bahawa, cara terbaik untuk belajar bahasa pengaturcaraan baru adalah dengan membangunkan projek kecil yang praktikal. Untuk projek kali ini, membangunkan tools Rumi ke Jawi Converter di jawi.hardyweb.net dengan bahasa pengaturcaran Golang.
Selain Jawi, aku juga pernah buat projek seperti QR Code generator, mod_sec_audit parser, dan parser Waktu Solat dari e-solat.gov.my. Semua projek ni kecil tapi memberi pengalaman langsung dalam bermain dengan fungsi string manipulation, API integration, dan text processing.
Idea Projek & Perbualan Dengan AI
Pada mulanya, aku tanya GPT:
“Boleh tak buat Jawi converter guna Golang?”
Cadangan GPT ialah:
Mapping Huruf – setiap huruf Rumi dipetakan kepada huruf Jawi/Hijaiyah.
Special Words / Daftar Kata – perkataan yang ejaannya unik atau tidak tepat jika mapping, akan disimpan dalam pangkalan data untuk digunakan kembali.
Contoh Mapping Huruf
Mapping ni terus menukar huruf satu-per-satu.
Special Words
Special words digunakan untuk perkataan yang mapping huruf biasa tidak menghasilkan bunyi atau ejaan tepat. Contohnya:
specialWords := map[string]string{
"allah": "الله",
"akhirat": "اخرَة",
"akhlak": "اخلاق",
"amalan": "عملن",
}
Proses Tukar Tulisan
Projek ni ikut empat langkah utama: ( ini versi awal )
- Clean & Tokenize ◦ Buang whitespace / trim ◦ Pecahkan ayat kepada perkataan ◦ Kecilkan semua huruf ( change to lower case )
- Cek Special Words ◦ Kalau perkataan ada dalam special_words, terus guna versi Jawi tersebut
- Mapping Huruf ◦ Kalau perkataan tiada dalam special_words, tukar huruf menggunakan mapping
- Gabungkan Kembali ◦ Combine token Jawi untuk membentuk ayat
for _, word := range sentenceTokens {
cleaned := clean(word)
if val, ok := specialWords[cleaned]; ok {
output += val
} else {
output += mapLetters(cleaned)
}
}
Cabaran Linguistik
Mapping huruf sahaja tidak mencukupi, contohnya:
• Perkataan “saya”
◦ Mapping biasa → سایا
◦ Bunyi sebenar → ساي
◦ Maka perlu dimasukkan ke special_words.
• Imbuhan depan & belakang (me-, di-, ter-, -kan, -i) memerlukan logic tambahan.
• Perkataan seperti “makan”, “dimakan”, “memakan”, “termakan”, “makanan”, “pemakan” perlu di-handle untuk ejaan yang tepat.
Menyesuaikan Dengan Peraturan Jawi Lanjutan
Apabila aku membaca nota dari Jawi Makmur dan karya Ahmad Ali Karim tentang hukum hamzah, terdapat beberapa peraturan tambahan yang perlu diambil kira selain flow asas yang dicadangkan oleh AI:
1. Penempatan Hamzah – hamzah boleh berada di atas alif (أ), bawah alif (إ), atau di atas waw/ya (ؤ/ئ) bergantung pada vokal dan kedudukan huruf.
2. Huruf Ikut Bunyi – sesetengah perkataan memerlukan penyesuaian huruf berdasarkan sebutan, bukan sekadar mapping huruf literal.
3. Gabungan Huruf & Alif Mati – dalam perkataan tertentu, alif mati atau huruf panjang perlu ditambah/ditinggalkan untuk memastikan ejaan betul.
4. Gelinciran – bunyi akhir tertentu mempengaruhi cara huruf dipetakan, terutama untuk kata nama khas dan kata ganda.
Dengan memasukkan peraturan ini ke dalam projek, output Jawi menjadi lebih tepat dan mendekati sebutan sebenar, berbanding hanya mengikut mapping AI standard + special words.
1. Hukum Derlung
◦ Singkirkan huruf ‘a’ pada akhir perkataan jika bukan ‘da, la, ra, wa, nga’.
2. padanan Huruf h dan k
3. Gelinciran / Kata Ganda / Akronim / Tiga Suku Kata
4. Ejaan Lazim & Kata Asal Arab
Contoh:
// Hukum Derlung
func applyDerlung(word string) string {
endings := []string{"da","la","ra","wa","nga"}
for _, e := range endings {
if strings.HasSuffix(word, e) {
return word
}
}
// Buang huruf 'a' akhir
if strings.HasSuffix(word, "a") {
return word[:len(word)-1]
}
return word
}
Contoh Salah & Betul:
• Salah: باچا / ممباچا / ترباچا / ديباچا / باچاکان / باچاکانلاه / باچاان
• Betul: باچ / ممباچ / ترباچ / دباچ / باچکن / باچکنله / باچاءن.
Berikut adalah pipeline yang digunakan dalam jawi conveter semasa artikel ini ditulis, ia berevolusi dari 4 langkah awal sebagaimana dinyatakan di awal artikel,berkembang kerana melibatkan hukum dan peraturan-peraturan tatabahasa.
1. normalize → tokenize → standardize input.
2. specialWords → override perkataan tertentu.
3. diftong, prefix, suffix, digraph, gelinciran, hukum derlung
4. morpho/phonological rules.
5. applyVowelAndEVariant → baru proses vowel-specific rules (awalan vokal + pepet/taling).
6. applyReduplikasi → last step sebelum mapping, sebab dia modify bentuk token.
7.mapToJawi → transliterasi.
8. joinTokens → final output string.
*pipeline 5 dan 6 tu , masih ada bug, kadang-kadang dia baca , tapi masih tak boleh tukar e pepet dan e taling dengan betul, kata ganda tu pun tak di tukar ke angka dua arab (٢) dengan betul *
Insight & Pembelajaran
1. AI + Programming = Learning Accelerator
◦ GPT bantu cadangkan struktur, tapi ketepatan Jawi masih bergantung pada rule + daftar perkataan.
2. Rujukan Akademik & Linguistik
◦ DBP & Jawi Makmur jadi rujukan untuk ejaan tepat.
◦ Belajar asas Jawi melalui sumber online:
▪ ejawimakmur.my
▪ Ahmad Ali Karim – Jenis Hamzah
▪ Ahmad Ali Karim – Tulisan Jawi Bicara
3. String Manipulation + Loops = Core Logic
◦ Semua proses boleh dilakukan menggunakan operasi string standard dalam programming.
4. Edge Cases & Imbuhan
◦ Kaedah mapping huruf sahaja tidak cukup; perlu hukum & pengecualian untuk bunyi sebenar.
Kenapa Buat Jawi Converter Sendiri Walaupun Ada Jawi Makmur & e-Jawi?
Walaupun platform rasmi wujud, projek ini berfungsi sebagai eksperimen akademik untuk menguji teori linguistik, menguji rule, imbuhan, kata ganda, dan hukum Jawi, sambil menyokong kajian computational linguistics dan digitasi warisan bahasa secara interaktif.
_Digitasi adalah proses mengubah sesuatu yang berbentuk bukan digital kepada digital. Contohnya, apabila menukarkan dokumen kertas dan
menyimpannya dalam data komputer sebagai dokumen digital. _
=================
Rujukan Hukum Ejaan Jawi ΓÇö PUEJBM DBP
Nota recall untuk projek Jawi Converter (Golang). Sumber utama:
- PUEJBM (Pedoman Umum Ejaan Jawi Bahasa Melayu) ΓÇö DBP
- ejawimakmur.my
- ejaan.jawi.net.my
- Ahmad Ali Karim (jenis hamzah)
Contoh yang ditanda ? = perlu semak semula di Jawi Makmur/eJawi sebelum diguna dalam code.
1. Huruf Vokal
| Vokal | Aturan | Contoh |
|---|---|---|
a |
Suku kata tertutup: tak ditulis (harakat tak dipakai). Suku kata terbuka akhir: biasanya gugur (lihat Hukum Derlung) | کيت (kita), ڤاڬي (pagi) |
i |
Hujung suku kata terbuka → ي | کيري (kiri), دوري (duri) |
u |
Hujung suku kata terbuka → و | ساتو (satu), بوکو (buku), دودوق (duduk) |
o |
→ و | موتور (motor), روتي (roti), بولا (bola) |
e pepet |
TAK dilambangkan | بلاجر (belajar), ڬلس (gelas), دڠن (dengan) |
e taling |
Suku kata terbuka awal → ا | امڤت (empat), ڬلاڠ (gelang) |
Bug yang disebut dalam artikel (e pepet vs e taling) berpunca dari aturan di atas ΓÇö kedua-duanya perlu jadi peraturan berasingan sebelum mapping.
2. Diftong (hujung kata)
| Diftong | Tulis | Contoh |
|---|---|---|
au |
و | ڤولاو (pulau) |
ai |
ي | ڤنتاي (pantai) |
oi |
وي | کالوي (kaloi) |
3. Konsonan Homorganik "n"
Bunyi n di akhir suku kata pertama bergantung pada konsonan berikut:
| Bunyi | Contoh |
|---|---|
| n → m (sebelum p,b) | سمڤن (sampan), لمبڠ (lambang) |
| n → n (sebelum t,d,s,c,j) | بينتڠ (bintang) |
| n → ng (sebelum k,g) | بڠس (bangsa), ڤڠک (pangkat) |
Mapping huruf literal (
n→ ن) tak cukup — kena tukar ikut konsonan berikut.
4. "k" Ghaib Akhir → ق
k di akhir yang tak disebut (ghaib), selepas vokal → ditulis ق:
- انق (anak), ماسوق (masuk), باليق (balik), دودوق (duduk), تيکق? (tidak)
5. "h" Ghaib Akhir → Dibuang / ه
- موده (mudah), رومه (rumah), بودوه (bodoh), باسه? (basah)
Artikel sebut "padanan huruf h dan k" tanpa dedah aturan ΓÇö ini dia.
6. Awalan meN- / peN- (Asimilasi Nasal)
Awalan berubah ikut huruf awal kata dasar. Ejaan Jawi ikut bunyi, bukan ejaan Rumi.
| Kata dasar mula dgn | Awalan | Contoh |
|---|---|---|
| p, b, f, m |
mem- / pem-
|
ممباچ (membaca), ممينتا (meminta), ممباچ (pembaca) |
| t, d, s, c, j, z, n |
men- / pen-
|
منوليس (menulis), مندڠر (mendengar), منچوري (mencuri) |
| s → ny | meny- |
مڽاڤو (menyapu) |
| k, g, h, vokal, ng |
meng- / peng-
|
مڠاجر (mengajar), مڠيکت (mengikat), مڠوندي (mengundi) |
| kata akar satu suku kata | menge- |
مڠيچت (mengecat), مڠيبور (mengebor) |
| l, r, w, y |
me- (nasal gugur) |
ملوكيس (melukis), مراوات (merawat) |
7. Imbuhan Lain
-
ber-→ برکج (bekerja), برلاري (berlari) -
ter-→ ترباچ (terbaca) -
di-→ دباچ (dibaca), دتوليس (ditulis) -
ke-...an→ کراجأن? (kerajaan), کماجوان? (kemajuan) -
-kan→ باچکن (bacakan), ماکنکن? (makanan → ماکنن) -
-anselepas vokala→ hamzah: باچاءن (bacaan) -
-anselepas konsonan → ماکنن (makanan), مينومن (minuman) -
-lah→ باچله (bacalah)
8. Kata Sendi vs Imbuhan (di / ke)
| Jenis | Rumi | Jawi |
|---|---|---|
| Kata sendi (jarak) | di rumah | د رومه |
| Imbuhan (cantum) | ditulis | دتوليس |
| Kata sendi | ke sekolah | کي سکوله? |
| Imbuhan | kerajaan | کراجأن? |
Pipeline perlu bezakan ni SEBELUM tokenize, sebab konteks menentukan jarak/cantum.
9. Kata Pinjaman Arab ΓÇö Huruf Khas Mestilah Kekal
Jangan map huruf Melayu. Huruf khas: ث ذ ح خ ص ض ط ظ ع غ + ة.
- مسجد (masjid), خبر (khabar), عادة (adat), حکم (hukum)
- صلاة (solat), شريف (syarif), طبيب? (tabib)
- الله (Allah) — special word tetap perlu
10. Ta Marbutah (ة)
Hanya untuk kata asal Arab yang berakhir bunyi a/at:
- سنة (sunnah), مدرسة (madrasah), مکة (Mekah)
Kata Melayu guna ه/ت biasa, bukan ة.
11. Kata Pinjaman Asing (Inggeris/Tamil/Cina/Siam)
Ejaan ikut bunyi, bukan huruf-ke-huruf:
- ڤروڬرام (program), سترکتور (struktur), دوکتور (doktor)
- ڤوليس (polis), بيݢ (beg), تولن? (tuala → تولا)
- Kluster konsonan dipertahankan: ڬرن? (green), سکوله (sekolah)
12. Kata Ganda
- Ganda penuh → angka dua Arab ٢: اورڠ٢ (orang-orang), رومه٢ (rumah-rumah)
- Ganda separa/berima → eja penuh: sayur-mayur, kuih-muih
Bug yang disebut (kata ganda tak jadi ٢) — fokus pada
applyReduplikasi.
13. Hamzah
Jenis ikut kedudukan & vokal sekeliling:
- أ atas alif — selepas bunyi a / permulaan
- إ bawah alif — bunyi i awal
- ؤ atas wau — selepas bunyi u
- ئ atas ya — selepas bunyi i
Fungsi:
- Pemisah dua vokal (hiatus) dalam kata pinjaman: سؤال (soal), مجم? (majmuk)
- Penanda
asebelum akhiran -an: باچاءن (bacaan)
14. Hukum Derlung
Buang a akhir kecuali kata berakhir da, la, ra, wa, nga:
func applyDerlung(word string) string {
endings := []string{"da", "la", "ra", "wa", "nga"}
for _, e := range endings {
if strings.HasSuffix(word, e) {
return word
}
}
if strings.HasSuffix(word, "a") {
return word[:len(word)-1]
}
return word
}
Salah → Betul: باچا → باچ · ممباچا → ممباچ · ترباچا → ترباچ · ديباچا → دباچ
15. Gelinciran
Bunyi akhir mempengaruhi pemetaan huruf ΓÇö terutamanya kata nama khas & kata ganda. Perlu senarai pengecualian/perkataan, bukan formula tunggal.
16. Kata Nama Khas, Akronim, Singkatan
- Kata nama khas: eja ikut sebutan tempatan, rujuk DBP
- Akronim: eja huruf demi huruf, contoh رم? (RIM), ملايو? — semak DBP
- Singkatan: kekal huruf Latin dalam konteks teknikal? ΓÇö rujuk ejaan rasmi
17. Angka & Tanda Baca
- Kata ganda penuh → ٢ (bukan tulis dua kali)
- Tanda baca Jawi: guna tanda baca standard (titik, koma, ? !) ΓÇö tidak ada bentuk khas
- Nombor: guna angka Arab/rumi seperti biasa
Peta ke Pipeline Golang (yang sedia ada)
1. normalize → tokenize → standardize input
2. specialWords → override
3. diftong, prefix, suffix, digraph, gelinciran, hukum derlung
4. morpho/phonological rules
5. applyVowelAndEVariant ← HUKUM #1 (vokal pepet/taling/a/i/u/o)
6. applyReduplikasi ← HUKUM #12 (kata ganda ٢)
7. mapToJawi → transliterasi
8. joinTokens
Yang PERLU DITAMBAH ke Pipeline
| # | Hukum | Di mana masuk |
|---|---|---|
| 1 | Asimilasi nasal meN-/peN-
|
Langkah 3 (prefix) ΓÇö sebelum mapping, ikut huruf awal kata dasar |
| 2 | Pengesanan kata pinjaman Arab → kekal huruf khas | Langkah 2/3 — sebelum mapping huruf biasa |
| 3 | Ta marbutah (ة) | Sama dengan #2 |
| 4 |
k ghaib → ق / h ghaib buang |
Langkah 4 (phonological) |
| 5 |
n homorganik (→ m/ng/ny) |
Langkah 4 |
| 6 | Vokal penuh (pepet/taling) | Langkah 5 ΓÇö asingkan e pepet & e taling |
| 7 | Kluster konsonan pinjaman asing | Langkah 4 |
| 8 | Kata sendi vs imbuhan (di/ke) | Sebelum tokenize (langkah 1) |
Sumber
- PUEJBM ΓÇö DBP (rujukan utama, bukan hanya Jawi Makmur)
- https://ejawimakmur.my/02-modul-jawi.html
- https://ahmadalikarim.wordpress.com/2021/07/03/tulisan-jawi-kisah-hamzah-yang-digelar-tiga-suku/
- https://ahmadalikarim.wordpress.com/2021/07/04/tulisan-jawi-bicara-jenis-jenis-hamzah/
- https://ejaan.jawi.net.my
Nota: contoh bertanda
?belum disahkan ΓÇö semak dulu sebelum jadi rule.
Kesimpulan
Projek Jawi Converter bukan sekadar latihan pengaturcaran Golang. Ia adalah penghubung antara teknologi dan warisan budaya. Ini hanyalah satu usaha kecil aku untuk Malaysia – kendatipun begitu, projek Jawi Converter ini adalah sumbangan peribadi untuk melestarikan bahasa, budaya, dan warisan Melayu, sambil membina kemahiran teknologi moden.
Nota Kaki
Untuk perkataan Arab atau serapan perkataan Arab (perkatan Arab yang di Melayukan), seeloknya rujuk Ustaz- Ustazah, kerana ia melibatkan makraj dan sifat huruf Hijaiyah ( 30 abjad dalam bahasa Arab )
Rujukan / Citations
1. DBP & Jawi Makmur – sumber rasmi untuk ejaan Jawi standard
◦ https://ejawimakmur.my/02-modul-jawi.html
2. Ahmad Ali Karim – Jenis Hamzah – pembelajaran asas hukum hamzah dan penulisan Jawi
◦ https://ahmadalikarim.wordpress.com/2021/07/03/tulisan-jawi-kisah-hamzah-yang-digelar-tiga-suku/
3. Ahmad Ali Karim – Tulisan Jawi Bicara – panduan lanjut jenis hamzah & ejaan Jawi
◦ https://ahmadalikarim.wordpress.com/2021/07/04/tulisan-jawi-bicara-jenis-jenis-hamzah/
4. Rumi → Jawi Mapping & Linguistic Rules – kombinasi rule-based & special words yang dirujuk dari DBP/Jawi Makmur


Top comments (0)