Có nên loại bỏ mã hóa ký tự bên cạnh UTF-8 (và có thể UTF-16 / UTF-32) không?


31

Một tiểu thư thú cưng của tôi đang xem xét rất nhiều dự án phần mềm có hàng núi mã để hỗ trợ bộ ký tự. Đừng hiểu sai ý tôi, tôi hoàn toàn tương thích và tôi rất vui khi các trình soạn thảo văn bản cho phép bạn mở và lưu tệp trong nhiều bộ ký tự. Điều làm tôi khó chịu là làm thế nào để phổ biến các bảng mã ký tự không phổ quát được gắn nhãn là hỗ trợ Unicode phù hợp Unicode thay vì một vấn đề khó khăn.

Ví dụ: hãy để tôi chọn PostgreSQL và hỗ trợ bộ ký tự của nó . PostgreSQL giao dịch với hai loại mã hóa:

  • Mã hóa máy khách: Được sử dụng trong giao tiếp giữa máy khách và máy chủ.
  • Mã hóa máy chủ: Được sử dụng để lưu trữ văn bản nội bộ trong cơ sở dữ liệu.

Tôi có thể hiểu tại sao hỗ trợ rất nhiều mã hóa của khách hàng là một điều tốt. Nó cho phép các máy khách không hoạt động trong UTF-8 giao tiếp với PostgreSQL mà không cần phải thực hiện chuyển đổi. Những gì tôi không nhận được là: tại sao PostgreQuery hỗ trợ nhiều mã hóa máy chủ ? Các tệp cơ sở dữ liệu (hầu như luôn luôn) không tương thích từ một phiên bản PostgreSQL sang phiên bản tiếp theo, vì vậy khả năng tương thích phiên bản chéo không phải là vấn đề ở đây.

UTF-8 là bộ ký tự tương thích tiêu chuẩn, tương thích ASCII duy nhất có thể mã hóa tất cả các điểm mã Unicode (nếu tôi sai, hãy cho tôi biết). Tôi ở trong trại rằng UTF-8 là bộ ký tự tốt nhất , nhưng tôi sẵn sàng đưa ra các bộ ký tự phổ quát khác như UTF-16 và UTF-32.

Tôi tin rằng tất cả các bộ ký tự không phổ quát nên được phản đối. Có bất kỳ lý do thuyết phục họ không nên?


4
@mario: Định nghĩa ban đầu của UTF-8 cho phép tối đa 6 byte. Sau đó, nó đã bị hạn chế một cách giả tạo chỉ bao gồm các ký tự mà UTF-16 có thể hỗ trợ.
dan04

6
Ít nhất PostgreSQL cố tình xử lý nhiều mã hóa ký tự. Thật tệ khi phải đối phó với sự pha trộn ngẫu nhiên giữa UTF-8 và windows-1252 vì ai đó không quan tâm.
dan04

5
@ dan04: Làm việc với các văn bản tiếng Nga từng là một nỗi đau, vì họ đã sử dụng nhiều mã hóa khác nhau đáng kể và thường sẽ hack mọi thứ để làm việc bằng cách sử dụng các phông chữ khác nhau (thường nói dối về mã hóa được sử dụng trong siêu dữ liệu của họ). Tất cả trong tất cả, một mớ hỗn độn khủng khiếp. Tôi nghi ngờ họ đã dọn sạch - có lẽ bằng cách chuyển sang UTF-8 - vì số lượng yêu cầu hỗ trợ từ hướng đó đã giảm ngay lập tức.
Donal Fellows

3
Phạm vi Unicode lý thuyết là từ 0 đến 0x10ffff. Chỉ có bấy nhiêu thôi. Đó là những gì tiêu chuẩn Unicode nói. UTF-8 xử lý tất cả Unicode và sẽ luôn như vậy. Nó không bao gồm phạm vi giả thuyết của một mã hóa không phải là Unicode, nhưng nó bao gồm tất cả Unicode.
gnasher729

Câu trả lời:


16

Vì bạn đã đề cập đến PostgreSQL, tôi có thể nói với một số người có thẩm quyền rằng lý do giết người chính tại sao các mã hóa phía máy chủ không phải UTF8 được hỗ trợ chi tiết như vậy là người Nhật cần nó. Rõ ràng, chuyển đổi khứ hồi giống hệt nhau giữa Unicode và các mã hóa "di sản" khác nhau của Nhật Bản không phải lúc nào cũng có thể, và trong một số trường hợp, các bảng chuyển đổi thậm chí khác nhau giữa các nhà cung cấp. Nó thực sự gây trở ngại, nhưng dường như là như vậy. (Hỗ trợ bộ ký tự rộng rãi cũng là một trong những lý do khiến PostgreSQL trở nên phổ biến ở Nhật Bản.)

Vì chúng ta đang nói về một hệ thống cơ sở dữ liệu, một trong những công việc chính là có thể lưu trữ và truy xuất dữ liệu một cách đáng tin cậy, như được xác định bởi người dùng, do đó, việc chuyển đổi bộ ký tự mất mát đôi khi sẽ không thực hiện được. Nếu bạn đang đối phó với các trình duyệt web, chẳng hạn, nơi mà tất cả những gì thực sự quan trọng là liệu kết quả trông OK, sau đó bạn có thể có thể nhận được ngay với hỗ trợ mã hóa ít hơn, nhưng trong một hệ thống cơ sở dữ liệu bạn có cần cài thêm.

Một số lý do khác được đề cập trong các câu trả lời khác cũng được áp dụng như các đối số hỗ trợ. Nhưng miễn là người Nhật phủ quyết nó, hỗ trợ thiết lập nhân vật không thể giảm.


Vì vậy, vì những mã hóa này, việc chuyển đổi văn bản thành UTF-8 và ngược lại có bị mất nói chung không? Ngay cả khi việc chuyển đổi trở lại được thực hiện ngay lập tức (thay vì 6 tháng kể từ bây giờ)?
Joey Adams

Joey Adams: Rõ ràng là như vậy.
Peter Eisentraut

3
Google cho thống nhất Han Han để xem tại sao
Petr Viktorin

7

Hai lý do rõ ràng: tùy thuộc vào dữ liệu bạn đang lưu trữ, chuyển đổi sang định dạng khác có thể mất khá nhiều thời gian và không gian thừa. Nếu bạn đang lưu trữ 400 megabyte thông tin, việc nhân đôi yêu cầu lưu trữ không phải là vấn đề lớn - nhưng nếu bạn đang lưu trữ 400 terabyte thì điều đó bắt đầu có nghĩa là nhiều hơn một chút. Việc chuyển đổi 400 terabyte dữ liệu từ (giả sử) Shift-JIS sang UTF-x cũng có thể mất một chút thời gian.

Điều này trở nên đặc biệt khó khăn nếu bạn có (ví dụ) đảm bảo thời gian hoạt động nói rằng cơ sở dữ liệu sẽ có sẵn cho tất cả, nhưng, giả sử, 10 phút trong bất kỳ năm nào và bạn có một cơ sở dữ liệu được cập nhật vài trăm lần một giây. Xin lưu ý bạn, vẫn có thể quản lý các chuyển đổi chính trong tình huống như vậy, nhưng đó không phải là việc được thực hiện nhẹ nhàng. Trong một số trường hợp, có thể dễ dàng mất nhiều năm lập kế hoạch để sẵn sàng cho việc chuyển đổi như vậy.

Nếu bạn đã bắt đầu với một cơ sở dữ liệu (ví dụ) chỉ hỗ trợ ASCII, có thể có lý do chính đáng để tranh luận liệu có hợp lý không khi thêm hỗ trợ cho tất cả các mã hóa đó - nhưng nếu bạn đã hỗ trợ chúng, sẽ có ít lợi ích từ việc bỏ đi hỗ trợ cho họ.

Đặc biệt lưu ý rằng bạn có thể không đạt được gì bên cạnh cách đơn giản hóa mã hoặc bất cứ thứ gì tương tự. Dù sao họ vẫn cần tất cả các thói quen chuyển đổi để xử lý các chuyển đổi giữa máy khách và máy chủ. Như vậy, bỏ hỗ trợ có nghĩa là bỏ một lệnh gọi hàm (nhỏ) trong đường dẫn "ghi vào đĩa" và "đọc từ đĩa", nhưng rất ít (nếu có gì khác). Nếu bạn đã hỗ trợ ngay cả hai mã hóa trên đĩa, bạn thậm chí sẽ không nhận được điều đó - bạn vẫn có chức năng gọi ở đó, vì vậy tất cả những gì bạn thực sự sẽ là hạn chế phạm vi mã hóa được hỗ trợ bởi chức năng đó.

Ít nhất nếu tôi đang thiết kế cái này, có lẽ tôi sẽ viết lõi của cơ sở dữ liệu để hoạt động trong UCS-4, và sau đó có các thói quen chuyển đổi giữa lõi và đĩa, và giữa lõi và người dùng. Tôi đã sử dụng cùng một tập các thói quen trong cả hai trường hợp, vì vậy cách đơn giản nhất là cho phép lưu trữ đĩa sử dụng chính xác cùng một bộ mã hóa khi khách hàng được phép sử dụng.


1
Shift-JIS không tự đồng bộ hóa, điều này khiến cho việc tìm kiếm trở nên cồng kềnh. Bạn sẽ đạt được sự đơn giản hóa đáng kể bằng cách không hỗ trợ nó.
dan04

@ dan04: nếu bạn đã có thói quen tìm kiếm / lập chỉ mục được chứng minh theo thời gian cho Shift-JIS, thì việc chuyển sang UTF-8 hoặc thậm chí UCS2 có thể sẽ cải thiện hiệu suất không đáng kể. Đối với cơ sở dữ liệu mới, bạn có thể chọn mã hóa tốt hơn, thuận tiện hơn và thường xuyên hơn, như UCS2 hoặc UTF-16.
9000

@ dan04: nếu bạn có thể thoát khỏi việc không hỗ trợ nó, bạn sẽ kiếm được khá nhiều. Miễn là bạn hỗ trợ nó đến từ / đến khách hàng, bạn sẽ bị mắc kẹt với hầu hết sự xấu xí của nó ...
Jerry Coffin

5

Có một số vấn đề khi chỉ lưu trữ UTF-8 trên máy chủ:

  1. Giới hạn của một VARCHAR(20)cột là gì? Đó có phải là 20 byte, hay 20 "ký tự" (và trong Unicode, "ký tự" đó là gì khi bạn kết hợp các ký tự, chữ ghép và v.v.? Tồi tệ hơn, CHAR(20)nơi mà nó thực sự phải dự trữ toàn bộ không gian có thể: Tôi tin vào MySQL, nó dự trữ gấp 4 lần số byte cho cột được mã hóa UTF-8 (vì vậy 80 byte CHAR(20)) chỉ để xử lý trường hợp xấu nhất.
  2. Bạn cần thực hiện chuyển đổi mã hóa liên tục giữa mã hóa máy chủ và mã hóa máy khách của bạn. Bạn có thể lập luận rằng bạn cũng muốn ngừng hỗ trợ nhiều mã hóa máy khách, nhưng trừ khi bạn làm điều đó, thì tất cả các chuỗi cần phải được chuyển đổi mọi lúc. Nếu bạn có thể kết hợp mã hóa máy chủ và mã hóa máy khách, thì không cần phải chuyển đổi.
  3. Như những người khác đã chỉ ra, UTF-8 khá hiệu quả để lưu trữ văn bản tiếng Anh, nhưng nó rất kém hiệu quả đối với các ngôn ngữ khác - đặc biệt là các ngôn ngữ Đông Á. Bạn có thể cho phép sử dụng UTF-16 hoặc UTF-8 làm phù hợp, tôi cho rằng. Hoặc nén văn bản, nhưng điều đó làm cho việc lập chỉ mục và tìm kiếm không hiệu quả.

Như đã nói, tôi đồng ý với bạn: mã hóa di sản chủ yếu là vô nghĩa và Unicode thường là mã hóa tốt nhất để sử dụng cho tất cả các ứng dụng mới. Nếu tôi đã viết một máy chủ cơ sở dữ liệu từ đầu ngày hôm nay, tôi sẽ chỉ hỗ trợ Unicode và không hỗ trợ bất kỳ mã hóa kế thừa nào cả.

Sự khác biệt là PostgreSQL và hầu hết các máy chủ cơ sở dữ liệu khác đang sử dụng ngày nay đã xuất hiện trước khi Unicode là một lựa chọn khả thi. Vì vậy, họ đã có sự hỗ trợ cho các mã hóa di sản (tất nhiên lúc đó họ không có di sản) và không có nhiều điểm xé toạc tất cả các mã đó vì lý do chủ yếu là ý thức hệ.


10
"nhưng nó rất kém hiệu quả đối với các ngôn ngữ khác - đặc biệt là các ngôn ngữ Đông Á" Ngay cả trong thực tế? Hãy xem trang Wikipedia tiếng Trung này . Mặc dù nó hiển thị rất nhiều ký tự tiếng Hoa, nhưng trong nguồn trang, các ký tự ASCII áp đảo chúng gần như 7: 1.
Joey Adams

2
Nếu cột N trong cột CHAR (N) của bạn là một phần của định dạng định danh được xác định rõ (ví dụ: số VIN được xác định là chính xác 17 ký tự), thì có lẽ nó không cần kết hợp các ký tự hoặc chữ ghép. Nếu không, thì N chỉ là một giới hạn tùy ý, cần được giải thích rộng rãi để tránh cắt bớt dữ liệu.
dan04

5
@Joey Adams: điều đó đúng với HTML và XML khi bản thân phần đánh dấu chiếm tỷ lệ lớn trong văn bản (và đó là lý do tại sao tôi nghĩ UTF-8 là một lựa chọn tốt cho web), nhưng trong cơ sở dữ liệu bạn không thường lưu trữ HTML. Vào cuối ngày, đó chỉ là một yếu tố của hai (hoặc ít hơn) sự khác biệt, điều đó thực sự không nhiều.
Dean Harding

5
Bullet point # 2 trong câu trả lời này là không liên quan: nó áp dụng cho dù Unicode có được sử dụng hay không. Bullet point # 3 hoàn toàn phóng đại sự kém hiệu quả và phạm vi của nó. Đồng thời, câu trả lời này nhấn mạnh rất nhiều vấn đề gây ra bởi mã hóa di sản. Thật dễ dàng để cho rằng vấn đề không phải là một vấn đề lớn nếu tất cả những gì bạn từng sử dụng trong cuộc sống của mình là tiếng Anh.
Timwi

2
@Dean: Tôi không biết nó không được phép bình luận về câu trả lời mà không đăng một câu trả lời của riêng tôi.
Timwi

3

Các bảng mã không phổ biến (và cụ thể là một byte) có vị trí của chúng: Trên các hệ thống:

  • Không có đủ bộ nhớ để lưu trữ Cơ sở dữ liệu Ký tự Unicode.
  • Có một phông chữ byte đơn được mã hóa cứng trong ROM.
  • Không có quyền truy cập Internet để cung cấp một nguồn các tệp được mã hóa khác nhau.

Điều đó đúng cho ngày hôm nay đối với một số loại thiết bị nhúng. Nhưng trên máy tính để bàn và trong phòng máy chủ, các bảng mã phi Unicode sẽ bị lỗi thời từ lâu .


3
Tôi đã từng có máy tính ở nhà như thế. Tôi đã loại bỏ hầu hết trong số họ vào đầu những năm 80.
David Thornley

2

UTF-8 là tốt nhất cho bạn 1 người nói tiếng Anh egrialric. Nếu bạn là người Nhật, khoảng 99% nhân vật của bạn sẽ mất 3-4 byte thay vì hai trong UTF-16.

Các phương ngữ phi Latin thực sự bị UTF-8 ở cấp độ kích thước. Đừng quên rằng trong một vài năm, hầu hết khách hàng của bạn có thể là người Trung Quốc và văn bản Trung Quốc có hàng triệu ký tự. Bạn không thể duy trì hiệu quả với UTF-8.

Mặt khác, tôi ghét nó khi tôi có tài liệu văn bản không có trong UTF- một cái gì đó . Tôi sẽ thường xuyên tránh đường nếu tôi cần phải có mã hóa phù hợp. Trong cuốn sách của tôi, mã hóa phi Unicode đã chết.

1. Đừng lấy phần cá nhân. Tôi muốn làm một minh họa đầy màu sắc và tôi không thực sự có ý đó.


3
@Matthew - 4x rõ ràng lớn hơn 4 lần so với x (đối với x dương). Tôi không thấy cách ký hiệu tiệm cận có liên quan ở đây. Tôi chưa bao giờ thấy một đĩa cứng được quảng cáo với tốc độ tăng trưởng tiệm cận. Thông thường, kích thước vẫn giữ nguyên trong suốt vòng đời của ổ đĩa.
Steve314

3
Hàng triệu ký tự sẽ không phù hợp với Unicode. Theo bài viết trên Wikipedia, hiện có khoảng sáu mươi nghìn ký tự Hán. Vì Unicode không chỉ là tiếng Trung Quốc, điều đó có nghĩa là một số lượng lớn các ký tự tiếng Trung sẽ lấy bốn byte trong UTF-16, miễn là UTF-8 ngày nay có được. Sẽ rất thú vị khi xem số liệu thống kê về độ dài của các văn bản tiếng Trung trong UTF-8 và UTF-16.
David Thornley

6
@David:> 99% tất cả các văn bản tiếng Nhật và tiếng Trung sử dụng các ký tự chỉ yêu cầu 2 byte trong UTF-16 và 3 trong UTF-8. Các nhân vật đòi hỏi nhiều hơn là rất hiếm và / hoặc lịch sử.
Timwi

8
Hãy nhớ rằng tiếng Nhật và tiếng Trung thường sử dụng ít ký tự hơn cho mỗi từ. Tôi làm việc với một ứng dụng có các tệp ngôn ngữ lớn bằng tiếng Anh, tiếng Nhật và tiếng Trung, tất cả được mã hóa bằng utf-8. Tệp tiếng Trung thực sự là nhỏ nhất, trong khi tệp tiếng Nhật lớn hơn khoảng 15% so với bản gốc tiếng Anh.
Gort the Robot

3
Vô lý. Bất cứ điều gì có hai byte trong UTF-16 đều mất không quá 3 byte trong UTF-8. Bất cứ thứ gì có bốn byte trong UTF-8 là 4 byte trong UTF-16. Không có "hàng triệu" ký tự Trung Quốc, và rõ ràng chúng không phù hợp với 16 bit.
gnasher729

1

Unicode về cơ bản bị phá vỡ, và dường như chưa bao giờ được sửa chữa. Nó cần phải được thay thế bởi một cái gì đó tốt hơn, một cái gì đó thực sự phổ quát. Nếu bất cứ điều gì cần phản đối, đó là Unicode.

Các vấn đề ví dụ với Unicide:

  • UTF8 là một hack hợp lý, nhưng hầu hết các phần mềm dựa trên UTF16 đã bị hỏng. Hầu hết các ứng dụng Windows hỗ trợ Unicode đều sử dụng UTF16, bao gồm cả hệ điều hành. Vấn đề phổ biến nhất là không hỗ trợ nhiều hơn mặt phẳng cơ bản, tức là các ký tự nhiều từ.

  • Han thống nhất là một thảm họa chưa được thừa nhận. Không thể trộn văn bản Nhật / Trung / Hàn trong một tài liệu mà không có siêu dữ liệu bổ sung và rất khó phát hiện nên sử dụng phông chữ nào.

  • Nhân vật kết hợp là một thảm họa khác. Các lược đồ mã hóa hợp lý hơn ánh xạ một ký tự thành một mã, điều này làm cho các chuỗi xử lý tương đối lành mạnh. Unicode thì không. Unicode thậm chí không nhất quán - Các ký tự Hán chủ yếu là các kết hợp, nhưng không được mã hóa như vậy, trong đó các ký tự kết hợp châu Âu là.

  • Tên của một số người không thể được viết chính xác bằng Unicode hoặc rất dễ bị hiển thị không chính xác do các vấn đề được đề cập ở trên. Điều này có thể gây ra hậu quả nghiêm trọng, ví dụ như khi cố gắng lên máy bay bằng hộ chiếu không khớp với những gì (không chính xác) được in trên vé.

Do những vấn đề này và hơn thế nữa, rất nhiều phần mềm không phải tiếng Anh không thể sử dụng Unicode và dựa vào mã hóa ký tự cục bộ. Điều này đặc biệt phổ biến với phần mềm của Nhật Bản và Trung Quốc.

Lý tưởng nhất, Unicode nên được phản đối. Mã hóa ký tự TRON là một sự thay thế khá tốt cho Unicode và phần lớn tương thích với các phần mềm hiện có sẽ không được cập nhật.


Yêu cầu của bạn rằng không thể trộn lẫn các biến thể khác nhau của ký tự (tiếng Nhật / tiếng Hàn / tiếng Trung) dường như đã lỗi thời kể từ 15 năm qua, tiêu chuẩn Unicode 3.2 vào năm 2002. Bộ chọn biến đổi hỗ trợ Unicode, mã hóa mà sau khi mã hóa han xác định rõ ràng dạng nào nên được hiển thị. Ngoài ra, các ký tự tổ hợp được chỉ định cả là "kết hợp dấu phụ" với các ký tự cơ sở (a °) và glyphs đặc biệt (å), quá trình chuyển đổi chúng ngược lại là "chuẩn hóa". Vì vậy, không, Unicode không bị phá vỡ cơ bản.
Thorsten S.

Bạn minh họa nhiều sai sót. Một số ngôn ngữ sử dụng các ký tự kết hợp, một số ngôn ngữ không và Unicode không thể quyết định ngôn ngữ nào thích. Như tôi đã chỉ ra, hầu hết các phần mềm tuyên bố hỗ trợ Unicode đều không hiểu những vấn đề đó và sẽ hiển thị sai ngay cả với các bộ chọn. Các lập trình viên không nên được kỳ vọng là chuyên gia ngôn ngữ, đó là lỗ hổng cơ bản khác trong Unicode.
người dùng

0

Có thể để viết, nhưng không phải để đọc.

Có rất nhiều nội dung hiện có sử dụng các bảng mã đó và một số mã hóa như base64 không đi đến đâu vì một số giao thức văn bản bắt buộc chúng là những cách để nhúng dữ liệu nhị phân.

Một vấn đề thực sự là tự động phát hiện các bảng mã dẫn đến lỗ hổng bảo mật. Tôi sẽ không thấy một số mã hóa tối nghĩa như UTF-7 biến mất.

Tự động phát hiện cũng có xu hướng xử lý tồi với nội dung được tạo ra bởi các chuỗi byte được ghép nối một cách ngây thơ.


7
Base64 không phải là mã hóa ký tự.
dan04

0

Tôi có thể đồng ý rằng mã hóa ký tự mặc định cho cơ sở dữ liệu và các ứng dụng mới phải là một loại biến thể UTF. Cá nhân tôi sẽ chọn UTF-16 vì đây có vẻ là một sự đánh đổi hợp lý về không gian và độ phức tạp (hơn cả UTF-8). Điều đó nói rằng, một số mã hóa nhân vật vẫn có ý nghĩa trong một số trường hợp nhất định.

  • Nếu bạn đang lưu trữ / chuyển văn bản base64, bạn chỉ cần ASCII và thậm chí bạn có thể thoát khỏi các giao thức được mã hóa 7 bit như email. Chi phí hoạt động thêm của UTF-8 là không cần thiết.
  • Một số tệp và dữ liệu hiện có được xây dựng trên các bảng mã ký tự cũ này, việc có thể đọc chúng là rất quan trọng.

Xin lưu ý rằng có 4 thuật toán chuẩn hóa UTF tiêu chuẩn. Nếu bạn lo ngại về các ký tự đa mã, bạn có thể sử dụng một trong hai thuật toán chuẩn hóa để thu gọn chúng thành ký tự đơn mã tương đương. Sự khác biệt giữa chúng có liên quan đến sự tương đương logic so với tương đương vật lý của các ký tự.


1
Downvoters có thể nói tại sao họ downvot?
Berin Loritsch

3
Tôi đã không downvote, nhưng toàn bộ quan điểm của Base64 là chuyển dữ liệu nhị phân xuống một kênh văn bản. Nếu bạn có thể chọn sử dụng mã hóa nào trên kênh đó, bạn hoàn toàn không sử dụng mã hóa văn bản. Ngay cả khi kênh của bạn thực sự là ASCII đơn giản, cơ sở 64 chỉ sử dụng 6 trong số 7 bit - một chi phí đáng kể đã có.
Steve314

Tôi hy vọng một ai đó không chỉ đọc những điểm viên đạn. Đó là những ngoại lệ khi sử dụng UTF. Và bạn không chính xác về cơ sở 64 chỉ sử dụng 6 trên 8 byte. Bộ "ký tự" ASCII đầu tiên là các ký tự điều khiển không in được, điều này buộc một số ký tự trong base64 sử dụng 7 trong số 8 byte. Nó cố tình tránh bit cao bởi vì tất cả các ký tự đó không được đảm bảo tồn tại trong mọi trang mã, trong khi các ký tự từ 0-127 là.
Berin Loritsch

2
@Berin - (1) không, nhưng công cụ "Tôi đồng ý" không nhiều nếu không có dấu đầu dòng và (2) cơ sở 64 có 64 "chữ số". 64 chữ số có giá trị 6 bit, vì 2 ^ 6 == 64. Cách bạn biểu thị rằng trong một không gian mã 7 bit (hoặc 8 bit, hoặc thậm chí 8 byte nếu bạn phải) tách biệt với bao nhiêu dữ liệu thực sự ở đó. Tránh các ký tự không in, vv là lý do cho chi phí hoạt động - điều đó không có nghĩa là chi phí không tồn tại. Chọn một kênh được thiết kế cho dữ liệu nhị phân và chi phí đó không có ở đó.
Steve314

3
Hãy nhớ rằng base64 đã được phát minh để xử lý việc gửi dữ liệu nhị phân qua kênh chỉ có văn bản. Nó được biết là không hiệu quả (mở rộng 3: 4), nhưng xử lý các hạn chế kỹ thuật trong các tùy chọn vận chuyển nhất định. Di sản sẽ là email và các diễn đàn UseNet, nhưng một ứng dụng hiện đại hơn sẽ nhúng dữ liệu nhị phân vào XML. Đôi khi, kênh thích hợp không tồn tại và bạn phải vượt qua giới hạn của các kênh hiện có.
Berin Loritsch
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.