จะป้องกันไม่ให้อักขระ Unicode แสดงผลเป็นอีโมจิใน HTML จาก JavaScript ได้อย่างไร


120

ฉันพบ Unicode อักขระพิเศษจากการค้นหาของ FileFormat.Info

อักขระบางตัวแสดงเป็นร่ายมนตร์ขาวดำแบบคลาสสิกเช่น⚠ (ป้ายเตือน\u26A0หรือ⚠) สิ่งเหล่านี้ดีกว่าเนื่องจากฉันสามารถใช้สไตล์ CSS (เช่นสี) กับพวกเขาได้

ภาพสัญลักษณ์เตือน

คนอื่น ๆ กำลังแสดงผลเป็นอีโมจิการ์ตูนที่ใหม่กว่าเช่น⌛ (นาฬิกาทราย\u231Bหรือ⌛) สิ่งเหล่านี้ไม่เป็นที่ต้องการเนื่องจากฉันไม่สามารถจัดสไตล์ได้อย่างสมบูรณ์

ภาพอีโมจินาฬิกาทราย

ดูเหมือนว่าเบราว์เซอร์จะทำการเปลี่ยนแปลงนี้เนื่องจากฉันสามารถเห็นสัญลักษณ์นาฬิกาทรายบน Mac Firefox ไม่ใช่แค่ Mac Chrome หรือ Mac Safari

มีวิธีบังคับให้เบราว์เซอร์แสดงเวอร์ชัน (เสียงเดียวแบบแบน) ที่เก่ากว่าหรือไม่?

ปรับปรุง : ดูเหมือน (จากความคิดเห็นด้านล่าง) มีการเลือกนำเสนอข้อความ , FE0Eที่มีอยู่ในการบังคับใช้ข้อความ VS-อีโมจิ ตัวเลือกจะเชื่อมต่อกันเป็นส่วนต่อท้ายโดยไม่มีช่องว่างบนโค้ดของอักขระเช่น⌛︎HTML hex หรือ\u231B\uFE0Eสำหรับ JS อย่างไรก็ตามเบราว์เซอร์ทั้งหมดไม่ได้รับเกียรติจากเบราว์เซอร์ทั้งหมด (เช่น Chrome และ Edge)


คุณตั้งกลุ่มแบบอักษรในกฎ CSS ของคุณหรือไม่
G-Cyrillus


1
@janaspage ︎และ\uFE0Eถูกต้อง (2 และ 8) และทำงานได้ดีใน Safari (8 และ 9) แต่เหมือนคำตอบที่กล่าวไว้: การสนับสนุนเบราว์เซอร์ไม่แน่นอนและ Chrome (46) เสียอย่างสมบูรณ์
一二三

2
ไม่มีวิธีมาตรฐานในการควบคุมการแสดงผลของ Emojis
nwellnhof

1
สิ่งที่คุณต้องทำคือบังคับใช้แบบอักษรที่มีร่ายมนตร์สำหรับอักขระนี้และร่ายมนตร์ของใครจะมีลักษณะตามที่คุณต้องการ (ไม่มีสีไม่มีรูปร่างหรืออะไรก็ได้ที่คุณต้องการ)
ShreevatsaR

คำตอบ:


134

ผนวกเลือกรูปแบบ Unicodeตัวอักษรสำหรับการบังคับให้ข้อความ ︎VS15,
สิ่งนี้บังคับให้อักขระก่อนหน้านี้แสดงเป็นข้อความแทนที่จะเป็นสัญลักษณ์อิโมจิ

<p>🔒&#xFE0E;</p>

ผลลัพธ์: 🔒︎

เรียนรู้เพิ่มเติมที่: สัญลักษณ์ Unicode เป็นข้อความหรืออีโมจิ


1
สิ่งนี้มีประโยชน์มากซึ่งเป็นสาเหตุที่ทำให้ฉันโหวตเพิ่มเมื่อวันก่อน ฉันสงสัยว่าฉันจะวางอิโมจิและตัวละครที่มองไม่เห็นนี้ลงในโฆษณา Facebook ที่ฉันเขียนได้อย่างไร? ปล. สิ่งนี้น่าสนใจเช่นกัน: apple.stackexchange.com/a/240450/53510
Ryan

3
ฉันเพิ่งรู้ว่า&#xFE0E;เคล็ดลับนี้ใช้ไม่ได้กับฉันสำหรับแบบอักษรบางแบบ ฉันมีปัญหาในการค้นหาแบบอักษรที่คาดว่าจะติดตั้งได้ในทุกเครื่อง (Windows, iOS, Mac, Android ฯลฯ )
Ryan

12
โซลูชันนี้ไม่เป็นที่ยอมรับสำหรับสัญลักษณ์ที่อาจเกิดขึ้นในช่องป้อนข้อมูล ฉันมีปัญหากับสัญลักษณ์↔ที่ใช้ในตรรกะและฉันไม่สามารถเข้าใจได้ตลอดชีวิตว่าทำไมใคร ๆ ก็คิดว่านี่ควรจะเป็นอีโมจิ!
frabjous

2
หน้าต่อไปนี้มีประโยชน์สำหรับการคัดลอกและวางอักขระพิเศษนั้นทันทีต่อจากอิโมจิเพื่อให้แบนราบแทนที่จะทำให้เป็นสไตล์ เช่นคุณอาจเห็น💬︎แทน💬และ🌟︎แทนที่จะเป็น🌟และ⌛︎แทนที่จะเป็น⌛และ🔒︎แทนที่จะเป็น🔒 (ขึ้นอยู่กับอุปกรณ์ของคุณ) unicode-symbol.com/u/FE0E.html
Ryan

15
สิ่งนี้แสดงผลเป็นอิโมจิในตัวอย่างสำหรับฉัน chrome 71 บน mac 10.11.6
lahwran

13

ผมมีอักขระ Unicode ในcontentของspan::beforeและผมมีfont-familyของspanชุด "Segoe UI สัญลักษณ์" แต่ Chrome ใช้ "Segoe UI Emoji" เป็นแบบอักษรในการแสดงผล

อย่างไรก็ตามเมื่อฉันตั้งค่าเป็นfont-family"Segoe UI Symbol" อย่างชัดเจนสำหรับสิ่งspan::beforeนั้นแทนที่จะเป็นเพียงเพื่อใช้spanงานได้


นี่ควรเป็นคำตอบที่ถูกต้องโดยเฉพาะอย่างยิ่งเนื่องจากวิธีการอักขระล่องหนแบบเก่าไม่ได้รับการยกย่องจากเบราว์เซอร์หลัก ๆ
Sarah C.Corriher

2

สำหรับโซลูชัน CSS อย่างเดียวเพื่อป้องกันไม่ให้ iOS แสดงอิโมจิคุณสามารถใช้font-family: monospaceค่าเริ่มต้นใดสำหรับรูปแบบข้อความของสัญลักษณ์แทนรูปแบบอิโมจิ


1

แบบอักษร Android ไม่สมบูรณ์อย่างที่คุณคาดหวัง ไฟล์ฟอนต์ไม่มีสัญลักษณ์แปลกใหม่เหล่านี้และ Android มีแฮ็คสำหรับอักขระไม่กี่ตัวที่ไม่มีสัญลักษณ์ พวกเขาจะถูกแทนที่ด้วยไอคอน

ดังนั้นวิธีแก้ปัญหาคือการรวมไซต์เข้ากับแบบอักษรของเว็บ (woff) สร้างไฟล์ฟอนต์ใหม่ด้วย FontForge และเลือกสัญลักษณ์ที่ต้องการจาก serif TTF ฟรีเช่น ทุกร่ายจะใช้เวลา 1k สร้างไฟล์ woff

เตรียม CSS อย่างง่ายเพื่อนำเข้าตระกูลฟอนต์ที่กำหนดเอง

style.css:

@font-face {
  font-family: 'Exotic Icons';
  src: url('exotic-icons.woff') format('woff');
}

.exotic-symbol-font {
    position: relative;
    top: 1px;
    display: inline-block;
    font-family: 'Exotic Icons';
    font-style: normal;
    font-weight: normal;
    line-height: 1;

    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

ไฟล์ index.html:

<html>
  <head>
    <meta charset="utf-8">
    <link href="style.css" rel="stylesheet"></head>
    <title>Test custom glyphs</title>
  </head>
  <body>
    <table>
      <tr>
        <td class="exotic-symbol-font">
            😭  &#x2660; a  g
        </td>       
      </tr>
    </table>
  </body>
</html>

1

หากข้อกังวลหลักของคุณคือการบังคับให้แสดงสีเดียวเพื่อให้อีโมจิไม่โดดเด่นจากข้อความมากเกินไปตัวกรอง CSS ไม่ว่าจะใช้เพียงอย่างเดียวหรือใช้ร่วมกับตัวเลือกรูปแบบ Unicode อาจเป็นสิ่งที่คุณต้องการ

p.gscale { 
  -webkit-filter: grayscale(100%);
  filter: grayscale(100%);
}
a {
  color: #999;
  -webkit-filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
   filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
}
<p class="gscale">You've now got emoji display on 🔒lockdown🔒.</p>

<p>External Link: <a href="https://knowyourmeme.com/memes/party-hard">celebrate 🎉</a></p>

ต่างจากตัวเลือกรูปแบบไม่ควรสำคัญว่าจะแสดงอิโมจิอย่างไรเนื่องจากตัวกรอง CSS ใช้กับทุกสิ่ง (ฉันใช้มันเพื่อปรับขนาดไอคอน "ประเภทลิงก์" ในรูปแบบ PNG สีเทาบนไฮเปอร์ลิงก์ที่ได้รับการแก้ไขให้ชี้ไปที่ Wayback Machine)

เพียงใจข้อแม้ คุณไม่สามารถแทนที่ตัวกรองขององค์ประกอบหลักในเด็กได้ดังนั้นจึงไม่สามารถใช้เทคนิคนี้ในการปรับขนาดย่อหน้าให้เป็นสีเทาจากนั้นจึงปรับสีลิงก์ที่อยู่ภายในองค์ประกอบนั้นอีกครั้ง 😢

... ถึงกระนั้นก็มีประโยชน์สำหรับสถานการณ์ที่คุณกำลังจะทำให้สิ่งทั้งหมดเป็นไฮเปอร์ลิงก์หรือไม่อนุญาตให้มีมาร์กอัปที่สมบูรณ์อยู่ภายใน (เช่นชื่อเรื่องและคำอธิบาย)

อย่างไรก็ตามสิ่งนี้จะใช้ไม่ได้เว้นแต่จะนำ CSS มาใช้จริงดังนั้นฉันจะให้ตัวเลือกที่สองซึ่งมีความน่าเชื่อถือใน<title>องค์ประกอบมากกว่าตัวเลือกรูปแบบ Unicode (ฉันกำลังดู GitHub ของคุณฉันไม่ชอบไอคอนปลอมในของฉัน แท็บเบราว์เซอร์):

หากคุณใส่สตริงที่ผู้ใช้ให้มาใน<title>องค์ประกอบให้กรองอีโมจิออกพร้อมกับตัวหนา / ตัวเอียง / ขีดเส้นใต้ / ฯลฯ มาร์กอัป (ใช่สำหรับผู้ที่พลาดมาตรฐานนี้จะเรียกร้องให้เนื้อหา<title>เป็นข้อความธรรมดานอกเหนือจากเครื่องหมายและค่า Escape และเบราว์เซอร์ที่ฉันทดสอบแท็กตีความทั้งหมดภายในเป็นข้อความตามตัวอักษร)

สองวิธีที่ฉันคิดได้คือ:

  1. ใช้regex ที่ดูแลด้วยตนเองโดยตรงซึ่งตรงกับบล็อคที่ Unicode เวอร์ชันล่าสุดใส่อิโมจิและตัวปรับแต่ง
  2. วนซ้ำผ่านกลุ่มกราฟและทิ้งสิ่งที่มีจุดรหัสอีโมจิที่รู้จัก (คลัสเตอร์กราฟฟีมคือสัญลักษณ์พื้นฐานบวกกับตัวกำกับเสียงและตัวปรับแต่งอื่น ๆ ที่ประกอบเป็นอักขระที่มองเห็นได้ตัวอย่างที่ฉันเชื่อมโยงเพื่อใช้เอ็นจิ้น regex ของ Python ในการโทเค็นจากนั้นจึงเป็นemojiแพ็กเกจสำหรับฐานข้อมูล แต่ Rust เป็นตัวอย่างที่ดีของภาษา ซึ่งการวนซ้ำคลัสเตอร์กราฟีมทำได้ง่ายและรวดเร็วผ่านลังเช่นunicode-segmentation)

0

Google Chrome เดสก์ท็อปเวอร์ชัน 75 ดูเหมือนจะทำให้เข้าใจผิดในแนวทางการแสดงผลอักขระ Unicode ตาม Unicode แรกที่พบขณะโหลดหน้าเว็บ ตัวอย่างเช่นเมื่อแยกวิเคราะห์เป็น Escape Unicode HTML แรกในแหล่งที่มาของหน้าและไม่มีอีโมจิเทียบเท่า & # 9207; ดูเหมือนว่าจะชี้แจงให้ Chrome ทราบว่าหน้าดังกล่าวมีการหลีกเลี่ยงไม่ให้แสดงเป็นอีโมจิ


0

การขยายตามคำตอบของ ssokolow การใช้ตัวกรองเป็นสิ่งที่ดีและอย่างน้อยก็ทำให้มองเห็นรูปทรงได้แทนที่จะใช้แบบอักษรธรรมดา แต่การแปลงสี RGB เป็นลำดับของฟิลเตอร์ CSS นั้นยากมากเมื่อคุณต้องการใช้สีเฉพาะ

ตัวเลือกที่ดีกว่า (แม้ว่าจะค่อนข้างใช้คำมาก) คือการใช้<feColorMatrix>ตัวกรอง SVG เมื่อรวมกับตัวกรองระดับสีเทาและโครงร่าง URI ข้อมูลคุณสามารถแสดงสีผ่าน RGB และ CSS ในบรรทัด:

.violet {
  color: white;
  filter: grayscale(100%) url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='0.78 0 0 0 0  0 0.082 0 0 0  0 0 0.522 0 0  0 0 0 1 0'/></filter></svg>#f");
}

ขออภัยคุณไม่สามารถแก้ไข URL ด้วยข้อมูล (นำมาจากแอตทริบิวต์หรือตัวแปร) แต่อย่างน้อยคุณก็ไม่ต้องคำนวณตัวกรอง CSS จาก RGB


-2

ฉันไม่รู้วิธีปิดการแสดงผลประเภทอิโมจิ โดยปกติฉันจะใช้แบบอักษรไอคอนเช่นฟอนต์ Awesomeหรือglyphicons (มาพร้อมกับ Bootstrap 3)

ประโยชน์ของการใช้สิ่งเหล่านี้กับอักขระ Unicode คือ

  1. คุณสามารถเลือกสไตล์ที่แตกต่างกันเพื่อให้เหมาะกับการออกแบบเว็บไซต์ของคุณ
  2. มีความสอดคล้องกันในทุกเบราว์เซอร์ (หากคุณเคยลองใช้อักขระ Unicode star คุณจะสังเกตเห็นว่ามันแตกต่างกันใน IE กับเบราว์เซอร์อื่น ๆ )
  3. นอกจากนี้ยังสามารถปรับเปลี่ยนรูปแบบได้อย่างสมบูรณ์เช่นอักขระ Unicode ที่คุณพยายามใช้

ข้อเสียเพียงอย่างเดียวคือเป็นอีกสิ่งหนึ่งที่เบราว์เซอร์จะดาวน์โหลดเมื่อพวกเขาดูเพจของคุณ



-3

ไม่มีวิธีแก้ปัญหาใดข้างต้นที่ใช้ได้กับส่วนขยาย "Emoji สำหรับ Google Chrome"

ดังนั้นเพื่อเป็นการแก้ปัญหาฉันได้สร้างภาพหน้าจอของตัวละคร Unicode 'BALLOT BOX WITH CHECK' (U + 2611) และเพิ่มเป็นภาพด้วย php:

 $ballotBoxWithCheck='<img src="pics/U2611.png" style="height:11px;margin-bottom:-1px">'; # &#9745; or /U2611

ใส่คำอธิบายภาพที่นี่

ดู: https://spacetrace.org/man_card.php?tec_id=21&techname=multi-emp-vessel


เกือบจะดีกว่าอย่างแน่นอนที่จะวางลงใน Inkscape โดยใช้เครื่องมือข้อความ (ด้วยแบบอักษรที่เลือกใบอนุญาตที่เหมาะสม) จากนั้นเรียกใช้การติดตามอัตโนมัติเพื่อให้คุณสามารถดึง SVG ออกมาซึ่งจะปรับขนาดตามขนาดที่คุณต้องการ (เพื่อให้มีขนาดเล็กที่สุดให้จับคู่ตัวย่อ SVG กับการแก้ไขด้วยตนเองเพื่อลดจำนวนโหนดในเส้นทางที่การติดตามอัตโนมัติเกิดขึ้น)
ssokolow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.