Có gì khác nhau giữa UTF-8 và UTF-8 without BOM

Có gì khác nhau giữa UTF-8 và UTF-8 without BOM


What's different between UTF-8 and UTF-8 without BOM?

Chắc hẳn các bạn cũng đã ít nhất một lần nghe qua cụm “UTF-8 without BOM” rồi phải không? Vậy thì có thể bạn cũng (đã) thắc mắc sự khác biệt giữa 2 thứ đấy cũng như BOM là gì. Và liệu UTF-8 BOM (còn gọi là UTF-8) hay UTF-8 without BOM tốt hơn 🤔🤔🤔

BOM là gì? UTF-8 BOM

Theo “Unicode Standard“, BOM là viết tắt của “Byte Order Mark“. Mời các bạn xem hình dưới đây

BOM là gì?

Để dễ hình dung, UTF-8 BOM sẽ luôn có 3 bytes EF BB BF ở đầu một file (bạn phải xem ở dạng Hex mới rõ) để xác định / đánh dấu rằng file đó có được lưu ở dạng UTF-8 hay không. Đọc đến đây thì có thể bạn sẽ thắc mắc là vậy thì nó có thực sự cần thiết? Vì cơ bản là file đó đã có dạng UTF-8 rồi còn gì?

Sự khác biệt hay chẳng có gì cả!

Về cơ bản, thực ra không có sự khác biệt chính thức giữa UTF­-8 và UTF­-8 BOM (mập mờ ý), bởi vì về nguyên tắc, 3 bytes EF BB BF sẽ được loại bỏ khi đọc nội dung (string) từ file / stream. Nhưng phải nói thêm, BOM của UTF-8 là một cách rất hay để biết được liệu nội dung đó có được mã hóa (encode) ở dạng UTF-8 hay không, hay nó đơn thuần chỉ là một dạng mã hóa khác. Mà vấn đề là hay thôi thì chưa đủ.

Có rất nhiều loại mã để mã hóa hay định dạng chữ viết của từng khu vực / quốc gia khác nhau, bạn có thể thấy như của Việt Nam là Windows-1258, Châu Âu có nhiều loại như ISO 8859­1, Windows-1252..

Để dễ hình dung, ta có nội dung sau của một file text thuần. [EF BB BF 41 42 43]

Vậy nếu file được đọc dưới dạng ISO­8859­1 thì sẽ có nội dung là “ï»¿ABC“, còn đọc ở dạng UTF-8 thì chỉ có nội dung là “ABC” (đã bỏ đi 3 bytes đầu tiên).

Vậy nên bạn có thể dùng 3 bytes đầu tiên của một file để xem xem file đó được lưu dựa trên chuẩn mã hóa nào, có phải là UTF-8 hay không.

Vấn đề của BOM

Ngoài thực tế dễ thấy là bạn có thể dễ dàng xem loại định dạng của files, thì ta cũng có 3 vấn đề dễ gặp phải của một file được mã hóa bằng UTF-8 BOM.

  1. Những file chẳng chứa gì cả (theo nghĩa đen, chỉ có cái xác file rỗng thôi) sẽ không thực sự “chẳng chứa gì” bởi vì luôn luôn có 3 bytes BOM nằm trong file đó. (Hack não vl chưa nè 😅😅)
    Tóm tắt: File UTF-8 BOM không bao giờ là file rỗng
  2. Những file chỉ chứa dữ liệu là ASCII mà thôi (các bạn đi thi hoặc xử lý dữ liệu đọc từ file phải chú ý) thì không còn là ASCII toàn bộ nữa, bởi vì bộ 3 bytes BOM bản thân nó không phải là ASCII. Điều này có thể làm hỏng toàn bộ bài làm hoặc công cụ đọc nội dung, và rất khó để thay thế  chúng với các công cụ thường gặp. Khi bạn mở lên, hiển nhiên công cụ đọc sẽ tự động loại bỏ 3 bytes BOM đi, nhưng nó vẫn nằm ở đó, và sẽ luôn có trong bộ nhớ khi bạn đọc nó, chỉ là bạn không thấy thôi. Và thế là bạn chết.
    Tóm tắt: 3 bytes đầu tiên của BOM sẽ giết bạn như một con nhái khi đi thi 😄😄
  3. Những trường hợp chia nhỏ file sẽ gặp trục trặc vì 3 bytes BOM luôn cản trở / chắn đường khi bạn nối / ghép nội dung của những file này lại với nhau. 😤😤

BOM có cần thiết không nhỉ?

Theo mình tìm hiểu, phần lớn các nhận định không đánh giá cao BOM và coi nó như đồ thừa khi chỉ dùng nó để xác định rằng nội dung có ở dạng UTF-8 hay không. Giống như khi xét kỹ thì nó không có điều kiện cần (necessary) và đủ (sufficient) để hoàn thành công việc mà đáng ra nó phải nhận.

Điều kiện cần: Thực tế bạn chỉ cần đọc xem liệu các bytes đó có phải UTF-8 hay không (đơn giản là nó khác với ASCII); nếu bạn đọc được, thì tức là nội dung hoàn toàn có thể xem là UTF-8. Nó không cần.

Điều kiện đủ: Một vài trường hợp ngẫu nhiên chắc chắn có thể xảy ra là bạn mã hóa bit nhưng khi lưu xuống lại bị trùng với bộ 3 bytes BOM, nên khi đọc lại 3 bytes này biến mất và thế là hỏng dữ liệu. Tức là nếu chỉ dựa vào 3 bytes để xác định thì sẽ luôn có trường hợp ngoại lệ làm nó ‘sai’ đi. Nó không hữu dụng trong tất cả trường hợp.

Theo Unicode standard thì BOM không được khuyến khích sử dụng, vì nếu ứng dụng là một phiên bản không hỗ trợ việc đọc BOM thì ứng dụng đó hoàn toàn không thể sử dụng được với các nội dung chứa BOM.

Có một cách hay để phát hiện xem một nội dung (string) có ở dạng UTF-8 hay không là hãy thực hiện một bài kiểm tra tính hợp lệ của nội dung đó. UTF-8 có những quy định nghiêm ngặt về giá trị của các chuỗi byte trong nội dung, vì vậy xác suất của một nội dung bị sai lệch (không phải là UTF-8 nhưng bị hiểu là UTF-8) là không đáng kể. Nếu một chuỗi byte tương tự như quy định của UTF-8, thì nó chắc (chắn) là UTF-8.

Vậy là xong rồi, hẹn gặp các bạn ở bài khác 🙂

Nội dung lượm lặt từ Stackoverflow.

Chung Nguyễn Blog dẫn lại từ Jack Reive Blog

Đánh giá bài viết

Có gì khác nhau giữa UTF-8 và UTF-8 without BOM
0/5 0 votes

Comments

Để lại bình luận:
Vui lòng đăng nhập hoặc đăng ký mới tài khoản bạn nhé:
Login Register

Nội dung

    Tags
    Laravel (29) Laravel 5.5 (9) Võ Lâm (6) Bug (5) Scripts Auto Võ Lâm (5) Võ Lâm Truyền Kỳ (4) Auto Lọc Đồ Võ Lâm (4) Laravel 5.7 (4) Blade (3) Laravel Blade (3) Php (3) Laravel Router (3) 10K Brse (2) Kokusho (2) Kanji (2) Android (2) Tự Động Từ (2) Tha Động Từ (2) Trợ Từ (2) Authentication (2) Business Email (2) Laravel 5.4 (2) View (2) Sublime Text (2) Mysql (2) ゆうちょ銀行 (2) Laravel Mail (2) Xampp (2) Laravel Mix (2) Laravel Localization (2) Tiêu Chuẩn Php (2) Hớt Tóc (1) Meros (1) Luyện Nghe Tiếng Nhật (1) Luyện Nói Tiếng Nhật (1) Shadowing (1) Shadowing Japanese (1) Katakana (1) Giáo Trình (1) Party (1) Yotsuya (1) Okonomiyaki (1) Yakisoba (1) Lol (1) Nhật Ký (1) Kanji Study (1) Đồ Dùng (1) Dưa Leo Đẹp Trai (1) Vlog (1) Động Đất (1) Sóng Thần (1) Trần Hoàng Trung Tín (1) Tokyo (1) Wakarimasen (1) Shirimasen (1) Suối Nước Nóng (1) Onsen (1) Đặc Sản Nhật Bản (1) Debugbar (1) Laravel 5.2 (1) Từ Điển (1) Tính Từ (1) Danh Từ (1) Minna No Nihongo (1) Minna No Nihongo 1 (1) Minna No Nihongo 2 (1) Tài Liệu (1) Ngọc Bổ Trợ (1) Liên Minh Huyền Thoại (1) Truyện Ngắn (1) 12 Con Giáp (1) Lễ Hội (1) Itabashi (1) Đường Lưỡi Bò (1) Weibo (1) Cách Sử Dụng Kara (1) Curriculum Vitae (1) Phân Biệt (1) Cách Sử Dụng Youni (1) Cách Sử Dụng Tameni (1) Note (1) Cách Sử Dụng Node (1) Cách Sử Dụng Te (1) Từ Láy (1) Hostinger (1) Kết Nối Mysql Từ Xa (1) Seven Eleven (1) Lawson (1) In Tiết Kiệm (1) Laravel 5.3 (1) Socialite (1) Thuật Toán Sort (1) Kính Ngữ (1) Khiêm Nhường Ngữ (1) Tag (1) Social Authentication (1) Demo (1) Html (1) Form (1) Helper Function (1) Editor (1) Tool (1) Thiết Kế Web (1) Notify (1) Notification (1) Hosting (1) Database (1) Localstorage (1) Client (1) Response (1) Google Cse (1) Blade If (1) Whoops (1) Exception (1) Router (1) Package (1) Update (1) Nhật Bản (1) Chuyển Tiền (1) Dcom (1) Request (1) Validate (1) Atm (1) Eloquent (1) Tips And Tricks (1) Office Professional 2016 (1) Vps Config (1) Laravel 5.6 (1) Laravel Sitemap (1) Postman (1) Lấy Cao Răng Ở Nhật (1) Cryptocurrency (1) Php 7.2 (1) Composer (1) Xampp Virtual Domain (1) Xampp Virtual Host (1) Cách Nạp Tiền Vào Thẻ Dcom (1) Chuyển Tiền Từ Nhật Về Việt Nam (1) Dcom Chuyển Tiền Nhật Việt (1) Gửi Tiền Từ Nhật Về Việt Nam (1) Chuyen Tien Dcom (1) Cài Đặt Laravel (1) Laravel Installation (1) Cấu Hình Laravel (1) Laravel Configuration (1) Cấu Trúc Thư Mục Của Laravel (1) Laravel Folder Structure (1) Laravel Directory Structure (1) Laravel Routing (1) Photoshop Cs6 (1) Recaptcha (1) Excel (1) Editorconfig (1) Error Message (1) Laravel Relationship (1) Many-To-Many (1) Email Verification (1) Ffmpeg (1) Code Standard (1) Code Chuẩn Laravel (1) Đa Ngôn Ngữ (1) Laravel Pagination (1) Laravel Phân Trang (1) Laravel Error (1) Yahoo Mail (1) Chuyển Tiền Việt Nhật (1) Chuyển Tiền Nhật Việt (1) Phím Tắt Sublime Text (1) Laravel 5.5 (1) Wifi Ở Nhật Bản (1) Wifi Tại Nhật Bản (1) Mạng Wifi Ở Nhật Bản (1) Sử Dụng Wifi Ở Nhật Bản (1) Đăng Kí Wifi Ở Nhật Bản (1) Lắp Wifi Ở Nhật Bản (1) Laravel Model (1) Toastr (1) Utf-8 Bom (1) Utf-8 Without Bom (1) Psr-1 (1) Laravel Avatar (1) Psr-2 (1) Thuật Ngữ Laravel (1) Faststone Capture (1) Quay Phim Màn Hình (1) Chụp Ảnh Màn Hình (1) Phần Mềm Chụp Ảnh Màn Hình (1) Best Screen Capture (1) Screen Recorder (1) Nâng Cấp Laravel (1) Upgrade Laravel Version (1) Update Laravel To 5.7 (1) Laravel Validation (1) Laravel Formrequest (1) Laravel Modify Input (1) Chung.luac (1) Cộng Đồng Võ Lâm (1) Võ Lâm Server Test Vĩnh Viễn (1) Mail (0)