จะบอกเบราว์เซอร์เกี่ยวกับการเข้ารหัสอักขระของเว็บไซต์ HTML ได้อย่างไรไม่ว่าส่วนหัวของเซิร์ฟเวอร์เนื้อหาประเภทใด


9

ฉันมีหน้า HTML ที่ถูกต้อง (การเข้ารหัสของฟิสิคัลบนดิสก์ตรงกับมัน) ประกาศว่าเป็นประเภทเนื้อหา :

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

เปิดไฟล์จากดิสก์ในเบราว์เซอร์ (Google Chrome, Firefox) ทำงานได้ดี

เมื่อร้องขอผ่าน HTTP เว็บเซิร์ฟเวอร์จะส่งส่วนหัว Content-Type อื่น:

$ 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

(ดูบรรทัดสุดท้าย) เบราว์เซอร์นั้นใช้ISO-8859-1เพื่อแสดงผลที่ไม่พึงประสงค์

มีวิธีทั่วไปในการแทนที่ส่วนหัวของเซิร์ฟเวอร์ที่ส่งไปยังเบราว์เซอร์จากภายในเอกสาร HTML หรือไม่?

คำตอบ:


6

"มีวิธีทั่วไปในการแทนที่ส่วนหัวเซิร์ฟเวอร์ที่ส่งไปยังเบราว์เซอร์จากภายในเอกสาร HTML หรือไม่"

AFAIK ไม่คุณทำสิ่งที่คุณสามารถทำได้แล้ว ชุดอักขระที่กำหนดผ่านส่วนหัวสำคัญกว่านิยามของคุณในแท็ก META

หากคุณมีการเข้าถึงเซิร์ฟเวอร์เช่น Apache จะถูกกำหนดค่าโดยคำสั่งนี้ (ดูบรรทัดความคิดเห็น):

# 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

[Update]

เพื่อแสดงความคิดเห็นที่สองของ w3d ที่นี่คุณจะพบวิธีเปลี่ยนชุดอักขระผ่านhtaccess-Directivesสำหรับเซิร์ฟเวอร์ Apache


2
+1 HTTP header จะแทนที่เมตาแท็ก HTML หาก @hakre สามารถเข้าถึงฝั่งเซิร์ฟเวอร์ได้พวกเขาสามารถแทนที่ส่วนหัวของประเภทเนื้อหาในแต่ละหน้าได้
MrWhite

3
ขวานี่คือการอ้างอิงเชิงบรรทัดฐานที่ระบุว่าส่วนหัว HTTP trump meta tags: w3.org/TR/REC-html40/charset.html#h-5.2.2
Jukka K. Korpela

ขอบคุณสำหรับคำตอบ. @Korpela: ใช่ฉันมีหน่วยความจำในสเป็ค HTML มันเป็นอีกด้านที่ฉันต้องการ :(.
hakre

เกี่ยวกับ. htaccess (ขออภัยนี่อาจเป็นคำถามใหม่แทน) เป็นไปได้ไหมที่จะลบออก;charset=...จากส่วนหัว http เช่นกัน ไซต์ใช้งานได้ดีมากContent-Type: text/htmlไฟล์ต่าง ๆ มีการเข้ารหัสบนเซิร์ฟเวอร์ที่แตกต่างกัน (ฉันกลัวว่ามันจะเป็นไปไม่ได้เช่นกันเพราะฉันคิดว่าฉันหามาเมื่อหลายสัปดาห์ก่อน แต่ผลลัพธ์ก็ยังไม่จบ) ในกรณีที่คุณสามารถหลั่งน้ำตาแสงล่วงหน้า
hakre

@hakre หาก ForceType Directive ของ Apache ใช้งานได้ให้วางไว้ใน <Files> Container และใส่ชื่อไฟล์หรือไดเรกทอรีเฉพาะ เพียงออกจากส่วน "; charset =" หลังจากประเภท mime แล้วสิ่งนี้ควรทำ
เริ่มต้น

3

คุณควรตั้งค่าสิ่งนี้ในรูต. htaccess ของคุณ

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

3

ไม่ไม่สามารถทำได้จากใน HTML ส่วนหัวการตอบสนองของเซิร์ฟเวอร์มีความสำคัญเหนือเมตาแท็กของเอกสาร ตามที่ระบุไว้ใน5.2.2 การระบุการเข้ารหัสอักขระ - ข้อมูลจำเพาะ HTML 4.01 :

ในการสรุปผลการทำตามตัวแทนผู้ใช้จะต้องปฏิบัติตามลำดับความสำคัญต่อไปนี้เมื่อพิจารณาการเข้ารหัสอักขระของเอกสาร (จากลำดับความสำคัญสูงสุดไปต่ำสุด):

  1. พารามิเตอร์ HTTP "charset" ในฟิลด์ "Content-Type"
  2. การประกาศ META ที่ตั้งค่า "http-equiv" เป็น "Content-Type" และชุดค่าสำหรับ "charset"
  3. แอตทริบิวต์ charset ตั้งอยู่บนองค์ประกอบที่กำหนดทรัพยากรภายนอก

ดังนั้นสิ่งนี้ต้องการการกำหนดค่าบนฝั่งเซิร์ฟเวอร์ อย่างไรก็ตามในขณะที่บทต่อ:

ตัวแทนผู้ใช้อาจมีกลไกที่อนุญาตให้ผู้ใช้แทนที่ข้อมูล "ชุดอักขระ" ที่ไม่ถูกต้อง อย่างไรก็ตามหากตัวแทนผู้ใช้มีกลไกดังกล่าวก็ควรให้มันสำหรับการเรียกดูและไม่สำหรับการแก้ไขเพื่อหลีกเลี่ยงการสร้างหน้าเว็บที่ทำเครื่องหมายด้วยพารามิเตอร์ "charset" ที่ไม่ถูกต้อง

ในกรณีของฉันเซิร์ฟเวอร์ของชนิดเนื้อหาส่วนหัวมีสิทธิชนิด mimeแต่ผิดcharset

เมื่อมันปรากฏขึ้นการกำหนดค่า Apache httpd ของฉันได้ตั้งค่าการAddDefaultCharsetเปิดซึ่งเพิ่ม; charset=ISO-8859-1ส่วน วางลงในไดเรกทอรีเว็บไซต์ราก.htaccessบรรทัดต่อไปนี้:

AddDefaultCharset Off

ข้อมูลชุดอักขระถูกลบออก:

$ 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

(ดูบรรทัดสุดท้ายไม่มี; charset=...ส่วน) เมื่อใช้ร่วมกับเมตาแท็ก html ทริกเกอร์ฮิวริสติกของเบราว์เซอร์ที่กล่าวมาจะใช้แทนชุดอักขระจากเมตาแท็ก เว็บไซต์ถอดรหัสอย่างถูกต้อง

ทดสอบกับ:

  • Google Chrome เวอร์ชัน 22.0.1229.94
  • Firefox เวอร์ชัน 16.0.1
  • รุ่น Lynx 2.8.7rel.1 (5 ก.ค. 2552)

เบราว์เซอร์ทั้งสามนี้มีปัญหากับการกำหนดค่าดั้งเดิมและทำงานในขณะนี้ (ทั้งหมดใน Fedora 17)

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

ไม่มีปัญหาในตอนแรก ทั้งคู่เลือกที่จะใช้UTF-8จากเมตาแท็กเหนือการตั้งค่าISO-8859-1จากเซิร์ฟเวอร์

  • Netscape 2.01 Gold

ไม่รองรับ UTF-8 ดังนั้นให้เลือกWestern (Latin1) เสมอไม่ว่าการตั้งค่าเซิร์ฟเวอร์และเมตาแท็กจะเป็นอย่างไร


1

นอกจากสิ่งที่พูดในที่นี้ฉันจะลองใช้ชุดอักขระเดียวกันในทุกหน้า - เด่นกว่าUTF-8(แต่ถ้าใช้เกือบทุกอย่างiso-8859-1ให้ใช้สิ่งนี้)

หากต้องการตรวจสอบชุดอักขระของไฟล์อย่างรวดเร็วคุณสามารถลอง:

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

ในการตรวจสอบชุดอักขระของไฟล์ทั้งหมดในแผนผังคุณสามารถลอง:

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

หรือ (เรียกfileคำสั่งเพียงครั้งเดียว):

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

ในการรับข้อมูลสรุปให้ใช้-bตัวเลือกfileคำสั่ง (เพื่อตัดชื่อไฟล์) และไพพ์ผลลัพธ์ที่sort | uniq -cได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.