<meta charset = Thời gian utf-8 Lần> so với <meta http-Equiv = Nhật ký Loại Loại Nội dung>


1535

Để 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" />

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

321
Bạn có thể phân tích nó thành ASCII cho đến khi bạn đạt được nó. Thuật toán phân tích cú pháp HTML5 đưa điều này vào tài khoản.
Quentin

41
Cần lưu ý rằng không được sử dụng để phân tích cú pháp khi trang được phục vụ trên web. Thay vào đó, Content-Typetiêu đề phản hồi HTTP 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

38
Phần tử meta được sử dụng qua HTTP trong các điều kiện nhất định (bao gồm cả việc không có dữ liệu trong tiêu đề HTTP)
Quentin

78
Thật là mỉa mai khi nó được đặt tên là bộ ký tự, khi nó thực sự là để chỉ định một mã hóa. (bộ ký tự là Unicode, mã hóa là UTF-8)
Ryan

Câu trả lời:


1084

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


23
Hỗ trợ trình duyệt thì sao? Có <meta charset='utf-8'>hoạt động trong IE6 không?
Vidime Vidas

11
Theo tôi biết, có.
Quentin

4
Đây là một liên kết được cập nhật cho trang Google Code mà @ Vidime Vidas đã đề cập. Nó nói, liên quan đến IE 6, 7 và 8, "Trong các 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 mình 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

7
Tôi biết chủ đề này đã cũ, nhưng gtmetrix.com/specify-a-character-set-early.html cho biết việc sử dụng <meta>để đặt mã hóa ký tự sẽ vô hiệu hóa trình tải xuống lookahead trong IE8, có thể ảnh hưởng đến thời gian tải trang của bạn. Vâng, vâng, tôi biết ... thả IE8. @ MészárosLajos có thể quay lại đây sau vài năm và phá bóng của chúng tôi vì vẫn hỗ trợ IE8. ;-)
kể từ

3
Hôm nay tôi có một vấn đề trong đó các biểu tượng Hàn Quốc không xuất hiện trong IE11. Việc bỏ 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 liệu đây có phải là do một số loại cấu hình máy chủ hay không hoặc nếu đó là sự cố 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

250

Cả hai hình thức khai báo bộ ký tự meta đều tương đương và sẽ hoạt động giống nhau trên các trình duyệt. Nhưng, có một vài điều bạn cần nhớ khi khai báo các tệp web được đặt ký tự là UTF-8:

  1. Lưu tập tin của bạn (s) trong mã UTF-8 mà không cần các dấu byte đặt hàng (BOM).
  2. Khai báo mã hóa trong các tệp HTML của bạn bằng bảng mã meta (như trên).
  3. Máy chủ web của bạn phải phục vụ các tệp của bạn, khai báo mã hóa UTF-8 trong tiêu đề HTTP Kiểu nội dung.

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

AddDefaultCharset UTF-8

Điều này sẽ cấu hình Apache để phục vụ các 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 các 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 trong UTF-8 mà không có BOM. Một trình soạn thảo miễn phí có thể là Notepad ++ . Trên thanh menu 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 sang UTF-8 mà không cần BOM".

Thông tin thêm về Dấu hiệu đặt hàng Byte (BOM) tại Wikipedia .


20
@CodeBoy Tôi sẽ sửa đổi câu trả lời của bạn thành "Bạn nên lưu ... mà không cần BOM." Trang sau có nội dung "... thường là tốt nhất cho khả năng tương tác để bỏ qua BOM ..." chỉ ra một cách thực hành tốt nhất, nhưng không phải là một yêu cầu: w3.org/I quốc / questions / qa
Johann

3
Trong IIS, bạn có thể đặt bộ ký tự trong các tiêu đề HTTP với <globalization fileEncoding = "utf-8" answerEncoding = "utf-8" /> trong Web.Config - thêm nó vào <system.web>
Chris Moschini

3
theo tôi hiểu, mọi thứ sẽ không thành vấn đề nếu bạn tiết kiệm mà không có BOM của chúng tôi.
David 天宇 Wong

3
Tại sao bạn nói UTF-8 HTML nên không có BOM. Có một BOM nên hoạt động tốt. Ngoài ra, bạn không cần metavà tiêu đề HTTP. Bạn chỉ cần một trong BOM metahoặc tiêu đề HTTP.
hsivonen

5
Summing up: don't use BOM for UTF-8Tôi không thể đồng ý với điều này. BOM trong UTF-8 rất hữu ích để báo hiệu loại mã hóa. Mặt khác, chúng ta phải đoán hoặc sử dụng những thứ như thẻ meta mà câu hỏi này đề cập đến. Điều thú vị về BOM là nó là một phần của thông số Unicode và do đó có thể được sử dụng cho tất cả dữ liệu được mã hóa bằng Unicode, không chỉ HTML. Những gì chúng ta nên làm là sử dụng các BOM ở khắp mọi nơi, hãy để phần mềm kế thừa thổi vào nó, báo cáo những lỗi đó và sửa chúng.
Stijn de Witt

82

Một lý do khác để đi với cái ngắn là nó phù hợp với các trường hợp khác mà bạn có thể chỉ định một bộ ký tự được đá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 bộ ký tự không 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 nào để sử dụng bất kỳ giá trị nào 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 kể từ HTML4 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 nên được gõ trực tiếp. Các thực thể duy nhất bạn nên sử dụng là cho 5 ký tự đánh dấu dành riêng: ít hơn, lớn hơn, ký hiệu, số nguyên tố, số nguyên tố kép. Các thực thể cần một trình phân tích cú pháp HTML, mà bạn không phải lúc nào cũng muốn sử dụng, chúng sẽ đưa ra các lỗi, làm cho mã của bạn ít đọ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 các thực thể bạn sử dụng. Tìm hiểu cách nhập / chèn bản quyền, nhãn hiệu, trích dẫn mở, trích dẫn đóng, 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 trong nội dung của mình và sử dụng các ký tự thực 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 phím nào cần nhập. Ví dụ: nhãn hiệu là Tùy chọn + 2. UTF-8 chứa tất cả các ký tự và ký hiệu từ mọi ngôn ngữ viết của con người. Vì vậy, không có lý do gì để sử dụng - thay vì một dấu gạch ngang. Cũng không phải là một ý tưởng tồi để tìm hiểu các quy tắc về dấu câu và kiểu chữ cũng ... ví dụ, biết rằng một khoảng thời gian nằm trong một trích dẫn chặt chẽ, không phải bên ngoài.

Sử dụng thẻ cho một cái gì đó như kiểu nội dung và mã hóa là rất mỉa mai, vì không biết những điều đó, bạn không thể phân tích tệp để nhận 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 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 hợp con của cả ISO-8859-1 UTF-8, trình duyệt có thể đọc tốt cả hai cách ... nó đều giống nhau. Khi trình duyệt gặp thẻ bộ ký tự meta, 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ẻ bộ ký tự meta ở trên cùng, ngay sau thẻ đầu, trước mọi thứ 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 mình.

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

Điều đó không hoàn toàn đú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ục vụ dưới dạng UTF-8, vì đây là 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 mà không cần 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 bạn nên dùng Notepad ++.

Trên Mac, sử dụng Bare Bones TextWrangler (miễn phí) từ Mac App Store hoặc Bare Bones BBEdit có tại Mac App Store với giá 39,99 đô la ... rất rẻ cho một công cụ tuyệt vời như vậy. Trong một trong 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 Tùy chọn.

Nhưng nếu Máy chủ web của bạn phục vụ mã hóa trong tiêu đề HTTP, được khuyến nghị, cả hai [thẻ meta] đều không cần thiết.

Điều đó là không chính xác. 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 bộ ký tự meta để 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 dấu hiệu duy nhất của mã hóa sẽ có mặt là thuộc tính bộ 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ở là 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ư thể 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ư vậy:

AddType text/html;charset=utf-8 html

Mẹo để phục vụ cả hai tệp UTF-8 và Latin-1 (ISO-8859-1) là cung cấp cho các tệp UTF-8 một phần mở rộng "văn bản" và các tệp Latin-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 bằng các kết thúc dòng Unix, chứ không phải các kết thúc dòng Mac cũ (cổ điển), điều này không giúp ích và có thể làm tổn thương, đặc biệt là xuống dòng khi chúng tôi càng ngày càng xa các hệ thống cũ. Một tài liệu HTML với mã hóa HTML5, UTF-8 hợp lệ và các 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à khôi phục và dựa vào tài liệu đó trong nhiều ngữ cảnh. Đó là ngôn ngữ chung. Đó là giấy kỹ thuật số.


20
"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ục vụ dưới dạng UTF-8, vì đó là một tập hợp con" - không chính xác. 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ì đây là tập hợ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) sang UTF-8, bạn sẽ cần 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 mã bên ngoài US-ASCII khác với ISO-8859-1.
thomasrutter

2
Quan điểm của bạn về các thực thể HTML là tốt. Trước đây, tôi chỉ sử dụng các thực thể để thấy rằng chúng đã được chuyển đổi thành các ký tự UTF-8 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à các không gian không phá vỡ (& nbsp;) có thể tạo ra kết quả khó hiểu vì bạn thường không thấy chúng trong trình chỉnh sửa của mình, vì vậy, tốt nhất nên giữ làm thực thể cho rõ ràng (theo kinh nghiệm của tôi).
mực

"You should also set a base tag..."nên đi kèm với những cảnh báo được mô tả ở đây .
Mafuba

Một lý do khác mà bạn có thể thích các thực thể HTML là nếu bạn đang sử dụng thứ gì đó như ion . Tôi thà nhìn thấy &#xf101;hơn glyph mặc định, hoặc một số ký tự lạ mà tôi không nhận ra.
Daniel Lubarov

30

<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ễ nhập / nhớ hơn).

Trong thời gian tới, phong cách cũ chắc chắn sẽ bị phản đối trong tương lai gần. Tôi sẽ gắn bó với 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ái cũ (thực sự, THỰC SỰ nhanh)

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



18

Trong khi không tranh luận về các câu trả lời khác, tôi nghĩ rằng sau đây là đáng để đề cập.

  1. Các http-equivký hiệu của Long long ( ) và một đoạn ngắn ngắn là bằng nhau, tùy theo điều kiện nào đến trước sẽ thắng;
  2. Các tiêu đề máy chủ web sẽ ghi đè tất cả các <meta>thẻ;
  3. BOM (dấu thứ tự Byte) sẽ ghi đè mọi thứ và trong nhiều trường hợp, nó sẽ ảnh hưởng đến html 4 (và có thể cả những 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 của mình trong mã hóa văn bản dự phòng của hồi giáo được xác định là 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ó manh mối nào khác, trình duyệt sẽ cố đọc tài liệu của bạn như thể nó ở trong ASCII để lấy mã hóa, do đó bạn không thể sử dụng bất kỳ mã hóa kỳ lạ nào (utf-16 với BOM nên làm);
  6. Mặc dù 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 4500và trỏ trình duyệt của bạn vào 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.)

Xin lưu ý rằng việc bạn khai báo mã hóa một cách rõ ràng là rất quan trọng. Để trình duyệt đoán có thể dẫn đến các vấn đề bảo mật.


1
Điểm tốt, nhưng bạn có thể nói chi tiết về vấn đề bảo mật mà bạn đang đề cập đến?
Arm feet 4/2/2016

1
Ký hiệu dài không nên ghi đè lên một đoạn ngắn Đơn giản là ký hiệu đầu tiên trong tài liệu sẽ giành chiến thắng.
gsnedder

1
@Armfoot Trước đây thường có vấn đề với UTF-7những gì tôi nhớ. Ngoài ra đánh hơi trên web nói chung là xấu, ví dụ như khi bạn tải lên một hình ảnh một cái gì đó được đánh hơi là nội dung tập lệnh.
phk

@ssnedder đã thử nghiệm trong chrome và firefox, bạn đã đúng. chỉnh sửa câu trả lời cho phù hợp. Armfoot: đó là một cái gì đó về mã hóa 7 bit, không nhớ chính xác là gì.
sóc

1
@CraigMcQueen khá chắc chắn rằng dự phòng trình duyệt vẫn (năm 2018) mặc định là Tây Âu ở Tây Âu, vì vậy tôi tưởng tượng nó mặc định cho bất kỳ mã hóa tiền mã hóa nào đã chiếm ưu thế ở mỗi khu vực. Người dùng có thể đặt dự phòng thành utf-8 nhưng điều này chỉ phơi bày tất cả các mã hóa tào lao mà hàng ngàn trang web vẫn sử dụng như các ký tự ascii byte cao rối rắm khắp nơi, vì vậy nó vẫn không phổ biến. Đáng tiếc hơn. Không thể thấy điều này sẽ thay đổi như thế nào nếu không có một chút ép buộc từ các nhà cung cấp trình duyệt và họ không muốn phá vỡ những thứ cũ.
brennanyoung

13

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ư DOMDocumenttrong php 5.3



1

Để nhúng chữ ký vào email, tôi sẽ sử dụng phiên bản dài:

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

Lý do là không có nhiều trình đọc email sử dụng html5, vì vậy nó luôn sử dụng các kiểu html cũ tốt hơn. Trên thực tế, tốt hơn là sử dụng bảng hơn divs + css.

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.