Hiển thị các ký hiệu unicode trong HTML


89

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

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

Chỉnh sửa / Giải pháp: Từ các nhận xét được đưa ra, bằng cách sử dụng FireBug, tôi thấy các tiêu đề đang được trang của tôi chuyển qua trên thực tế là "Loại nội dung: văn bản / 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 hiện hiển thị chính xác ... nhưng firebug dường như vẫn chỉ ra cùng một loại nội dung.

Câu trả lời:


56

Bạn nên đả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ị trình duyệt bỏ qua nếu tiêu đề HTTP có mặt.

Đồng thời đảm bảo rằng tệp của bạn thực sự được mã hóa dưới dạng UTF-8 trước khi phân phát nó, hãy kiểm tra / thử các bước sau:

  • Đảm bảo trình chỉnh sửa 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 làm ảnh hưởng đến 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 nén tệp và trông như một ký tự, đối với ✔, 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ữ nào có ký tự đó), trình duyệt của bạn sẽ hiển thị một dấu hỏi hoặc một số ký hiệu giống như khối. 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 cho thấy sự cố mã hóa.


Trên thực tế, thẻ meta không bị bỏ qua, nhưng tiêu đề HTTP được ưu tiên hơn. Cảm ơn Konrad vì sự chính xác đó.

8
Lưu ý rằng để sử dụng một ký tự unicode trong thuộc contenttính của ::beforebộ chọn CSS , người ta sẽ cần sử dụng ký hiệu dấu gạch chéo ngược. ví dụ: '\ 2713' thay vì '& # 2713'.
Fabien Snauwaert

18

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

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

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

HTMLcác trình kết xuất luôn có thể hiển thị các ký hiệu không phải là một phần của bộ ký tự mã hóa của trang, miễn là bạn đề cập đến ký hiệu đó numeric character reference (NCR). Nghe có vẻ kỳ lạ nhưng đó là sự thật.

Vì vậy, ngay cả khi htmltiêu đề của bạn cho biết nó có mã hóa ansihoặc bất kỳ isobộ ký tự nào, bạn có thể hiển thị dấu kiểm bằng cách sử dụng tham chiếu ký tự html của nó, ở dạng thập phân - & # 10003; hoặc ở dạng hex - & # x2713;

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


6
"Tuy nhiên, tôi chỉ sử dụng UTF-8 khi ngôn ngữ ứng dụng của tôi sử dụng nhiều ký tự chỉ có sẵn trong bộ ký tự UTF-8" Tại sao? Bất lợi trong việc chuyển đổi là gì?
câm

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

6

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


Có vẻ như không có một thực thể HTML nào cho ✔ hay tôi đã bỏ lỡ nó? Làm thế nào để bạn "thực sự" lưu tệp dưới dạng UTF-8 và làm thế nào bạn có thể kiểm tra?
Peter Craig,

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

8
@Peter, bạn có thể tham chiếu đến bất kỳ ký tự nào theo mã của nó. Hãy thử & # x2714; cho một tích tắc.
Dan Dyer

lưu dưới dạng utf-8. khái niệm thú vị. hoạt động tốt nếu bạn đang tạo các trang HTML tĩnh. nhưng ... những gì về các trang web động? nội dung ký tự unicode / utf-8 / wide này thực sự khá khó hiểu đối với tôi. mã phụ trợ của tôi là perl. tiêu đề http được đặt đúng cách và tiêu đề html cũng vậy. W3C Internationalization Checker xác nhận rằng tôi có tài liệu được đặt thành utf-8. CaSinG có vấn đề gì không? cuối cùng, những gì về hộp nhập văn bản? tôi vẫn nhận được goop! :(
Jarett Lloyd

phụ lục cho nhận xét trước: cơ sở dữ liệu của tôi hiển thị dữ liệu đã được nhập chính xác và các ký tự hiển thị chính xác. vì vậy, không phải vấn đề cơ sở dữ liệu. tập lệnh perl của tôi (hay đúng hơn là trình chỉnh sửa) được đặt để lưu các tập lệnh dưới dạng utf-8. máy chủ của tôi, apache2, tôi khá chắc chắn là không can thiệp hoặc được đặt đúng. tất cả điều này đã nói, vẫn không chắc chắn tại sao các ký tự lại hoạt động. ugh. phải có một cách tốt hơn
Jarett Lloyd

5

Không giống như đề xuất của Nicolas, metathẻ thực sự không bị trình duyệt bỏ qua. Tuy nhiên, Content-Typetiêu đề HTTP luôn được ưu tiên hơn sự hiện diện của metathẻ 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 hoàn toàn không gửi tiêu đề HTTP này (không được khuyến nghị). Các metathẻ chủ yếu là một lựa chọn dự phòng cho các tài liệu địa phương mà không được gửi qua giao thức HTTP.

Sử dụng các thực thể HTML cũng nên được coi là một giải pháp thay thế - đó là cách giải quyết vấn đề thực sự. Định 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 chỉ cần lưu tệp của mình ở dạng mã hóa 1 byte như latin-1. Google thiết lập 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ó những trình chỉnh sửa không mặc định là utf-8.

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.