ปัญหาการเข้ารหัส HTML - ตัวอักษร "Â" ปรากฏขึ้นแทนที่จะเป็น "& nbsp;"


203

ฉันมีแอปรุ่นเก่าที่เพิ่งเริ่มทำงานผิดปกติไม่ว่าด้วยเหตุผลใดก็ตามฉันไม่แน่ใจ มันสร้างกลุ่ม HTML ที่กลายเป็นรายงาน PDF โดย ActivePDF

กระบวนการทำงานเช่นนี้:

  1. ดึงเทมเพลต HTML จากฐานข้อมูลที่มีโทเค็นนั้นเพื่อแทนที่ (เช่น "~ CompanyName ~", "~ CustomerName ~" เป็นต้น)
  2. แทนที่โทเค็นด้วยข้อมูลจริง
  3. จัดระเบียบ HTML ด้วยฟังก์ชัน regex อย่างง่ายที่คุณสมบัติจะจัดรูปแบบค่าแอตทริบิวต์แท็ก HTML (ตรวจสอบให้แน่ใจว่าเครื่องหมายคำพูด ฯลฯ เนื่องจากเครื่องมือการเรนเดอร์การแสดงผลของ ActivePDF ไม่ชอบอะไรเลย
  4. ส่ง HTML ไปยังบริการเว็บที่สร้าง PDF

อยู่ที่ไหนสักแห่งที่ว่างช่องว่างไม่แตกออกจากแม่แบบ HTML (  s) กำลังเข้ารหัสเป็น ISO-8859-1 เพื่อให้พวกเขาปรากฏขึ้นอย่างไม่ถูกต้องเป็นตัวอักษร "Â" เมื่อดูเอกสารในเบราว์เซอร์ (FireFox) ActivePDF pukes กับอักขระที่ไม่ใช่ UTF8 เหล่านี้

คำถามของฉัน: เนื่องจากฉันไม่รู้ว่าปัญหาเกิดจากที่ใดและไม่มีเวลาตรวจสอบมีวิธีง่าย ๆ ในการเข้ารหัสหรือค้นหาและแทนที่อักขระที่ไม่ดีหรือไม่ ฉันพยายามส่งมันผ่านฟังก์ชั่นเล็ก ๆ น้อย ๆ นี้ที่ฉันโยนเข้าด้วยกัน แต่มันเปลี่ยนเป็น gobbledegookไม่เปลี่ยนแปลงอะไรเลย

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

ความคิดใด ๆ

แก้ไข:

ตอนนี้ฉันกำลังใช้งานอยู่ถึงแม้ว่ามันจะดูเหมือนเป็นทางออกที่ดี:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function

2
HTML มีเมตาดาต้าใด ๆ เพื่ออธิบายชุดอักขระหรือไม่
Rowland Shaw

1
[ลบความคิดเห็นก่อนหน้านี้] คำตอบสั้น ๆ : ไม่
Cᴏʀʏ

1
สำหรับฉันทำงาน: utf8_decode ()
ursuleacv

คำตอบ:


340

อยู่ที่ไหนสักแห่งที่ว่างช่องว่างไม่แตกจากเทมเพลต HTML (s) กำลังเข้ารหัสเป็น ISO-8859-1 เพื่อให้พวกเขาแสดงอย่างไม่ถูกต้องเป็นตัวอักษร "Â"

นั่นจะเป็นการเข้ารหัส UTF-8 ไม่ใช่ ISO-8859-1 อักขระช่องว่างที่ไม่ทำลายคือไบต์ 0xA0 ใน ISO-8859-1 เมื่อการเข้ารหัสเป็น UTF-8 มันจะ 0xC2,0xA0 ซึ่งถ้าคุณ (ถูก) ดูว่ามันเป็นมาตรฐาน ISO-8859-1 " "ออกมาเป็น ซึ่งรวมถึงส่วนท้ายที่คุณอาจไม่สังเกตเห็น หากไบต์นั้นไม่มีอยู่ก็มีบางอย่างที่ทำให้เอกสารของคุณลอกคราบและเราจำเป็นต้องดูเพิ่มเติมเพื่อค้นหาว่ามีอะไรบ้าง

regexp คืออะไร templating ทำงานอย่างไร ดูเหมือนว่ามีการแยกวิเคราะห์ HTML ที่เหมาะสมที่เกี่ยวข้องบางแห่งถ้า สตริงของคุณ(ถูกต้อง) จะกลายเป็น U + 00A0 อักขระที่ไม่ทำลายพื้นที่ ถ้าเป็นเช่นนั้นคุณสามารถประมวลผลเทมเพลตของคุณได้ใน DOM และขอให้มันเป็นลำดับโดยใช้การเข้ารหัส ASCII เพื่อเก็บอักขระที่ไม่ใช่ ASCII เป็นการอ้างอิงอักขระ นั่นจะทำให้คุณไม่ต้องทำการโพสต์โพรเซสซิงบน HTML อีกต่อไปซึ่งเป็นธุรกิจที่หลีกเลี่ยงไม่ได้

อย่างไรก็ตามในตอนนี้คุณสามารถเพิ่มรายการใดรายการหนึ่งต่อไปนี้ลงในเอกสารของคุณ<head>และดูว่าสิ่งนั้นทำให้ดูถูกต้องในเบราว์เซอร์หรือไม่:

  • สำหรับ HTML4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • สำหรับ HTML5: <meta charset="utf-8">

หากคุณทำเช่นนั้นแสดงว่าปัญหาที่เหลืออยู่เป็นความผิดของ ActivePDF


20
ฉันจะไม่แนะนำ<meta charset="utf-8">เลย http-equivรุ่นยังคงถูกต้องใน HTML5 และจะดีกว่าได้รับการสนับสนุน
bobince

8
คำตอบที่ควรใช้: <meta charset = 'utf-8'> vs vs <meta http-equiv =สถานะ'ประเภทเนื้อหา'ที่เวอร์ชันสั้นได้รับการสนับสนุนเป็นอย่างดี
Richard Ayotte

1
พบแหล่งข้อมูลอื่นใช้งานได้กับทุกเบราว์เซอร์
Richard Ayotte

มันทำงานได้ในเบราว์เซอร์ที่ทันสมัยทั้งหมด ไม่สามารถใช้งานได้กับเบราว์เซอร์รุ่นเก่าและรุ่นโพรง (เช่นมือถือ) หรือสไปเดอร์ทั้งหมด
bobince

3
"อยู่ที่ไหนสักแห่งที่เป็นระเบียบ" ... ฮ่า ๆ ! เยี่ยมมาก! คำตอบที่ดี! +1
ต่อต้านการออกแบบ

24

หากใครมีปัญหาเดียวกันกับฉันและชุดอักขระถูกต้องแล้วให้ทำดังนี้

  1. คัดลอกรหัสทั้งหมดภายในไฟล์. html
  2. เปิดแผ่นจดบันทึก (หรือตัวแก้ไขข้อความพื้นฐาน) แล้ววางรหัส
  3. ไปที่ "ไฟล์ -> บันทึกเป็น"
  4. ป้อนชื่อไฟล์ "example.html" (เลือก "บันทึกเป็นประเภท: ไฟล์ทั้งหมด ( . )")
  5. เลือกการเข้ารหัสเป็น UTF-8
  6. กดบันทึกและตอนนี้คุณสามารถลบไฟล์. html เก่าของคุณและการเข้ารหัสควรได้รับการแก้ไข

2
มันทำเพื่อฉัน ตอนนี้ในประเสริฐก็กล่าวว่าแทนUTF-8 with BOM UTF-8หากต้องการดูสิ่งนี้ในข้อความประเสริฐคุณต้องshow_encodingตั้งค่าเป็นtrueในการตั้งค่า - ผู้ใช้
J86

ฉันมีปัญหาที่แสดงÂแทน», amd เมื่อใช้โซลูชันนี้แก้ไขปัญหาได้แล้ว แต่มีคำเตือน php: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

วิธีนี้ใช้ได้ผลสำหรับฉัน ฉันทำงานใน notepad ++ และเมื่อฉันบันทึกไว้ใน ms notepad ขั้นพื้นฐานเป็น UTF-8 หลังจากเปิดไฟล์ใหม่ใน notepad ++ การเข้ารหัสถูกตั้งค่าเป็น UTF-8-BOM (ซึ่งฉันไม่แน่ใจว่ามันแปลว่าอะไร) อย่างไรก็ตามดูเหมือนว่าจะเป็นปัญหาสำหรับฉัน
BoltKey

ขอบคุณ! นี่เป็นการหลอกลวง ฉันเห็นในคำขอ / ตอบกลับไฟล์ (ในกรณีของฉัน, ASPX) ถูกเข้ารหัสเป็น UTF-8 Notepad ++ มีการเข้ารหัสเป็น UTF-8 เช่นกัน ห่าอะไรนะ? แต่คุณแก้ปัญหาได้หลอกลวง สำหรับฉันมันเป็นวลีภาษาสเปนที่ไม่ได้เข้ารหัสอย่างถูกต้องบนหน้าเว็บ ฉันอ่านที่อื่นไม่ให้ใช้ UTF-8 BOM สำหรับสเปน แต่แก้ไขให้ฉันได้
user3621633

13

ปัญหา: แม้ฉันกำลังเผชิญปัญหาที่เราได้ส่ง'£'กับสตริงบางอย่างในคำขอ POST ระบบ CRM แต่เมื่อเรากำลังทำสายได้รับจาก CRM มันก็กลับมา'A £'ที่มีเนื้อหาบางสตริง ดังนั้นสิ่งที่เราได้วิเคราะห์ว่า'£'กำลังจะแปลงเป็น'A £'

วิเคราะห์: ความผิดพลาดที่เราได้พบหลังจากการทำวิจัยที่อยู่ใน POST เรียกเราได้ตั้ง HttpWebRequest ContentType เป็น "text / XML"ในขณะที่ได้รับสายมันเป็น"text / XML; charset: UTF-8"

การแก้ไข: เพื่อเป็นส่วนหนึ่งของการแก้ปัญหาเราได้รวมชุดอักขระ: utf-8ไว้ในคำขอ POST และใช้งานได้


0

ในกรณีของฉันสิ่งนี้ (a ที่มีเครื่องหมายรูปหมวก) เกิดขึ้นในรหัสที่ฉันสร้างขึ้นจากสตูดิโอภาพโดยใช้เครื่องมือของตัวเองในการสร้างรหัส มันง่ายที่จะแก้ปัญหา:

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

PS: มันง่ายกว่าที่จะเห็นตัวละครที่คล้ายกันทั้งหมดเมื่อคุณวางเคอร์เซอร์ไว้ที่หนึ่งหรือถ้าคุณเลือกมันใน VS2017 +; ฉันหวังว่า IDEs อื่น ๆ อาจมีคุณสมบัติที่คล้ายกัน


-1

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

ในที่สุดการเปลี่ยนแบบอักษรสำหรับ IE (ด้วย CSS เฉพาะเบราว์เซอร์) ช่วยฉันใช้ Helvetica-Nue เป็นตัวอักษรเปลี่ยนไป Arial แก้ไขปัญหา


สาเหตุที่การเปลี่ยนแบบอักษรอาจช่วยได้อาจเป็นเพราะแบบอักษรตัวหนึ่งไม่มีอักขระที่เป็นปัญหาดังนั้นสิ่งที่คุณเห็นคือตัวอักษรว่างเปล่าแทน แต่นี่ไม่ได้แก้ปัญหา แต่ครอบคลุมมันเท่านั้น
Oliver Hausler

-2

ฉันมีปัญหาแบบเดียวกัน เห็นได้ชัดว่ามันเป็นเพียงเพราะ PHP ไม่รู้จัก utf-8

ในตอนแรกฉันฉีกผมออกเมื่อมีเครื่องหมาย '£' ปรากฏขึ้นเป็น '£' แม้จะปรากฏว่าใช้ได้ใน DreamWeaver ในที่สุดฉันจำได้ว่าฉันมีปัญหาเกี่ยวกับลิงก์ที่เกี่ยวข้องกับไฟล์ดัชนีเมื่อหน้าเว็บหากดูโดยตรงจะทำงานกับสไลด์โชว์ได้ แต่ไม่ใช่เมื่อใช้กับการรวม (แต่นั่นอยู่ข้างจุดอย่างไรก็ตามฉันสงสัยว่านี่อาจเป็น ปัญหาที่คล้ายกันดังนั้นแทนที่จะใส่เข้าไปในหน้าที่ฉันมีปัญหาฉันก็ใส่มันเข้าไปในไฟล์ index.php - ปัญหาได้รับการแก้ไขตลอด


-2

เหตุผลนี้คือ PHP ไม่รู้จัก utf-8

ที่นี่คุณสามารถตรวจสอบมันสำหรับอักขระพิเศษทั้งหมดใน HTML

http://www.degraeve.com/reference/specialcharacters.php


1
นี่ไม่ใช่คำถามเกี่ยวกับ PHP แต่เป็น VB.NET
Cᴏʀʏ

ฉันไม่ แต่คุณสามารถใช้อักขระเหล่านี้เพื่อแก้ปัญหา นี้แก้ไขปัญหาของฉัน
al123

-2

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

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