Câu hỏi so với


Để xác định bộ ký tự cho HTML5 Doctype, tôi nên sử dụng ký hiệu nào?

  1. Ngắn:

    <meta charset="utf-8" /> 
    
  2. Dài:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    

1387
2018-01-14 22:06


gốc


Sử dụng thẻ <meta> cho nội dung như kiểu nội dung và mã hóa rất mỉa mai, vì không biết những điều đó, bạn không thể phân tích cú pháp tệp để nhận giá trị của thẻ meta. - Mark
Bạn có thể phân tích cú pháp nó dưới dạng ASCII cho đến khi bạn tiếp cận nó. Thuật toán phân tích cú pháp HTML5 tính đến điều này. - Quentin
Cần lưu ý rằng không được sử dụng để phân tích cú pháp khi trang được phân phối trên web. Thay vào đó, một trong HTTP Content-Type tiêu đề phản hồi sẽ được sử dụng. Thẻ meta chỉ được sử dụng khi trang được tải từ hệ thống tệp đĩa cục bộ. - BalusC
Phần tử meta được sử dụng trên HTTP trong các điều kiện nhất định (bao gồm cả sự vắng mặt của dữ liệu nằm trong tiêu đề HTTP) - Quentin
Nó cũng là mỉa mai rằng nó được đặt tên charset, khi nó thực sự là để xác định một mã hóa. (bộ mã là Unicode, mã hóa là UTF-8) - Ryan


Các câu trả lời:


Trong HTML5, chúng tương đương nhau. Sử dụng ngắn hơn, nó dễ dàng hơn để ghi nhớ và loại. Hỗ trợ trình duyệt vẫn ổn vì nó được thiết kế để tương thích ngược.


978
2018-01-14 22:09



Điều gì về hỗ trợ trình duyệt? Làm <meta charset='utf-8'> làm việc trong IE6? - Šime Vidas
Theo tôi biết, vâng. - Quentin
Đây là liên kết được cập nhật cho Trang Google Code mà @ Šime Vidas đã đề cập. Nó nói về IE 6, 7 và 8, "Trong trình duyệt không phải IE, bạn có thể sử dụng document.characterSet. Trong IE, bạn có thể nghĩ rằng bạn có thể document.getElementsByTagName ('meta') [0] .charset, nhưng điều này chỉ trả về mã hóa ký tự mà bạn đã chỉ định, không phải mã hóa mà IE thực sự đang sử dụng. " - hotshot309
Tôi biết chủ đề này là cũ, nhưng gtmetrix.com/specify-a-character-set-early.html cho biết sử dụng <meta> để đặt mã hóa ký tự tắt trình tải xuống lookahead trong IE8, điều này có thể ảnh hưởng đến thời gian tải trang của bạn. Yeah, yeah, tôi biết ... thả IE8. @ MészárosLajos có thể quay lại đây sau một vài năm và phá hỏng các quả bóng của chúng tôi vì vẫn hỗ trợ IE8. ;-) - erturne
Hôm nay tôi đã có một vấn đề mà các biểu tượng của Hàn Quốc không xuất hiện trong IE11. Việc trích cú pháp ngắn có lợi cho cú pháp dài hơn đã khắc phục vấn đề. Tôi không biết nếu điều này là do một số loại cấu hình máy chủ mặc dù hoặc nếu nó là một vấn đề với IE11 và bộ ký tự. Sự kết hợp biểu tượng chính xác mà nó đã thất bại là 베라. - James Donnelly


Cả hai dạng của meta charset khai báo tương đương và sẽ hoạt động tương tự trên các trình duyệt. Tuy nhiên, có một vài điều bạn cần nhớ khi khai báo tập tin web của bạn ký tự đặt là UTF-8:

  1. Lưu (các) tệp của bạn theo mã UTF-8 không có các dấu thứ tự byte (BOM).
  2. Khai báo mã hóa trong các tệp HTML của bạn bằng cách sử dụng meta charset (như trên).
  3. Máy chủ web của bạn phải phân phát các tệp của bạn, khai báo mã hóa UTF-8 trong tiêu đề HTTP Loại Nội dung.

Theo mặc định, các máy chủ Apache được định cấu hình để phân phối tệp theo ISO-8859-1, vì vậy bạn cần phải thêm dòng sau vào .htaccess tập tin:

AddDefaultCharset UTF-8

Điều này sẽ định cấu hình Apache để phân phối tệp của bạn khai báo mã hóa UTF-8 trong tiêu đề phản hồi Kiểu Nội dung, nhưng tệp của bạn phải được lưu trong UTF-8 (không có BOM) để bắt đầu.

Notepad không thể lưu tệp của bạn bằng UTF-8 mà không có BOM. Trình chỉnh sửa miễn phí có thể Notepad ++. Trên thanh trình đơn chương trình, chọn "Mã hóa> Mã hóa trong UTF-8 không có BOM". Bạn cũng có thể mở tệp và lưu lại chúng trong UTF-8 bằng cách sử dụng "Mã hóa> Chuyển đổi thành UTF-8 không có BOM".

Thông tin thêm về Byte Order Mark (BOM) tại Wikipedia.


236
2018-05-21 07:26



Cảm ơn bạn đã có mẹo Apache / .htaccess! - Owen
@CodeBoy Tôi sẽ sửa đổi câu trả lời của bạn để nói "Bạn Nên lưu ... mà không có BOM. "Trang sau nói" ... nó thường là tốt nhất cho khả năng tương tác để bỏ qua BOM ... "cho thấy một thực hành tốt nhất, nhưng không phải là một yêu cầu: w3.org/International/questions/qa-byte-order-mark - Johann
Trong IIS, bạn có thể đặt bộ ký tự trong các tiêu đề HTTP với <globalization fileEncoding = "utf-8" responseEncoding = "utf-8" /> trong Web.Config - thêm nó vào <system.web> - Chris Moschini
như tôi hiểu mọi thứ, nó không quan trọng TẤT CẢ nếu bạn tiết kiệm với chúng tôi mà không có BOM. - David 天宇 Wong
Tại sao bạn nói UTF-8 HTML nên không có BOM. Có một HĐQT nên làm việc tốt. Ngoài ra, bạn không cần meta và tiêu đề HTTP. Bạn chỉ cần một BOM, meta hoặc tiêu đề HTTP. - hsivonen


Một lý do khác để đi với đoạn ngắn là nó khớp với các trường hợp khác, nơi bạn có thể chỉ định một bộ ký tự trong đánh dấu. Ví dụ:

<script type="javascript" charset="UTF-8" src="/script.js"></script>

<p><a charset="UTF-8" href="http://example.com/">Example Site</a></p>

Tính nhất quán giúp giảm lỗi và làm cho mã dễ đọc hơn.

Lưu ý rằng thuộc tính ký tự phân biệt chữ hoa chữ thường. Bạn có thể sử dụng UTF-8 hoặc utf-8, tuy nhiên UTF-8 rõ ràng hơn, dễ đọc hơn, chính xác hơn.

Ngoài ra, hoàn toàn không có lý do gì để sử dụng bất kỳ giá trị nào khác ngoài UTF-8 trong thuộc tính bộ ký tự meta hoặc tiêu đề trang. UTF-8 là mã hóa mặc định cho các tài liệu Web từ HTML4 vào năm 1999 và là cách thực tế duy nhất để tạo các trang Web hiện đại.

Ngoài ra, bạn không nên sử dụng các thực thể HTML trong UTF-8. Các ký tự như biểu tượng bản quyền phải được nhập trực tiếp. Các thực thể duy nhất bạn nên sử dụng là dành cho 5 ký tự đánh dấu dành riêng: nhỏ hơn, lớn hơn, dấu và, số nguyên tố, số nguyên kép. Các thực thể cần một trình phân tích cú pháp HTML, mà bạn có thể không muốn sử dụng trong tương lai, chúng giới thiệu các lỗi, làm cho mã của bạn ít đọc được hơn, tăng kích thước tệp của bạn và đôi khi giải mã không chính xác trong các trình duyệt khác nhau tùy thuộc vào đối tượng bạn đã sử dụng. Tìm hiểu cách nhập / chèn bản quyền, nhãn hiệu, báo giá mở, trích dẫn gần, dấu nháy đơn, dấu gạch ngang, dấu gạch ngang, dấu đầu dòng, Euro và bất kỳ ký tự nào khác bạn gặp phải trong nội dung của mình và sử dụng các ký tự đó trong mã của bạn. Mac có Trình xem ký tự mà bạn có thể bật trong Tùy chọn hệ thống bàn phím và bạn có thể tìm và sau đó kéo và thả các ký tự bạn cần hoặc sử dụng Trình xem bàn phím phù hợp để xem loại khóa nào cần nhập. Ví dụ: nhãn hiệu là Option + 2. UTF-8 chứa tất cả các ký tự và ký hiệu từ mọi ngôn ngữ viết tay của con người. Vì vậy, không có lý do gì để sử dụng - thay vì dấu gạch ngang. Nó không phải là một ý tưởng tồi để tìm hiểu các quy tắc của dấu chấm câu và kiểu chữ cũng ... ví dụ, biết rằng một khoảng thời gian đi bên trong một trích dẫn gần gũi, không phải bên ngoài.

Sử dụng thẻ cho nội dung nào đó như kiểu nội dung và mã hóa   mỉa mai, vì không biết những điều đó, bạn không thể phân tích cú pháp tệp   để lấy giá trị của thẻ meta.

Không, đó là không đúng sự thật. Trình duyệt bắt đầu phân tích cú pháp tệp dưới dạng mã hóa mặc định của trình duyệt, UTF-8 hoặc ISO-8859-1. Vì US-ASCII là tập con của cả ISO-8859-1  UTF-8, trình duyệt có thể đọc tốt một trong hai cách ... nó là như nhau. Khi trình duyệt gặp thẻ meta charset, nếu mã hóa khác với trình duyệt đang sử dụng, trình duyệt sẽ tải lại trang trong mã hóa được chỉ định. Đó là lý do tại sao chúng tôi đặt thẻ meta charset ở trên cùng, ngay sau thẻ head, trước bất kỳ điều gì khác, ngay cả tiêu đề. Bằng cách đó bạn có thể sử dụng các ký tự UTF-8 trong tiêu đề của bạn.

Bạn phải lưu (các) tệp của mình trong mã hóa UTF-8 mà không cần BOM

Điều đó không đúng. Nếu bạn chỉ có các ký tự US-ASCII trong tài liệu của mình, bạn có thể Lưu nó dưới dạng US-ASCII và phân phát dưới dạng UTF-8, vì nó là một tập hợp con. Nhưng nếu có các ký tự Unicode, bạn đúng, bạn phải Lưu dưới dạng UTF-8 không có BOM.

Nếu bạn muốn một trình soạn thảo văn bản tốt sẽ lưu các tệp của bạn   trong UTF-8, tôi khuyên dùng Notepad ++.

Trên máy Mac, sử dụng Bare Bones TextWrangler (miễn phí) từ Mac App Store, hoặc Bare Bones BBEdit tại Mac App Store với giá $ 39,99 ... rất rẻ cho một công cụ tuyệt vời như vậy. Trong cả hai ứng dụng, có một menu ở dưới cùng của cửa sổ tài liệu nơi bạn chỉ định mã hóa tài liệu và bạn có thể dễ dàng chọn "UTF-8 no BOM". Và tất nhiên bạn có thể đặt nó làm mặc định cho các tài liệu mới trong Preferences.

Nhưng nếu Webserver của bạn phục vụ mã hóa trong tiêu đề HTTP,   được đề xuất, cả hai [thẻ meta] đều không cần thiết.

Điều đó không đúng. Tất nhiên, bạn nên đặt mã hóa trong tiêu đề HTTP, nhưng bạn cũng nên đặt nó trong thuộc tính meta charset để người dùng có thể lưu trang, ra khỏi trình duyệt vào bộ nhớ cục bộ và sau đó mở lại sau đó, trong trường hợp đó chỉ báo duy nhất của mã hóa sẽ có mặt là thuộc tính ký tự meta. Bạn cũng nên đặt thẻ cơ sở cho cùng một lý do ... trên máy chủ, thẻ cơ sở không cần thiết, nhưng khi được mở từ bộ nhớ cục bộ, thẻ cơ sở cho phép trang hoạt động như trên máy chủ, với tất cả tài sản tại chỗ và như vậy, không có liên kết bị hỏng.

AddDefaultCharset UTF-8

Hoặc bạn chỉ có thể thay đổi mã hóa các loại tệp cụ thể như sau:

AddType text/html;charset=utf-8 html

Mẹo để phục vụ cả tệp UTF-8 và Latin-1 (ISO-8859-1) là cung cấp cho tệp UTF-8 phần mở rộng "văn bản" và tệp Latinh-1 "txt".

AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text

Cuối cùng, hãy xem xét Lưu tài liệu của bạn với các kết thúc dòng Unix, không phải dòng cuối Mac hoặc (cổ điển) Mac cũ, không giúp đỡ và có thể bị tổn thương, đặc biệt là xuống dòng khi chúng ta tiếp tục tiến xa hơn từ các hệ thống kế thừa đó. Một tài liệu HTML có mã hóa HTML5, UTF-8 hợp lệ và kết thúc dòng Unix là một công việc được thực hiện tốt. Bạn có thể chia sẻ và chỉnh sửa và lưu trữ và đọc và phục hồi và dựa vào tài liệu đó trong nhiều ngữ cảnh. Nó là lingua franca. Đó là giấy kỹ thuật số.


78
2017-08-20 20:26



"Nếu bạn chỉ có các ký tự ISO-8859-1 trong tài liệu của mình, bạn có thể lưu nó dưới dạng ISO-8859-1 và phân phát dưới dạng UTF-8, vì nó là tập hợp con" - không chính xác. Nó sẽ là chính xác nếu bạn thay đổi "ISO-8859-1" thành "US-ASCII". US-ASCII tương thích với UTF-8 vì nó là tập con, ISO-8859-1 thì không. Để chuyển đổi ISO-8859-1 (chứa các ký tự không phải ASCII) thành UTF-8, bạn cần phải mã hóa các ký tự không phải ASCII. Các điểm mã cho ISO-8859-1 tồn tại trong Unicode, nhưng UTF-8 mã hóa các điểm bên ngoài US-ASCII khác với ISO-8859-1. - thomasrutter
Điểm của bạn về các thực thể HTML là tốt. Trong quá khứ, tôi đã sử dụng các thực thể chỉ để thấy rằng chúng đã được chuyển đổi thành các ký tự UTF-8 của chúng sau khi được lưu trên các hệ thống khác nhau và / hoặc được mở trong các trình soạn thảo khác nhau. Tuy nhiên, điều đáng chú ý là không gian phá vỡ (& nbsp;) có thể tạo ra các kết quả khó hiểu vì bạn thường không thấy chúng trong trình soạn thảo của bạn, vì vậy thường tốt nhất là giữ các thực thể vì mục đích rõ ràng (theo kinh nghiệm của tôi). - squidbe
Tôi đã chỉnh sửa câu trả lời để khắc phục sự cố tôi đã tìm thấy ở trên. - thomasrutter
"You should also set a base tag..." nên đi kèm với sự cẩn thận được mô tả đây. - Mafuba
Một lý do khác bạn có thể thích các thực thể HTML là nếu bạn đang sử dụng một cái gì đó như ionicons. Tôi thà thấy &#xf101; hơn glyph mặc định, hoặc một số ký tự lạ tôi không nhận ra. - Daniel Lubarov


<meta charset="utf-8">đã được giới thiệu với / cho HTML5.

Như đã đề cập trong tài liệu, cả hai đều hợp lệ. Tuy nhiên, <meta charset="utf-8"> chỉ dành cho HTML5 (và dễ dàng hơn để nhập / ghi nhớ).

Trong thời gian tới, kiểu cũ nhất định sẽ không được chấp nhận trong tương lai gần. Tôi muốn dính vào cái mới <meta charset="utf-8">.

Chỉ có một cách, nhưng lên. Trong trường hợp của công nghệ, đó là loại bỏ các cũ (thực sự, thực sự nhanh)

Tài liệu:  Thuộc tính bộ ký tự meta HTML — W3Schools


28
2018-06-25 21:04



Về liên kết, vui lòng xem meta.stackoverflow.com/questions/280478/why-not-w3schools-com - tripleee


Trong khi không phản đối các câu trả lời khác, tôi nghĩ những điều sau đây đáng nói đến.

  1. Dài" (http-equiv) ký hiệu và ký hiệu "ngắn" bằng nhau, tùy theo điều kiện nào đến trước sẽ thắng;
  2. Tiêu đề máy chủ web sẽ ghi đè tất cả <meta> thẻ;
  3. BOM (đánh dấu byte) sẽ ghi đè mọi điềuvà trong nhiều trường hợp, nó sẽ ảnh hưởng đến html 4 (và có thể là các thứ khác nữa);
  4. Nếu bạn không khai báo bất kỳ mã hóa nào, có thể bạn sẽ nhận được văn bản trong “mã hóa văn bản dự phòng” được xác định trình duyệt của bạn. Cả trong Firefox lẫn Chrome đều không phải là utf-8;
  5. Trong trường hợp không có các manh mối khác, trình duyệt sẽ cố gắng đọc tài liệu của bạn như thể nó được viết bằng mã ASCII để mã hóa, vì vậy bạn không thể sử dụng bất kỳ mã hóa lạ nào (utf-16 với BOM nên làm);
  6. Trong khi các thông số kỹ thuật nói rằng khai báo mã hóa phải nằm trong 512 byte đầu tiên của tài liệu, hầu hết các trình duyệt sẽ cố gắng đọc nhiều hơn thế.

Bạn có thể kiểm tra bằng cách chạy echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500 và trỏ trình duyệt của bạn tại localhost:4500. (Tất nhiên bạn sẽ muốn thay đổi hoặc loại bỏ các phần. Phần BOM là \xef\xbb\xbf. Hãy cảnh giác với việc mã hóa vỏ của bạn.)

Hãy nhớ rằng điều rất quan trọng là bạn khai báo mã hóa một cách rõ ràng. Việc cho phép trình duyệt đoán có thể dẫn đến các sự cố bảo mật.


18
2018-01-15 00:03



Điểm tốt, nhưng bạn có thể nêu chi tiết vấn đề bảo mật nào bạn đang đề cập đến không? - Armfoot
Ký hiệu dài không nên ghi đè ký tự ngắn — chỉ đơn giản là ký hiệu đầu tiên trong tài liệu sẽ thắng. - gsnedders
@Armfoot Trong quá khứ đã từng là vấn đề với UTF-7 từ những gì tôi nhớ. Ngoài ra, đánh hơi trên web thường là xấu, ví dụ: khi bạn tải lên hình ảnh có nội dung tập lệnh được đánh hơi. - phk
@gsnedders được thử nghiệm trong chrome và firefox, bạn nói đúng. đã chỉnh sửa câu trả lời cho phù hợp. Armfoot: đó là một cái gì đó về một số mã hóa 7 bit, không nhớ chính xác những gì. - squirrel
"Không có trong Firefox cũng không phải trong Chrome, đó là utf-8" - Ý bạn là gì? Nếu không phải utf-8 thì nó là gì? - Craig McQueen


Sử dụng <meta charset="utf-8" /> cho trình duyệt web khi sử dụng HTML5.

Sử dụng <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> khi sử dụng HTML4 hoặc XHTML hoặc cho các trình phân tích cú pháp dom lỗi thời, như DOMDocument trong php


9
2017-11-26 08:08





Có một số tin tức dựa trên Mozilla Foundationsitepoint

Không sử dụng giá trị này (http-equiv=content-type) vì nó đã lỗi thời.   Ưu tiên charset thuộc tính trên <meta> phần tử.    enter image description here


0
2017-08-15 23:22