2009-11-08 52 views
75

Tôi muốn hiển thị biểu tượng đánh dấu (✔) và chéo (✘) trong trang HTML nhưng nó hiển thị dưới dạng hộp hoặc goop â '”- rõ ràng là có liên quan đến mã hóa.Hiển thị các ký hiệu unicode trong HTML

Tôi đã đặt thẻ meta để hiển thị utf-8 nhưng rõ ràng là tôi đang thiếu thứ gì đó.

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

Edit/Giải pháp: Từ ý kiến ​​thực hiện, sử dụng Firebug tôi thấy các tiêu đề được thông qua bởi trang của tôi là trong thực tế "Content-Type: text/html" chứ không phải UTF-8. Nhìn vào định dạng tệp bằng Notepad ++ cho thấy tệp của tôi đã được định dạng là "UTF-8 không có BOM". Thay đổi điều này thành chỉ UTF-8 các biểu tượng giờ đây hiển thị chính xác ... nhưng con bọ lửa vẫn có vẻ như chỉ ra cùng một kiểu nội dung.

+1

1 câu hỏi rất tò mò! –

+1

Cảm ơn! Điều đó đã giúp tôi rất nhiều! –

Trả lời

42

Bạn phải đảm bảo tiêu đề máy chủ HTTP là chính xác.

Đặc biệt, tiêu đề:

Content-Type: text/html; charset=utf-8 

nên có mặt.

Thẻ meta bị bỏ qua bởi trình duyệt nếu có tiêu đề HTTP.

Cũng đảm bảo rằng tập tin của bạn là thực sự được mã hóa theo UTF-8 trước khi phục vụ nó, kiểm tra/thử như sau:

  • Đảm bảo soạn thảo của bạn lưu nó dưới dạng UTF-8.
  • Đảm bảo FTP của bạn hoặc bất kỳ chương trình truyền tệp nào không gây rối với tệp.
  • Hãy thử với các thực thể được mã hóa HTML, như &#uuu;.
  • Để thực sự chắc chắn, hãy hexdump tệp và trông giống như ký tự, cho ✔, nó phải là E2 9C 94.

Lưu ý: Nếu bạn sử dụng ký tự unicode mà hệ thống của bạn không thể tìm thấy glyph (không có phông chữ với ký tự đó), trình duyệt của bạn sẽ hiển thị dấu hỏi hoặc một số khối như biểu tượng. Nhưng nếu bạn thấy nhiều ký tự La Mã giống như bạn làm, điều này biểu thị một vấn đề mã hóa.

+0

Thực ra, thẻ meta không bị bỏ qua, nhưng tiêu đề HTTP được ưu tiên. Cảm ơn Konrad về độ chính xác đó. –

+5

Lưu ý rằng để sử dụng ký tự unicode trong thuộc tính 'content' của một bộ chọn CSS' :: before', bạn cần sử dụng ký pháp dấu chéo ngược. ví dụ: '\ 2713' thay vì '& # 2713'. –

4

Đảm bảo rằng bạn thực sự lưu tệp dưới dạng UTF-8, cách khác sử dụng các thực thể HTML (&#nnn;) cho các ký tự đặc biệt.

+0

Có vẻ như không phải là thực thể HTML cho ✔ hoặc tôi đã bỏ lỡ nó? Làm thế nào để bạn "thực sự" lưu tập tin như UTF-8 và làm thế nào bạn có thể kiểm tra? –

+0

@Peter: bằng cách sử dụng một trình soạn thảo phong nha. Hầu hết các trình soạn thảo văn bản đều có tùy chọn trong hộp thoại “lưu dưới dạng” của họ để chỉ định mã hóa tệp hoặc họ có tùy chọn khác ẩn ở đâu đó trong trình đơn của họ. Vim sử dụng cài đặt 'fileencoding'. –

+8

@Peter, bạn có thể tham khảo bất kỳ ký tự nào theo mã của nó. Hãy thử & # x2714; để đánh dấu. –

3

Không giống như đề xuất của Nicolas, thẻ meta không thực sự bị bỏ qua bởi các trình duyệt. Tuy nhiên, tiêu đề HTTP Content-Type luôn được ưu tiên hơn sự hiện diện của thẻ meta trong tài liệu.

Vì vậy, hãy đảm bảo rằng bạn gửi mã hóa chính xác qua tiêu đề HTTP hoặc không gửi tiêu đề HTTP này cả (không được khuyến nghị). Thẻ meta chủ yếu là tùy chọn dự phòng cho các tài liệu cục bộ không được gửi qua lưu lượng truy cập HTTP.

Sử dụng thực thể HTML cũng nên được coi là giải pháp thay thế - đó là mẹo để giải quyết vấn đề thực sự. Cấu hình máy chủ web đúng cách ngăn chặn rất nhiều phiền toái.

0

Tôi nghĩ đây là vấn đề về tệp, bạn đã lưu tệp của mình thành dạng mã hóa 1 byte như latin-1. Google up trình chỉnh sửa của bạn và cách đặt tệp thành utf-8.

Tôi tự hỏi tại sao có các trình chỉnh sửa không mặc định là utf-8.

14

Tôi biết câu trả lời đã được chấp nhận, nhưng muốn chỉ ra một số điều.

Đặt content-typecharset rõ ràng là một thực tiễn tốt, thực hiện trên máy chủ tốt hơn nhiều, vì nó đảm bảo tính nhất quán trong ứng dụng của bạn.

Tuy nhiên, tôi chỉ sử dụng UTF-8 khi ngôn ngữ của ứng dụng của tôi sử dụng nhiều ký tự chỉ có sẵn trong bộ ký tự UTF-8. Nếu bạn muốn hiển thị ký tự hoặc ký hiệu unicode trong một trong các trường hợp, bạn có thể làm như vậy mà không thay đổi charset của trang của mình.

HTML trình kết xuất luôn có thể hiển thị các biểu tượng không thuộc bộ ký tự mã hóa của trang, miễn là bạn đề cập đến biểu tượng trong số numeric character reference (NCR). Nghe có vẻ kì lạ nhưng đúng.

Vì vậy, ngay cả khi bạn html có một tiêu đề mà khẳng định nó có một mã hóa của ansi hoặc bất kỳ các iso bảng mã, bạn có thể hiển thị một dấu kiểm bằng cách sử dụng tài liệu tham khảo nhân vật html của nó, trong số thập phân - & # 10003; hoặc trong hex - & # x2713;

Vì vậy, có một chút khó hiểu tại sao bạn phải đối mặt với vấn đề này trên các trang của mình. bạn có thể kiểm tra nếu giá trị NCR là đúng, đây là một tài liệu tham khảo tốt http://www.fileformat.info/info/unicode/char/2713/index.htm

+3

"Tuy nhiên, tôi sẽ sử dụng UTF-8 chỉ khi ngôn ngữ của ứng dụng của tôi sử dụng rất nhiều nhân vật mà có sẵn chỉ trong UTF-8 charset" Tại sao? Những bất lợi trong việc chuyển đổi là gì? – dumbledad

+2

@dumbledad: Câu hỏi rất tốt, tôi đoán tôi để thiên vị của riêng tôi đám mây câu trả lời của tôi. Những gì tôi muốn nói là nếu toàn bộ ứng dụng của bạn đã là phi utf-8, thay đổi nó ứng dụng vide cho một trang duy nhất có thể là quá nhiều công việc. Ngoài ra, nếu ngôn ngữ lập trình và nội dung không cần utf-8 ký tự, bạn có thể vô tình sao chép dán một nhân vật rác mà soạn thảo của bạn sẽ tốt với (vì trong utf-8 chế độ của nó), nhưng mã sẽ thất bại trong thực hiện. Có nói rằng, khi bạn có thể, hãy cập nhật bộ mã hóa và bộ chữ cái của bạn – Akshay

Các vấn đề liên quan