Itu bahkan menjadi sangat transparan sejak lahirnya format UTF-8 Unicode yang cerdik sehingga bahkan seorang pengembang pun mungkin akan tersesat ketika terjadi ketidakcocokan.
RINGKASAN
1. Apa itu penyandian?
⇒ Penjelasan pengkodean dengan contoh konkret
2. format UTF-8
⇒ Fokus pada format Unicode UTF-8 yang secara teoritis menghilangkan masalah penyandian apa pun
3. Masalah pengodean yang terus-menerus
⇒ Mengapa meskipun dalam format Unicode, masalah penyandian tetap relevan?
4. Tentukan pengkodean file
⇒ Kami menawarkan alat standar untuk menentukan penyandian teks dengan mudah
5. Latihan VBA tingkat lanjut
⇒ Cara membuat file Unicode di VBA dengan atau tanpa BOM
Jangan ragu untuk meninggalkan komentar dan meminta dukungan untuk masalah penyandian tertentu
Sebuah string tidak disimpan dalam memori sebagai string melainkan sebagai 0 dan 1 dalam biner
Representasi yang paling mudah dibaca untuk kita dari kode biner ini adalah kode heksadesimal di mana setiap byte mewakili satu karakter dalam ASCII atau ASCII yang diperluas
Contoh
String berikut dikodekan dengan kode "Windows-1252".
“L’expérience est le nom que chacun donne a ses erreurs. ” Oscar Wilde
Dalam kode heksadesimal direpresentasikan seperti yang ditunjukkan di bawah ini
Karakter ke-7 "é" disimpan dalam memori menggunakan nilai heksadesimal berikut. “E9”
Di tabel karakter Windows-1252, kode "E9" sesuai dengan karakter Prancis "é"
Windows-1252 [CP1252]x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF0xNULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI1xDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS2xSP!“#$%&‘[]*+,–./3x0123456789:;?4x@ABCDEFGHIJKLMNO5xPQRSTUVWXYZ[\]^_6x`abcdefghijklmno7xpqrstuvwxyz{|}~DEL8x€‚ƒ„…†‡ˆ‰Š‹ŒŽ9x‘‘“”•–—˜™š›œžŸAxNBSP¡¢£¤¥¦§¨©ª«¬®¯Bx°±²³´µ¶·¸¹º»¼½¾¿CxÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏDxÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßExàáâãäåæçèéêëìíîïFxðñòóôõö÷øùúûüýþÿNamun, jika Anda masuk ke jendela MS-DOS, kode heksadesimal "E9" tidak akan ditampilkan dengan benar
Memang, jendela MS-DOS Prancis akan menampilkan yang berikut ini
Cd \temp
Tes tipe. txt
“L’expÚrience est le nom que chacun donne Ó ses erreurs. ” Oscar Wilde
Ini hanya karena MS-DOS menganggap secara default bahwa teks [pada komputer Prancis] dikodekan menggunakan halaman 850 di bawah
page 850 [DOS latin-1]x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF0xNULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI1xDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS2xSP!“#$%&‘[]*+,–./3x0123456789:;?4x@ABCDEFGHIJKLMNO5xPQRSTUVWXYZ[\]^_6x`abcdefghijklmno7xpqrstuvwxyz{|}~DEL8xÇüéâäàåçêëèïîìÄÅ9xÉæÆôöòûùÿÖÜø£Ø׃AxáíóúñѪº¿®¬½¼¡«»Bx░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐Cx└┴┬├─┼ãÃ╚╔╩╦╠═╬¤DxðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ExÓßÔÒõÕµþÞÚÛÙýݯ´FxSHY±‗¾¶§÷¸°¨·¹³²■NBSPKode heksadesimal "E9" cocok dengan karakter "Ú" dari halaman 850 daftar karakter dan tidak cocok dengan karakter "é" seperti yang mungkin kita duga
Dengan demikian dipahami bahwa file teks sebenarnya adalah pesan kode [bukan pesan terenkripsi] yang harus diterjemahkan menggunakan tabel terjemahan yang tepat.
Oleh karena itu, kesulitannya menjadi dua kali lipat
– Anda harus hati-hati memilih, tergantung pada aplikasi target, pengkodean yang akan digunakan saat menyimpan teks
– Ketika saatnya untuk menampilkan teks, perlu untuk dapat menentukan pengkodean yang digunakan
Blog INVIVOO menggunakan pengodean UTF-8. Tetapi jika Anda bersenang-senang memaksakan penggunaan pengkodean ISO-8859-7 di Internet Explorer menggunakan menu "View => Encoding => More => Greek [ISO]" maka karakter windows-1252 di bawah ini akan salah ditampilkan
x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExFFxðñòóôõö÷øùúûüýþÿMenggunakan ISO-8859-7, karakter di atas akan ditampilkan sebagai karakter di bawah ini
x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExFFxðñòóôáâ÷øùúûüýþÿKita dapat melihat bahwa karakter Barat yang diharapkan sekarang ditampilkan dengan buruk dan ada 2 karakter, bukan hanya satu
Ini karena dalam pengkodean Unicode UTF-8, karakter khusus Barat semuanya dikodekan byte ganda. Dan karena pengkodean ISO-8859-7 [Yunani] menganggap bahwa masing-masing dari dua byte ini adalah karakter tersendiri dalam tabel pemetaannya
Perhatikan bahwa jumlah pengkodean yang ada cukup besar. Masing-masing memiliki alasan yang konsisten setelah Anda mengetahui Sejarah Pengkodean. Mengikuti internasionalisasi yang datang dengan perkembangan Internet, manajemen pengkodean menjadi semakin kompleks karena lingkungan multibahasa
Untungnya, Standar Unicode telah berhasil melewati tantangan untuk mengumpulkan setiap karakter dari setiap pengkodean dalam satu dan hanya tabel karakter. daftar karakter Unicode
Format Unicode lahir dari keinginan untuk menyatukan banyak pengkodean yang ada. Banyaknya kode diperlukan karena sistem selalu menganggap bahwa satu byte berkorespondensi dengan satu karakter. Namun, pada satu byte hanya 256 karakter yang dapat dikodekan. Oleh karena itu, beberapa bahasa memerlukan kode ASCII tambahan mereka sendiri. Bahasa Prancis "é" misalnya sama sekali tidak berguna untuk orang Yunani yang juga perlu mengkode seluruh alfabet mereka sendiri
Solusi Unicode adalah menghilangkan batasan byte tunggal untuk memiliki jumlah karakter yang hampir tak terbatas. Karakter Asia dapat dikodekan misalnya menggunakan 4 byte
Sayangnya ada beberapa versi format Unicode tergantung pada apakah jumlah byte per karakter tetap atau dinamis, dan tergantung pada urutan membaca byte
Kami hanya akan menyajikan format UTF-8 karena cenderung mendominasi karena efisiensinya dalam hal ukuran memori dan karena kompatibilitasnya dengan ASCII. Memang, tidak ada yang membedakan file ASCII lama dari file UTF-8. Hanya ketika karakter khusus digunakan, file UTF-8 akan dibedakan dari ASCII
Karakter khusus dalam UTF-8 disimpan dalam heksadesimal dari 2 hingga 4 byte. Itu dikodekan hanya dengan menghormati peta karakter UTF-8. Entah bagaimana, itu masih sesederhana dulu. Sebuah "kode" selalu merupakan karakter tunggal dalam pemetaan karakter
Jika aplikasi tidak dapat membaca UTF-8 atau jika dipaksa dalam ASCII yang diperluas [seperti pada contoh kami sebelumnya tentang memaksa ISO-8859-7 di internet explorer] maka aplikasi akan membaca setiap byte sebagai satu karakter berbeda. Namun, karakter khusus Eropa Barat semuanya dikodekan pada 2 byte di UTF-8
=> Karena alasan inilah karakter beraksen ditampilkan pada 2 karakter, bukan hanya satu ketika penyandian ditentukan dengan buruk
Anda sekarang tahu hampir segalanya tentang UTF-8
– Ini memiliki kompatibilitas mundur dengan ASCII
– Karakter khusus disimpan pada 2 hingga 4 byte
– Seperti penyandian apa pun, aplikasi yang "membaca" kode heksadesimal harus menggunakan penyandian yang benar
Anda hanya tahu “hampir semuanya” karena ada fitur khusus di Unicode yang masih menimbulkan beberapa masalah kompatibilitas. BOM [Urutan Tanda Byte]. Kami akan membicarakannya di bagian selanjutnya
Setelah presentasi pengkodean teks yang diperlukan ini, kami akhirnya sampai ke poin utama artikel ini melalui pertanyaan berikut
Jika UTF-8 memiliki semua karakter dan dapat mengganti semua kode, mengapa kita masih mengalami masalah penyandian ???
1. Perubahan membutuhkan waktu
Alasan utamanya adalah bahwa sistem lama tidak harus berkembang bersamaan dengan revolusi Unicode. Dengan demikian, mungkin ada beberapa database atau aplikasi atau paket yang mungkin telah diprogram untuk menerima pengkodean tertentu dan cukup sering mereka mengharapkan satu byte per karakter.
2. Kekhususan Microsoft Windows
Microsoft mengambil kebebasan untuk membuat tabel karakternya sendiri yang berasal dari tabel ISO-8859-x. Selain itu, tidak mungkin untuk mengetahui apakah suatu teks menggunakan tabel ISO atau tabel Windows karena keduanya hanya sesuai dengan urutan byte
Kebebasan yang diambil oleh Microsoft ini tidak akan menjadi masalah jika aplikasi Windows menggunakan UTF-8 secara default tetapi tidak demikian. Selama tidak ada karakter khusus di luar tabel Windows-1252, sebagian besar aplikasi Windows tidak menyandikan teks menggunakan UTF-8
Dengan demikian, mengirimkan file teks Windows ke server linux atau aplikasi berpemilik dapat dengan mudah menimbulkan kebingungan
3. Font karakter
Karena Unicode dapat menyandikan semua karakter yang mungkin, itu menjadi mimpi buruk bagi seniman yang membuat font karena menggambar ulang setiap karakter adalah tugas yang sangat besar. Dan mereka tidak melakukannya agar mereka dapat fokus pada bahasa yang mereka minati. Selain itu, standar Unicode dapat menambahkan karakter baru ke tabel dan font yang ada menjadi tidak lengkap
Akibatnya, untuk bahasa eksotis, mungkin perlu bekerja dengan font tertentu
Namun, font hanya memengaruhi tampilan untuk pengguna akhir dan sama sekali tidak akan mengganggu pemrosesan atau penyimpanan basis data string Anda
3. BOM [Byte Order Mark]
Tanda Urutan Byte adalah urutan byte Unicode yang tidak dapat dicetak yang ditempatkan di awal teks Unicode untuk memfasilitasi interpretasinya. Tanda Urutan Byte ini bukan standar atau wajib tetapi memudahkan aplikasi yang kompatibel untuk menentukan subtipe format Unicode dan menentukan arah untuk membaca byte
Ini sering menyebabkan masalah kompatibilitas karena tidak semua aplikasi tahu cara menangani "BOM". Untuk aplikasi yang tidak kompatibel, urutan byte ini dianggap sebagai beberapa karakter normal dalam ASCII yang diperluas. Dalam kasus file UTF-8 yang salah dikenali sebagai file Windows-1252, kita akan melihat 3 karakter aneh di awal file. saya"
Karakter  sesuai dengan string heksadesimal EF BB BF yang merupakan kode untuk menunjukkan ke aplikasi yang kompatibel bahwa file tersebut adalah file Unicode dalam format UTF-8
Masalah lain dari BOM adalah kebingungan yang dapat ditimbulkannya bagi pengguna. EF BB BF sesuai dengan beberapa karakter yang tidak dapat dicetak di UTF-8. Jadi, dalam editor teks Unicode, sulit untuk mengetahui apakah BOM telah diterapkan atau tidak karena tidak terlihat dan juga opsional dalam file UTF-8. Banyak pengguna kemungkinan besar tidak tahu apa itu BOM dan bagaimana BOM dapat merusak aplikasi yang tidak kompatibel
Selain itu, ada lebih banyak BOM yang memungkinkan untuk melihat format Unicode berbeda dari UTF-8 dan umumnya lebih kompatibel dengan yang lain
Karena BOM tidak terlihat oleh pengguna, kebingungan menjadi jelas dan tak terelakkan
Namun, pada bagian di bawah ini, kami akan memberi Anda alat standar sehingga Anda dapat dengan cepat menentukan apakah file Anda seperti yang Anda harapkan.
Terlepas dari asal file, apakah dihasilkan secara otomatis, atau dikirim oleh penyedia data, atau dibuat secara manual, mungkin berguna untuk memverifikasi dengan pasti formatnya dan untuk menunjukkan kemungkinan tag BOM
Jika Anda tidak memiliki akses ke editor teks tingkat lanjut [dan biasanya berbayar], Anda dapat melakukannya dengan mudah menggunakan editor heksadesimal standar di Windows dan linux
Di Windows
- Jendela kunci + R
- Perintah powershell
– CD \temp
– Tes Fhx. txt
Di Linux
cd /rumah/tes/
file -bi tes. txt
=> Linux akan “mencoba” menampilkan format file tetapi jika ingin melihat tag BOM maka perlu mengetikkan berikut ini
tes xxd. txt
Jika ada tag BOM di awal file maka itu adalah teks menggunakan format Unicode
UTF-8 = EF BB BF
UTF-16 Big Endian = FE FF
UTF-16 Little Endian = FF FE
UTF-32 Big Endian = 00 00 FE FF
UTF-32 Little Endian = FF FE 00 00
Yang terpenting, ingatlah bahwa tidak adanya tag BOM tidak berarti bahwa file tersebut bukan file Unicode
Memang, sebaliknya, mungkin perlu menghapusnya untuk meningkatkan kompatibilitas dengan aplikasi Anda
Di bagian selanjutnya, kita akan melihat cara menghapus BOM di VBA untuk menghindari aplikasi downstream yang mogok
Saat Anda membuat file Unicode menggunakan makro VBA yang ditujukan untuk aplikasi sensitif format, Anda mungkin akan menemui beberapa kesulitan dalam menguasai BOM
Sebagai permulaan, Anda dapat menggunakan perintah yang disarankan di bagian sebelumnya untuk memeriksa file keluaran Anda
Untuk membuat file UTF-8 sesuai keinginan Anda – dengan atau tanpa Byte Order Mark – Anda perlu mengetahui batasan VBA berikut
1. Perintah Print #1 tidak menyimpan di UTF-8, Anda akan kehilangan karakter Unicode Anda
Contoh
Buka “c. \Temp\tes. txt” Untuk Keluaran Sebagai #1
Cetak #1, “Ligne 1. Karakter Unicode yang sangat spesial. Ж = D0 96”
2. Perintah SavetoFile dari file “ADODB. Stream” selalu membuat BOM “EF BB BF” pada file UTF-8. Jangan mencari terlalu banyak. tidak ada opsi untuk menulis UTF-8 tanpa BOM tetapi kami akan memberi Anda solusi
Mengetahui dua batasan ini akan menghemat banyak penelitian
Di bawah ini adalah contoh kode yang memungkinkan Anda membuat dua file. aktif dengan BOM “EF BB BF” dan lainnya tanpa BOM
Sub Buat_UTF8[]
Redupkan lStreamUTF8BOM, lStreamBinaireSansBOM Sebagai Objek
Atur lStreamUTF8BOM = CreateObject[“ADODB. Sungai kecil"]
Atur lStreamBinaireSansBOM = CreateObject[“ADODB. Sungai kecil"]
'Kami membuat Arus utama
lStreamUTF8BOM. Ketik = 2 '2 = Ketik Texte
lStreamUTF8BOM. Mode = 3 '3 = Mode Baca dan Tulis
lStreamUTF8BOM. Charset = “UTF-8” ‘format Unicode UTF-8 dengan BOM
lStreamUTF8BOM. Membuka
lStreamUTF8BOM. WriteText “Ligne 1. Karakter Unicode yang sangat spesial. Ж = D0 96” & vbCrLf
lStreamUTF8BOM. Tulis Teks “Ligne 2” & vbCrLf
'menyimpan sebagai UTF-8 dengan BOM
lStreamUTF8BOM. SaveToFile “c. \Temp\UTF8withBOM. txt", 2 '2 = timpa
'menyimpan sebagai UTF-8 tanpa BOM
lStreamBinaireSansBOM. Ketik = 1 '1 = aliran biner
lStreamBinaireSansBOM. Mode = 3 '3 = Mode Baca dan Tulis
lStreamBinaireSansBOM. Membuka
lStreamUTF8BOM. Posisi = 3
lStreamUTF8BOM. Salin Ke lStreamBinaireSansBOM
lStreamBinaireSansBOM. SaveToFile “c. \Temp\UTF8tanpaBOM. txt", 2 '2 = timpa
lStreamBinaireSansBOM. Menyiram
lStreamBinaireSansBOM. Menutup
lStreamUTF8BOM. Menyiram
lStreamUTF8BOM. Menutup
Akhir Sub
Untuk memeriksa hasilnya, Anda dapat membuka file di C. \TEMP\ menggunakan Powershell dan perintah fhx seperti yang ditunjukkan di bagian sebelumnya
Kami telah menunjukkan kepada Anda bagaimana pengkodean bekerja dan apa yang dibawa oleh revolusi UTF-8
Namun inkompatibilitas penyandian dapat tetap ada di antara aplikasi, jadi kami telah menawarkan beberapa alat untuk memeriksa format file Anda serta untuk berkonsultasi dengan Tanda Urutan Byte yang tidak terlihat. Selain itu, Anda sekarang tahu cara membuat beberapa file UTF-8 dengan atau tanpa BOM melalui VBA
Anda sekarang memiliki semua alat untuk membantu mendiagnosis kemungkinan masalah penyandian dan Anda dapat melakukannya hanya dengan menggunakan beberapa alat standar