Việc lưu trữ dữ liệu văn bản đơn giản có chiếm ít không gian hơn so với việc lưu trữ thư tương đương ở dạng nhị phân không?


32

Là một nhà phát triển web, tôi có rất ít hiểu biết về dữ liệu nhị phân.

Nếu tôi lấy câu "Xin chào thế giới.", Chuyển đổi nó thành nhị phân và lưu trữ dưới dạng nhị phân trong cơ sở dữ liệu SQL, có vẻ như các số 1 và 0 sẽ chiếm nhiều không gian hơn các chữ cái. Đối với tôi, dường như việc sử dụng các chữ cái sẽ giống như sử dụng nén, trong đó một biểu tượng là viết tắt của nhiều.

Nhưng đó có thực sự là cách nó hoạt động?

Việc lưu trữ dữ liệu văn bản đơn giản có chiếm ít không gian hơn so với việc lưu trữ thư tương đương ở dạng nhị phân không?


126
Bạn không biết mức tối thiểu tuyệt đối mà mọi nhà phát triển phải biết về mã hóa ký tự . May mắn là người sáng lập trang web này đã viết cho bạn một bài viết. Đọc nó trước khi bạn lập trình lại. joelonsoftware.com/2003/10/08/ trên
Eric Lippert

16
@EricLippert Một bài đọc tuyệt vời và kết quả là tôi cảm ơn bạn tốt hơn.
John

4
Tôi cũng khuyên bạn nên utf8everywhere.org
Basile Starynkevitch

2
Trở thành một nhà phát triển web không phải là lý do để không biết cách mã hóa ký tự và dữ liệu nhị phân hoạt động. Bạn thực sự cần phải nâng cao kỹ năng của mình ...
T. Sar - Phục hồi lại

Câu trả lời:


134

Bản rõ là nhị phân.

Khi bạn ghi Hvào ổ cứng, đầu ghi không khắc hai đường thẳng đứng và đường ngang vào đĩa, nó mã hóa từ tính các bit 010010001 vào đĩa.

Từ đó, rõ ràng là việc lưu trữ dữ liệu văn bản đơn giản chiếm chính xác cùng một dung lượng như lưu trữ dữ liệu nhị phân.

Nhưng rõ chỉ là một trong 2 định dạng nhị phân đặc biệt

Bản rõ có thể được chuyển đổi ngược lại thành các định dạng nhị phân khác. Một chuyển đổi phổ biến là nén mà thường dẫn đến biểu diễn nhỏ gọn hơn, nghĩa là ít bit được sử dụng để thể hiện cùng một thông tin.

Tùy thuộc vào những gì bạn đang sử dụng bản rõ để thể hiện, bạn có thể sử dụng các định dạng nhị phân khác nhau để thể hiện cùng một thông tin. Điều này có thể sử dụng nhiều không gian hơn, nó có thể sử dụng ít hơn.

Ví dụ, các số 51234567có thể được biểu diễn trong bản rõ bằng các ký tự chữ số, dẫn đến các chuỗi bit này trên đĩa 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Ngoài ra, bạn có thể sử dụng phần bù hai bit 32 bit :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Đó là một đại diện ít gọn hơn 5, nhưng đại diện nhỏ gọn hơn 1234567.

Và có một số lượng vô hạn của các đại diện khác có mức độ gọn nhẹ và tính linh hoạt khác nhau, mặc dù, trong thực tế ít hơn nhiều so với nhiều đại diện thực sự được sử dụng.


1 Giả sử UTF-8. Chuỗi bit chính xác cho một ký tự phụ thuộc vào mã hóa cụ thể mà bạn đang sử dụng.

2 Hoặc thực sự, một số định dạng, được đưa ra các bảng mã khác nhau .

3 Nếu bạn đang tự hỏi tám số không ở cuối là gì, thì bạn cần một số cách để biết dữ liệu dài bao nhiêu. Các tùy chọn về cơ bản làm sôi xuống một điểm đánh dấu (tôi đã sử dụng điều này, thông qua một byte null), không gian dành riêng cho việc lưu trữ độ dài (Pascal đã sử dụng một byte để lưu trữ độ dài của chuỗi) hoặc kích thước cố định (được sử dụng trong phần bù của hai phần tiếp theo thí dụ).


6
Một điểm khác biệt nhỏ là sự thể hiện của End-of-line, trong Unix / binary mất một byte (LF) trong khi trong Windows / text mất hai byte (CR-LF).
Glenn Randers-Pehrson

97
+1 cho "đầu ghi không khắc hai đường thẳng đứng và đường kẻ ngang vào đĩa .
Tulains Córdova

@BaardKopperud Bạn nói đúng! ;)
Tulains Córdova

2
@BaardKopperud Có / là LightScribe , nhưng điều đó thực sự không có ý nghĩa đối với việc đọc trên máy tính, mặc dù có lẽ thứ gì đó như Google Goggles có thể đọc một số nhãn LightScribe. Nhưng làm điều đó ở phía lưu trữ dữ liệu thực tế sẽ khá thú vị. Nhắc nhở tôi về những bài hát có đồ họa lạ mắt khi chạy qua máy hiện sóng .
8bittree

2
@ TulainsCórdova Mặc dù trên thực tế, máy Turing hoạt động trên một bảng chữ cái tùy ý, vì vậy về mặt lý thuyết, chúng có thể viết các chữ cái lên băng. Nó chỉ xảy ra như vậy chúng tôi đã giải quyết bằng cách sử dụng một bảng chữ cái hai biểu tượng.
vườn

15

Tôi thấy đây là một điều thú vị tuyệt vời để suy nghĩ. Nhị phân không phải là 1 và 0 theo cách bạn nói về nó.

Hãy tưởng tượng có một số lượng, tôi có thể cho bạn biết số lượng đó theo nhiều cách khác nhau:

  • Nine bằng tiếng Anh
  • Neuf ở Pháp
  • 9 bằng chữ số Ả Rập
  • IX bằng chữ số La Mã
  • 1001 trong nhị phân với chữ số Ả Rập
  • on off off on trong nhị phân có bật / tắt
  • high low low high trong Binary được biểu thị bằng điện áp hoặc đòn bẩy hoặc mực nước hoặc điện tích ... hoặc các từ tiếng Anh 'cao' và 'thấp'

Tất cả đều đại diện cho cùng một điều. Vấn đề ở đây là nhị phân không phải là 1 và 0, đó chỉ là một cách để biểu thị một giá trị.

Khi bạn nói về việc chuyển đổi H thành nhị phân, bạn có thể tưởng tượng nhìn thấy 10101010 trên màn hình - nhưng đó không phải là "nhị phân", đó là một chữ số cho mỗi bit nhị phân.

Có, nếu bạn chuyển đổi Hthành "nhị phân" như mọi người thường nói về nó, và sau đó biểu thị rằng bằng chữ số Ả Rập và sau đó lưu trữ nó, sẽ mất nhiều không gian hơn giống như cách chuyển đổi Hđể aitchchiếm nhiều không gian hơn.

Nhưng bạn có thể thấy rằng nhị phân là một cách biểu thị một đại lượng, theo logic đó, nói rằng "nếu tôi chuyển đổi H thành nhị phân và đại diện cho nó high low high low high low high lowthì sẽ mất 35 ký tự! Điều đó thậm chí còn hơn thế 10101010! Nhưng cả hai đều là 'nhị phân' .. vậy làm thế nào là một cái lớn hơn cái kia?

Ở phía bên kia của việc này là để tự hỏi như thế nào Hđược lưu trữ bởi một máy tính, và để thấy rằng Hbản thân nó chỉ là một cách để đại diện cho một số lượng - cùng số lượng 72, 01001000hoặc seventy twohoặc mã ký tự ASCII H. Đó là câu trả lời của 8bittree rằng văn bản thuần túy nhị phân, nhưng đây là tôi đang cố gắng thể hiện điều đó có nghĩa là gì .

Vì vậy, bạn có được một chút mẫu trong máy tính 01001000và nó có nghĩa là gì? Bất cứ điều gì - có thể được nói về như một con số, như là một phần của tệp zip, như một ký tự, phụ thuộc vào ý định của người tạo ra nó là gì. Nếu bạn biết nó được coi là văn bản thuần túy, thì nó xuất phát từ mã hóa ký tự H-> 01001000và bạn tìm nó theo cách khác trong bảng mã hóa ký tự - ASCII, UTF-8, shift-jis, v.v. và tìm đúng phông chữ nhân vật và đi ra mộtH hoặc bất cứ điều gì. Hoặc xuất hiện sai ký tự nếu bạn sử dụng tra cứu mã hóa khác với người đã tạo nó sử dụng. Đây là liên kết của @Eric Lippert.

Nhưng khi tôi viết điều này, và như bạn nghĩ về nó, Hlà một byte và 01001000là 8 byte, vâng, đó là nhiều không gian hơn. Và vâng, đó là (một đại diện) nhị phân. Nhưng nó ở mức độ trừu tượng cao hơn so với máy tính đang sử dụng - nhị phân được hiển thị bằng các ký tự ASCII, trong đó mỗi ký tự được biểu thị phía sau hậu trường với một mẫu bit nhị phân, mỗi ký tự lớn như Hmột mình.


12

Việc lưu trữ dữ liệu văn bản đơn giản có chiếm ít không gian hơn so với việc lưu trữ thư tương đương ở dạng nhị phân không?

Không bao giờ.

Máy tính của bạn đã lưu trữ dữ liệu văn bản đơn giản trong biểu diễn nhị phân tương đương. Lưu trữ một cái gì đó dưới dạng văn bản thuần túy so với nhị phân chỉ báo hiệu cách máy tính diễn giải luồng nhị phân giống hệt nhau đó .

Đối với tôi, dường như việc sử dụng các chữ cái sẽ giống như sử dụng nén, trong đó một biểu tượng là viết tắt của nhiều.

Đó là sự thật. Một nhân vật sẽ đại diện cho nhiều hơn một bit. Vấn đề là chúng có kích thước khác nhau. Chỉ mất một bit để lưu trữ 1 hoặc 0, nhưng 8 bit (hoặc nhiều hơn) để lưu trữ một ký tự văn bản thuần túy. Bạn không đạt được bất cứ điều gì bằng cách sử dụng các ký tự.

Nếu bất cứ điều gì , bạn có thể nén mọi thứ theo cách khác. Xét cho cùng, 8 bit là 256 giá trị khác nhau có thể, nhưng văn bản thuần túy thường bị giới hạn ở các chữ cái, số và một vài ký tự dấu chấm câu. Nó không cần nhiều bit như nó cần.


3
Vâng, có lẽ đôi khi :-) Hai trường hợp có thể tôi có thể nghĩ ra. 1) Bạn có một chuỗi văn bản ngắn mà bạn nén. Tệp nén chứa một số siêu dữ liệu, làm cho tệp nén lớn hơn chuỗi gốc. 2) Bạn có một số giá trị dấu phẩy động, giả sử 1.2. Lưu trữ dưới dạng văn bản sẽ là 3 byte (4 với dấu kết thúc), trong khi lưu trữ nhị phân kép sẽ mất 8 byte.
jamesqf

5
Câu trả lời thực sự phụ thuộc vào ý của bạn về 'nhị phân'. Ví dụ, UTF-32 chiếm không gian gấp bốn lần so với ASCII, do đó, nếu bằng 'văn bản thuần túy', bạn có nghĩa là ASCII và 'nhị phân', bạn có nghĩa là UTF-32, văn bản đơn giản sẽ chiếm ít không gian hơn nhị phân. Nhưng bạn có thể đảo ngược các định nghĩa và nhận được kết quả ngược lại.
David Conrad

1
@DavidConrad Chà, chỉ mặc váy trên "không có thứ gọi là văn bản đơn giản". Thứ gần nhất bạn có là một tệp nhị phân không có siêu dữ liệu / tiêu đề xác định loại và đoán "phải được mã hóa thành văn bản là XXX!". Đã có lúc "tập tin văn bản đơn giản" có nghĩa là một cái gì đó hợp lý, trong một bối cảnh hạn chế, nhưng nó không thực sự nữa. Điều tốt nhất bạn có thể nhận được là "tất cả dữ liệu trong tệp được mã hóa dưới dạng văn bản" trái ngược với "một số / tất cả các phần của dữ liệu không được mã hóa dưới dạng văn bản".
Luaan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.