Làm cách nào để nói với Trình duyệt mã hóa ký tự của trang web HTML bất kể Tiêu đề Kiểu Nội dung Máy chủ?


9

Tôi có một trang HTML chính xác (mã hóa vật lý trên đĩa khớp với nó) thông báo Loại nội dung :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8">
    <title> ...

Mở tệp từ đĩa trong trình duyệt (Google Chrome, Firefox) hoạt động tốt.

Yêu cầu thông qua HTTP, máy chủ web sẽ gửi một tiêu đề Kiểu nội dung khác:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 10:57:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1

(xem dòng cuối cùng). Trình duyệt sau đó sử dụng ISO-8859-1 để hiển thị, đây là kết quả không mong muốn.

Có một cách phổ biến để ghi đè các tiêu đề máy chủ gửi đến trình duyệt từ trong tài liệu HTML không?

Câu trả lời:


6

"Có cách nào phổ biến để ghi đè các tiêu đề máy chủ gửi đến trình duyệt từ trong tài liệu HTML không?"

AFAIK không, bạn làm những gì bạn có thể làm. Bộ ký tự được xác định thông qua Tiêu đề bỏ qua định nghĩa của bạn trong thẻ META.

Nếu bạn có quyền truy cập vào máy chủ, ví dụ Apache, nó được cấu hình bởi câu lệnh này (xem các dòng bình luận):

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

[Cập nhật]

Để nhận xét thứ hai của w3d tại đây, bạn sẽ tìm thấy một số cách để thay đổi bộ ký tự thông qua htaccess-Directives cho máy chủ Apache.


2
+1 tiêu đề HTTP ghi đè thẻ meta HTML. Nếu @hakre có quyền truy cập vào phía máy chủ thì họ cũng có thể ghi đè tiêu đề Kiểu nội dung trên cơ sở mỗi trang.
MrWhite

3
Phải, đây là tài liệu tham khảo quy định chỉ định rằng các tiêu đề HTTP chiếm ưu thế thẻ meta: w3.org/TR/REC-html40/charset.html#h-5.2.2
Jukka K. Korpela

Cảm ơn câu trả lời. @Korpela: Vâng, tôi đã có trong bộ nhớ với thông số kỹ thuật HTML. Nó chính xác theo cách khác khi tôi cần :(.
hakre

Về .htaccess (xin lỗi, đây có thể là một câu hỏi mới thay thế), liệu có thể xóa ;charset=...tiêu đề http không. Trang web hoạt động rất tốt với Content-Type: text/html, các tệp khác nhau có mã hóa khác nhau trên máy chủ. (Tôi sợ điều này là không thể, vì tôi nghĩ rằng tôi đã tìm kiếm điều đó vài tuần trước nhưng kết quả không hoàn toàn cuối cùng). Chỉ trong trường hợp bạn có thể làm sáng tỏ ngay trước mắt.
hakre

@hakre Nếu Chỉ thị ForceType của Apache hoạt động cho bạn, hãy đặt nó vào <Files> Container và đặt tên tệp riêng lẻ hoặc các thư mục nhất định. Chỉ cần để lại phần "; charset =" sau loại mime sau đó, điều này sẽ làm điều đó.
initall

3

Bạn nên đặt một cái gì đó như thế này trong root .htaccess của bạn

<FilesMatch "\.(htm|html|xhtml|xml|php)$">
    AddDefaultCharset utf-8
</FilesMatch>

3

Không, không thể có trong HTML. Tiêu đề phản hồi của máy chủ được ưu tiên hơn thẻ meta của tài liệu. Như được chỉ định trong 5.2.2 Chỉ định mã hóa ký tự - Đặc điểm kỹ thuật HTML 4.01 :

Để tổng hợp, các tác nhân người dùng tuân thủ phải tuân thủ các ưu tiên sau khi xác định mã hóa ký tự của tài liệu (từ mức ưu tiên cao nhất đến thấp nhất):

  1. Tham số "bộ ký tự" HTTP trong trường "Kiểu nội dung".
  2. Một khai báo META với "http-Equiv" được đặt thành "Loại nội dung" và một giá trị được đặt cho "bộ ký tự".
  3. Thuộc tính bộ ký tự được đặt trên một phần tử chỉ định tài nguyên bên ngoài.

Vì vậy, điều này đòi hỏi cấu hình ở phía máy chủ. Tuy nhiên, khi chương tiếp tục:

Tác nhân người dùng có thể cung cấp một cơ chế cho phép người dùng ghi đè thông tin "bộ ký tự" không chính xác. Tuy nhiên, nếu một tác nhân người dùng cung cấp một cơ chế như vậy, thì nó chỉ nên cung cấp nó để duyệt chứ không phải để chỉnh sửa, để tránh việc tạo các trang Web được đánh dấu bằng tham số "bộ ký tự" không chính xác.

Trong trường hợp của tôi, tiêu đề Kiểu nội dung của máy chủ chứa loại mime đúng nhưng bộ ký tự sai .

Khi nó bật ra, cấu hình httpd Apache của tôi đã thiết lập AddDefaultCharsetbật được thêm ; charset=ISO-8859-1phần. Đặt vào thư mục gốc của trang web .htaccessdòng sau:

AddDefaultCharset Off

thông tin bộ ký tự đã bị xóa:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 15:07:52 GMT
...
Content-Type: text/html

(xem dòng cuối cùng, không có ; charset=...phần). Điều này kết hợp với thẻ meta html kích hoạt các heuristic trình duyệt đã nói để chiếm lấy bộ ký tự từ thẻ meta. Trang web được giải mã chính xác.

Đã thử nghiệm với:

  • Google Chrome v. 22.0.1229.94
  • Firefox v. 16.0.1
  • Phiên bản Lynx 2.8.7rel.1 (ngày 5 tháng 7 năm 2009)

Ba trình duyệt này có vấn đề với cấu hình ban đầu và hoạt động ngay bây giờ (tất cả trên Fedora 17).

  • Opera 12.02
  • Internet Explorer 6 (Win XP SP3)

Không có vấn đề ở nơi đầu tiên. Cả hai đều thích UTF-8 từ thẻ meta hơn cài đặt ISO-8859-1 từ máy chủ.

  • Netscape 2.01 Vàng

Không hỗ trợ UTF-8 vì vậy luôn chọn Western (Latin1) bất kể cài đặt máy chủ và thẻ meta.


1

Ngoài những gì được nói ở đây, tôi sẽ thử sử dụng cùng một bảng mã trong tất cả các trang - tốt nhất là UTF-8(nhưng nếu gần như mọi thứ đều được iso-8859-1, hãy sử dụng cái này).

Để nhanh chóng kiểm tra bộ ký tự của tệp, bạn có thể thử:

file --mime-type --mime-encoding {filename}

Để kiểm tra bộ ký tự của tất cả các tệp trong cây, bạn có thể thử:

find . -type f -exec file --mime-type --mime-encoding '{}' \;

hoặc (chỉ gọi filelệnh một lần):

find . -type f -print | file --mime-type --mime-encoding -f-

Để có được một bản tóm tắt, sử dụng -btùy chọn cho filelệnh (bỏ qua tên tệp) và dẫn kết quả đến sort | uniq -c.

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.