Apakah menyimpan data teks biasa mengambil lebih sedikit ruang daripada menyimpan pesan yang setara dalam biner?

32

Sebagai pengembang web, saya hanya memiliki sedikit pemahaman tentang data biner.

Jika saya mengambil kalimat "Hello world.", Mengubahnya menjadi biner, dan menyimpannya sebagai biner dalam database SQL, sepertinya 1s dan 0s akan memakan lebih banyak ruang daripada huruf. Sepertinya saya suka menggunakan huruf akan seperti menggunakan kompresi, di mana satu simbol adalah singkatan dari multiple.

Tetapi apakah itu benar-benar cara kerjanya?

Apakah menyimpan data teks biasa mengambil lebih sedikit ruang daripada menyimpan pesan yang setara dalam biner?

john doe
sumber
126
Anda tidak tahu minimum absolut yang harus diketahui setiap pengembang tentang pengkodean karakter . Untungnya pendiri situs ini menulis sebuah artikel untuk Anda. Baca sebelum Anda memprogram lagi. joelonsoftware.com/2003/10/08/...
Eric Lippert
16
@EricLippert Bacaan yang bagus dan saya lebih baik sebagai hasilnya terima kasih.
john doe
4
Saya sarankan juga utf8everywhere.org
Basile Starynkevitch
2
Menjadi pengembang web bukan alasan untuk tidak tahu bagaimana pengkodean karakter dan data biner bekerja. Anda benar-benar perlu memoles keterampilan Anda ...
T. Sar - Pasang kembali Monica

Jawaban:

134

Plaintext adalah biner.

Ketika Anda menulis sebuah Hke hard drive, kepala tulis tidak mengukir dua garis vertikal dan garis horizontal ke piring, itu secara magnetis mengkodekan bit 010010001 ke dalam piring.

Dari sana, seharusnya jelas bahwa menyimpan data teks biasa memakan jumlah ruang yang persis sama dengan menyimpan data biner.

Tapi plaintext hanyalah satu dari 2 format biner tertentu

Plaintext dapat diubah secara terbalik menjadi format biner lainnya. Salah satu transformasi umum adalah kompresi yang biasanya menghasilkan representasi yang lebih kompak, yang berarti lebih sedikit bit yang digunakan untuk mewakili informasi yang sama.

Bergantung pada apa yang Anda gunakan untuk mewakili plaintext, Anda mungkin dapat menggunakan format biner berbeda untuk mewakili informasi yang sama. Ini mungkin menggunakan lebih banyak ruang, mungkin menggunakan lebih sedikit.

Sebagai contoh, angka-angka 5dan 1234567dapat diwakili dalam plaintext menggunakan karakter digit, menghasilkan urutan bit ini pada disk 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Atau, Anda dapat menggunakan komplemen 32-bit two :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Yang merupakan representasi kurang kompak 5, tetapi representasi lebih kompak 1234567.

Dan ada jumlah representasi lain yang benar-benar tak terbatas yang akan memiliki tingkat keringkasan, dan fleksibilitas yang beragam, meskipun, dalam praktiknya jauh lebih sedikit daripada banyak representasi yang benar-benar digunakan.


1 Dengan asumsi UTF-8. Urutan bit yang tepat untuk karakter tergantung pada pengkodean spesifik yang Anda gunakan.

2 Atau benar-benar, beberapa format, mengingat berbagai penyandian .

3 Jika Anda bertanya-tanya apa delapan angka nol di ujungnya, yah, Anda perlu cara untuk mengetahui berapa lama data tersebut. Opsi pada dasarnya mendidih ke marker (saya menggunakan ini, melalui byte nol), ruang yang didedikasikan untuk menyimpan panjang (Pascal menggunakan byte untuk menyimpan panjang string), atau ukuran tetap (digunakan dalam komplemen dua berikutnya contoh).

8bree
sumber
6
Satu perbedaan kecil adalah representasi End-of-line, yang dalam Unix / binary mengambil satu byte (LF) sedangkan di Windows / teks mengambil dua byte (CR-LF).
Glenn Randers-Pehrson
97
+1 untuk "kepala tulis tidak mengukir dua garis vertikal dan garis horizontal ke dalam piring .
Tulains Córdova
@ BaardKopperud Anda benar! ;)
Tulains Córdova
2
@ BaardKopperud Ada / sedang LightScribe , tapi itu tidak benar-benar dimaksudkan untuk membaca komputer, meskipun mungkin sesuatu seperti Google Goggles dapat membaca beberapa label LightScribe. Tetapi melakukan itu di sisi penyimpanan data yang sebenarnya akan sangat menarik. Mengingatkan saya pada lagu-lagu yang memiliki grafis indah ketika dijalankan melalui osiloskop .
8bittree
2
@ TulainsCórdova Meskipun sebenarnya, mesin Turing beroperasi pada alfabet acak, sehingga secara teori mereka dapat menulis surat ke kaset. Kebetulan kami memilih menggunakan alfabet dua simbol.
Gardenhead
15

Saya menemukan ini hal yang menyenangkan untuk dipikirkan. Biner bukan 1s dan 0s dalam cara Anda membicarakannya.

Bayangkan ada kuantitas, saya bisa memberi tahu Anda berapa jumlahnya dengan berbagai cara:

  • Nine dalam Bahasa Inggris
  • Neuf di Perancis
  • 9 dalam angka Arab
  • IX dalam angka Romawi
  • 1001 dalam Biner dengan angka Arab
  • on off off on di Biner dengan on / off
  • high low low high dalam Binary diwakili dengan voltase atau tuas atau level air atau muatan listrik ... atau kata-kata bahasa Inggris 'tinggi' dan 'rendah'

Mereka semua mewakili hal yang sama. Intinya di sini adalah biner bukan 1s dan 0s, itu hanya satu cara untuk mewakili suatu nilai.

Ketika Anda berbicara tentang mengubah H menjadi biner, Anda mungkin membayangkan melihat 10101010 di layar - tapi itu bukan "biner", itu satu digit untuk setiap bit biner.

Ya, jika Anda mengonversi Hmenjadi "biner" seperti yang biasanya dibicarakan orang, dan kemudian menyatakannya dalam angka Arab dan kemudian menyimpannya, itu akan membutuhkan lebih banyak ruang dengan cara yang sama dengan mengonversi Hmenjadi aitchlebih banyak ruang.

Tetapi Anda dapat melihat bahwa biner adalah salah satu cara untuk mewakili suatu kuantitas, baik oleh logika yang mengatakan "jika saya mengubah H menjadi biner dan mewakilinya high low high low high low high lowmaka akan membutuhkan 35 karakter! Itu bahkan lebih dari 10101010! Tapi keduanya sama-sama 'biner' .. jadi bagaimana yang satu lebih besar dari yang lain?

Sisi lain dari ini adalah untuk bertanya-tanya bagaimana Hdisimpan oleh komputer, dan melihat bahwa Hitu sendiri hanya cara yang mewakili kuantitas - kuantitas yang sama 72, 01001000atau seventy twoatau kode karakter ASCII H. Yang merupakan jawaban 8bittree bahwa teks biasa adalah biner, tapi ini saya mencoba menunjukkan apa artinya .

Jadi Anda mendapatkan pola bit di komputer 01001000dan apa artinya? Apa pun - dapat dibicarakan sebagai angka, sebagai bagian dari file zip, sebagai karakter, tergantung apa maksud dari orang yang membuatnya. Jika Anda tahu itu seharusnya teks biasa, maka itu berasal dari pengkodean karakter H-> 01001000dan Anda mencarinya dengan cara lain di tabel pengkodean karakter - ASCII, UTF-8, shift-jis, dll. Dan temukan font yang tepat karakter dan keluar datang Hatau apa pun. Atau keluarlah karakter yang salah jika Anda menggunakan pencarian enkode yang berbeda dari orang yang membuatnya digunakan. Ini adalah tautan @Eric Lippert.

Tetapi ketika saya menulis ini, dan ketika Anda memikirkannya, Hadalah satu byte dan 010010008 byte, ya itu lebih banyak ruang. Dan ya itu (representasi dari) biner. Tapi itu pada tingkat abstraksi yang lebih tinggi daripada yang digunakan komputer - biner ditampilkan dalam karakter ASCII, di mana masing-masing karakter diwakili di belakang layar dengan pola bit biner, masing-masing sebesar Hsendirian.

TessellatingHeckler
sumber
12

Apakah menyimpan data teks biasa mengambil lebih sedikit ruang daripada menyimpan pesan yang setara dalam biner?

Tidak, tidak pernah.

Komputer Anda sudah menyimpan data teks biasa dalam representasi biner yang setara. Menyimpan sesuatu sebagai teks biasa versus biner hanya menandakan bagaimana komputer harus menginterpretasikan aliran biner yang identik itu .

Sepertinya saya suka menggunakan huruf akan seperti menggunakan kompresi, di mana satu simbol adalah singkatan dari multiple.

Itu agak benar. Satu karakter akan mewakili lebih dari satu bit. Masalahnya adalah ukurannya berbeda. Hanya membutuhkan satu bit untuk menyimpan 1 atau 0, tetapi 8 bit (atau lebih) untuk menyimpan karakter teks biasa. Anda tidak mendapatkan apa-apa dengan menggunakan karakter.

Jika ada , Anda bisa mengompres dengan cara lain. Bagaimanapun, 8 bit adalah 256 nilai yang mungkin berbeda, namun teks biasa biasanya terbatas pada huruf, angka, dan beberapa karakter tanda baca. Tidak perlu banyak bit yang dibutuhkan.

Telastyn
sumber
3
Yah, mungkin kadang-kadang :-) Dua kemungkinan kasus yang bisa saya pikirkan. 1) Anda memiliki string teks pendek yang Anda kompres. File terkompresi berisi beberapa metadata, yang membuat file terkompresi lebih besar dari string asli. 2) Anda memiliki beberapa nilai floating point, katakanlah 1.2. Menyimpan sebagai teks akan menjadi 3 byte (4 dengan terminator), sementara menyimpan biner ganda akan membutuhkan 8 byte.
jamesqf
5
Jawabannya benar-benar tergantung pada apa yang Anda maksud dengan 'biner.' Sebagai contoh, UTF-32 memakan ruang empat kali lebih banyak dari ASCII, jadi jika dengan 'teks biasa' yang Anda maksud adalah ASCII, dan dengan 'biner' yang Anda maksud adalah UTF-32, teks biasa akan mengambil lebih sedikit ruang daripada biner. Tetapi Anda dapat membalikkan definisi dan mendapatkan hasil sebaliknya.
David Conrad
1
@ Davidvidon Yah, itu hanya rok pada "tidak ada yang namanya teks biasa". Hal terdekat yang Anda miliki adalah file biner tanpa metadata / header yang mengidentifikasi jenis dan menebak "harus teks yang disandikan sebagai XXX!". Ada saat ketika "file teks biasa" berarti sesuatu yang masuk akal, dalam konteks terbatas, tetapi sebenarnya tidak lagi. Yang terbaik yang bisa Anda dapatkan adalah "semua data dalam file dikodekan sebagai teks" berbeda dengan "beberapa / semua bagian data tidak dikodekan sebagai teks".
Luaan