การแสดงสัญลักษณ์ Unicode ใน HTML


89

ฉันต้องการเพียงแค่แสดงสัญลักษณ์เห็บ (✔) และเครื่องหมายกากบาท (✘) ในหน้า HTML แต่จะแสดงเป็นกล่องหรือ goop ✔ ซึ่งเห็นได้ชัดว่ามีอะไรเกี่ยวข้องกับการเข้ารหัส

ฉันได้ตั้งค่าเมตาแท็กเพื่อแสดง utf-8 แต่เห็นได้ชัดว่าฉันขาดอะไรไป

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

แก้ไข / วิธีแก้ไข:จากการแสดงความคิดเห็นโดยใช้ FireBug ฉันพบว่าส่วนหัวที่เพจของฉันส่งผ่านนั้นเป็น "Content-Type: text / html" ไม่ใช่ UTF-8 เมื่อดูรูปแบบไฟล์โดยใช้ Notepad ++ พบว่าไฟล์ของฉันถูกจัดรูปแบบเป็น "UTF-8 ที่ไม่มี BOM" การเปลี่ยนสิ่งนี้เป็นเพียง UTF-8 ตอนนี้สัญลักษณ์แสดงอย่างถูกต้อง ... แต่ firebug ยังคงระบุว่าเป็นประเภทเนื้อหาเดียวกัน

คำตอบ:


56

คุณควรตรวจสอบว่าส่วนหัวของเซิร์ฟเวอร์ HTTP ถูกต้อง

โดยเฉพาะส่วนหัว:

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

ควรมีอยู่

เมตาแท็กจะถูกละเว้นโดยเบราว์เซอร์หากมีส่วนหัว HTTP อยู่

ตรวจสอบให้แน่ใจด้วยว่าไฟล์ของคุณเข้ารหัสเป็น UTF-8 จริงก่อนที่จะให้บริการตรวจสอบ / ลองทำดังต่อไปนี้:

  • ตรวจสอบให้แน่ใจว่าเครื่องมือแก้ไขของคุณบันทึกเป็น UTF-8
  • ตรวจสอบให้แน่ใจว่า FTP หรือโปรแกรมถ่ายโอนไฟล์ของคุณไม่ยุ่งกับไฟล์
  • ลองใช้เอนทิตีที่เข้ารหัส HTML เช่น&#uuu;.
  • เพื่อความแน่ใจจริงๆให้ hexdump ไฟล์และดูเป็นอักขระสำหรับ✔ควรเป็น E2 9C 94

หมายเหตุ: หากคุณใช้อักขระ Unicode ซึ่งระบบของคุณไม่พบสัญลักษณ์ (ไม่มีแบบอักษรที่มีอักขระนั้น) เบราว์เซอร์ของคุณควรแสดงเครื่องหมายคำถามหรือสัญลักษณ์คล้ายบล็อค แต่ถ้าคุณเห็นอักขระโรมันหลายตัวเช่นนี้แสดงว่ามีปัญหาในการเข้ารหัส


ที่จริงแล้วเมตาแท็กไม่ได้ถูกเพิกเฉย แต่ส่วนหัว HTTP มีความสำคัญมากกว่า ขอบคุณ Konrad สำหรับความแม่นยำนั้น

8
โปรดทราบว่าในการใช้อักขระ Unicode ในcontentคุณสมบัติของ::beforeตัวเลือกCSS จะต้องใช้เครื่องหมายแบ็กสแลช เช่น '\ 2713' แทน '& # 2713'
Fabien Snauwaert

18

ฉันรู้ว่าคำตอบได้รับการยอมรับแล้ว แต่ต้องการชี้ให้เห็นบางสิ่ง

การตั้งค่าcontent-typeและcharsetเห็นได้ชัดว่าเป็นแนวทางปฏิบัติที่ดีการทำบนเซิร์ฟเวอร์นั้นดีกว่ามากเพราะช่วยให้มั่นใจได้ว่าแอปพลิเคชันของคุณมีความสอดคล้องกัน

อย่างไรก็ตามฉันจะใช้UTF-8เฉพาะเมื่อภาษาของแอปพลิเคชันของฉันใช้อักขระจำนวนมากที่มีอยู่ในUTF-8ชุดอักขระเท่านั้น หากคุณต้องการแสดงอักขระหรือสัญลักษณ์ Unicode ในกรณีใดกรณีหนึ่งคุณสามารถทำได้โดยไม่ต้องเปลี่ยนcharsetหน้าของคุณ

HTMLตัวแสดงผลสามารถแสดงสัญลักษณ์ที่ไม่ได้เป็นส่วนหนึ่งของชุดอักขระการเข้ารหัสของเพจได้เสมอตราบใดที่คุณพูดถึงสัญลักษณ์ในnumeric character reference (NCR)นั้น ฟังดูแปลก แต่เป็นเรื่องจริง

ดังนั้นแม้ว่าคุณhtmlจะมีส่วนหัวที่ระบุว่ามีการเข้ารหัสansiหรือชุดอักขระใด ๆ ก็ตามisoคุณสามารถแสดงเครื่องหมายถูกได้โดยใช้การอ้างอิงอักขระ html เป็นทศนิยม - & # 10003; หรือในฐานสิบหก - & # x2713;

ดังนั้นจึงเป็นเรื่องยากเล็กน้อยที่จะเข้าใจว่าเหตุใดคุณจึงประสบปัญหานี้ในหน้าเว็บของคุณ คุณตรวจสอบได้ไหมว่าค่า NCR ถูกต้องนี่เป็นข้อมูลอ้างอิงที่ดีhttp://www.fileformat.info/info/unicode/char/2713/index.htm


6
"อย่างไรก็ตามฉันจะใช้ UTF-8 ก็ต่อเมื่อภาษาของแอปพลิเคชันของฉันใช้อักขระจำนวนมากที่มีอยู่ในชุดอักขระ UTF-8 เท่านั้น" ทำไม? ข้อเสียในการเปลี่ยนคืออะไร?
dumbledad

3
@dumbledad: คำถามที่ดีมากฉันคิดว่าฉันปล่อยให้อคติของตัวเองบดบังคำตอบของฉัน สิ่งที่ฉันควรจะพูดคือถ้าแอปพลิเคชันทั้งหมดของคุณไม่ใช่ utf-8 อยู่แล้วการเปลี่ยนแอปพลิเคชัน vide สำหรับหน้าเดียวอาจจะใช้งานได้มากเกินไป นอกจากนี้หากภาษาการเขียนโปรแกรมและเนื้อหาของคุณไม่จำเป็นต้องใช้อักขระ utf-8 คุณสามารถคัดลอกวางอักขระขยะโดยไม่ได้ตั้งใจซึ่งตัวแก้ไขของคุณจะใช้ได้ (เนื่องจากอยู่ในโหมด utf-8) แต่โค้ดจะล้มเหลวระหว่างการดำเนินการ ต้องบอกว่าเมื่อคุณสามารถอัปเดตการเข้ารหัสและชุดอักขระของคุณ
Akshay

6

ตรวจสอบให้แน่ใจว่าคุณบันทึกไฟล์เป็น UTF-8 หรือใช้เอนทิตี HTML ( &#nnn;) สำหรับอักขระพิเศษ


ดูเหมือนจะไม่มีเอนทิตี HTML สำหรับ✔หรือฉันพลาดไป? คุณ "จริง" บันทึกไฟล์เป็น UTF-8 อย่างไรและตรวจสอบได้อย่างไร?
Peter Craig

@Peter: โดยใช้โปรแกรมแก้ไขที่ดี โปรแกรมแก้ไขข้อความส่วนใหญ่มีตัวเลือกในกล่องโต้ตอบ "บันทึกเป็น" เพื่อระบุการเข้ารหัสไฟล์หรือมีตัวเลือกอื่นซ่อนอยู่ในเมนู กลุ่มใช้การfileencodingตั้งค่า
Konrad Rudolph

9
@ ปีเตอร์คุณสามารถอ้างถึงอักขระใด ๆ ด้วยรหัสของมัน ลอง & # x2714; สำหรับเห็บ
Dan Dyer

บันทึกเป็น utf-8 แนวคิดที่น่าสนใจ ทำงานได้ดีหากคุณกำลังสร้างเพจ HTML แบบคงที่ แต่ ... แล้วหน้าเว็บแบบไดนามิกล่ะ สิ่งที่เป็นตัวอักษร Unicode / utf-8 / wide นี้ทำให้ฉันสับสนมาก รหัสแบ็กเอนด์ของฉันคือ perl ส่วนหัว http ได้รับการตั้งค่าอย่างถูกต้องและส่วนหัว html ก็เช่นกัน W3C Internationalization Checker ยืนยันว่าฉันได้ตั้งค่าเอกสารเป็น utf-8 CaSinG มีความสำคัญหรือไม่? สุดท้ายแล้วกล่องใส่ข้อความล่ะ? ฉันยังโง่อยู่! :(
Jarett Lloyd

ภาคผนวกของความคิดเห็นก่อนหน้า: ฐานข้อมูลของฉันแสดงข้อมูลที่ป้อนถูกต้องและตัวอักษรแสดงอย่างถูกต้อง ดังนั้นไม่ใช่ปัญหาฐานข้อมูล สคริปต์ perl ของฉัน (หรือตัวแก้ไข) ถูกตั้งค่าให้บันทึกสคริปต์เป็น utf-8 เซิร์ฟเวอร์ของฉัน apache2 ฉันค่อนข้างมั่นใจว่าไม่รบกวนหรือตั้งค่าถูกต้อง ทั้งหมดนี้ยังไม่แน่ใจว่าทำไมตัวอักษรถึง goop ฮึ. มันต้องมีวิธีที่ดีกว่านี้
Jarett Lloyd

5

ซึ่งแตกต่างจากที่ Nicolas เสนอmetaตรงที่เบราว์เซอร์ไม่สนใจแท็ก อย่างไรก็ตามContent-Typeส่วนหัว HTTP มีความสำคัญเหนือกว่าการมีmetaแท็กในเอกสารเสมอ

ดังนั้นตรวจสอบให้แน่ใจว่าคุณส่งการเข้ารหัสที่ถูกต้องผ่านส่วนหัว HTTP หรืออย่าส่งส่วนหัว HTTP นี้เลย (ไม่แนะนำ) metaแท็กเป็นส่วนใหญ่เป็นตัวเลือกสำรองสำหรับเอกสารในท้องถิ่นซึ่งจะไม่ส่งการจราจรผ่านทาง HTTP

การใช้เอนทิตี HTML ควรได้รับการพิจารณาว่าเป็นวิธีแก้ปัญหาด้วยเช่นกันนั่นคือการก้าวข้ามปัญหาที่แท้จริง การกำหนดค่าเว็บเซิร์ฟเวอร์อย่างเหมาะสมจะป้องกันไม่ให้เกิดความรำคาญมากมาย


0

ฉันคิดว่านี่เป็นปัญหาเกี่ยวกับไฟล์คุณบันทึกไฟล์ของคุณในการเข้ารหัส 1 ไบต์เช่น latin-1 Google ปรับปรุงโปรแกรมแก้ไขของคุณและวิธีตั้งค่าไฟล์เป็น utf-8

ฉันสงสัยว่าทำไมมีบรรณาธิการที่ไม่ผิดนัด utf-8

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