Làm cách nào để ngăn các ký tự Unicode hiển thị dưới dạng biểu tượng cảm xúc trong HTML từ JavaScript?


119

Tôi đang tìm Unicode cho các ký tự đặc biệt từ tìm kiếm của FileFormat.Info .

Một số ký tự đang hiển thị dưới dạng glyphs đen trắng cổ điển, chẳng hạn như ⚠ (dấu hiệu cảnh báo \u26A0hoặc ⚠). Chúng tốt hơn vì tôi có thể áp dụng các kiểu CSS (chẳng hạn như màu sắc) cho chúng.

hình ảnh của glyph cảnh báo

Những người khác đang hiển thị dưới dạng biểu tượng cảm xúc hoạt hình mới hơn, chẳng hạn như ⌛ (đồng hồ cát \u231Bhoặc ⌛). Những thứ này không thích hợp hơn, vì tôi không thể tạo kiểu đầy đủ cho chúng.

hình ảnh biểu tượng cảm xúc đồng hồ cát

Có vẻ như trình duyệt đang thực hiện thay đổi này, vì tôi có thể nhìn thấy hình đồng hồ cát trên Mac Firefox, không chỉ Mac Chrome hay Mac Safari.

Có cách nào để buộc trình duyệt hiển thị các phiên bản cũ hơn (đơn âm phẳng) không?

Cập nhật : Có vẻ như (từ bình luận dưới đây) có một bộ chọn trình bày văn bản , FE0E, có sẵn để thi hành văn bản-vs-biểu tượng cảm xúc. Bộ chọn được nối dưới dạng hậu tố không có khoảng trắng trên mã của ký tự, chẳng hạn như ⌛︎đối với HTML hex hoặc \u231B\uFE0Eđối với JS. Tuy nhiên, nó chỉ đơn giản là không được tôn vinh bởi tất cả các trình duyệt (ví dụ: Chrome và Edge).


bạn có đặt họ phông chữ trong quy tắc CSS của mình không?
G-Cyrillus


1
@janaspage ︎\uFE0Eđúng (2 và 8) và hoạt động tốt trong Safari (8 và 9), nhưng giống như câu trả lời đã nói: hỗ trợ trình duyệt còn thiếu và Chrome (46) hoàn toàn bị hỏng.
一 二三

2
Đơn giản là không có cách tiêu chuẩn nào để kiểm soát việc hiển thị các Biểu tượng cảm xúc.
nwellnhof

1
Tất cả những gì bạn phải làm là thực thi một phông chữ có chứa glyph cho các ký tự này và có glyph trông theo cách bạn muốn (không có màu, không có hình dạng hoặc bất cứ thứ gì bạn thích).
ShreevatsaR

Câu trả lời:


133

Nối ký tự bộ chọn biến thể Unicode để buộc văn bản, VS15 ︎,.
Điều này buộc ký tự trước đó được hiển thị dưới dạng văn bản thay vì dưới dạng Biểu tượng cảm xúc.

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

Kết quả: 🔒︎

Tìm hiểu thêm tại: Biểu tượng Unicode dưới dạng văn bản hoặc biểu tượng cảm xúc


1
Điều này rất hữu ích, đó là lý do tại sao tôi đã ủng hộ nó vào ngày hôm trước. Tôi tự hỏi làm thế nào tôi có thể dán một biểu tượng cảm xúc ký tự vô hình này vào một quảng cáo Facebook mà tôi đang viết? Tái bút
Ryan

3
Tôi chỉ nhận ra rằng &#xFE0E;thủ thuật này không phù hợp với tôi đối với một số phông chữ nhất định. Tôi đang gặp khó khăn khi tìm một phông chữ mà tôi có thể mong đợi được cài đặt hợp lý trên tất cả các máy (Windows, iOS, Mac, Android, v.v.).
Ryan

12
Giải pháp này thực sự không được chấp nhận đối với các ký hiệu thậm chí có thể xảy ra trong các trường đầu vào. Tôi đang gặp rắc rối với biểu tượng ↔ được sử dụng trong logic, và tôi không thể hiểu được lý do tại sao mọi người nghĩ rằng đây phải là một biểu tượng cảm xúc!
frabjous

2
Trang sau rất hữu ích để sao chép và dán ký tự đặc biệt đó ngay sau một biểu tượng cảm xúc để làm cho nó trông phẳng hơn là cách điệu. Ví dụ: bạn có thể thấy 💬︎ thay vì 💬 và 🌟︎ thay vì 🌟 và ⌛︎ thay vì ⌛ và 🔒︎ thay vì 🔒 (tùy thuộc vào thiết bị của bạn) unicode-symbol.com/u/FE0E.html
Ryan

15
Điều này hiển thị dưới dạng biểu tượng cảm xúc trong ví dụ đối với tôi, chrome 71 trên mac 10.11.6.
lahwran

13

Tôi có một ký tự Unicode trong ký tự contenta span::before, và tôi có ký tự font-familycủa spanbộ thành "Segoe UI Symbol". Nhưng Chrome đã sử dụng "Segoe UI Emoji" làm phông chữ để hiển thị nó.

Tuy nhiên, khi tôi đặt thành font-family"Segoe UI Symbol" rõ ràng cho span::before, thay vì chỉ cho span, thì nó đã hoạt động.


Đây phải là câu trả lời chính xác, đặc biệt là vì phương thức ký tự ẩn cũ không được hầu hết các trình duyệt lớn chấp nhận.
Sarah C. Corriher

2

Đối với giải pháp chỉ CSS để ngăn iOS hiển thị biểu tượng cảm xúc, bạn có thể sử dụng font-family: monospacemặc định cho biến thể văn bản của glyph thay vì biến thể biểu tượng cảm xúc.


1

Phông chữ Android không phong phú như bạn mong đợi. Các tệp phông chữ không có glyph kỳ lạ này và Android có một vài ký tự không có glyph. Chúng được thay thế bằng các biểu tượng.

Vì vậy, giải pháp là tích hợp trang web với một phông chữ web (woff). Tạo tệp phông chữ mới với FontForge và chọn glyph bắt buộc từ TTF serif miễn phí chẳng hạn. Mỗi glyph mất 1k. Tạo tệp woff.

Chuẩn bị CSS đơn giản để nhập họ phông chữ tùy chỉnh.

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;
}

tệp 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

Nếu mối quan tâm chính của bạn là buộc hiển thị đơn sắc để biểu tượng cảm xúc không quá nổi bật so với văn bản, các bộ lọc CSS, một mình hoặc kết hợp với bộ chọn biến thể Unicode, có thể là thứ bạn muốn.

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>

Không giống như bộ chọn biến thể, biểu tượng cảm xúc được hiển thị như thế nào không quan trọng vì các bộ lọc CSS áp dụng cho mọi thứ. (Tôi sử dụng chúng để tạo thang độ xám cho các biểu tượng "loại liên kết" định dạng PNG trên các siêu liên kết đã được sửa đổi để trỏ đến Wayback Machine.)

Chỉ cần lưu ý báo trước . Bạn không thể ghi đè bộ lọc của phần tử mẹ trong phần tử con, do đó, không thể sử dụng kỹ thuật này để tạo thang độ xám cho một đoạn văn, sau đó tô màu lại các liên kết trong đó. 😢

... vẫn còn, nó hữu ích cho những trường hợp bạn sắp biến toàn bộ thành siêu liên kết hoặc không cho phép đánh dấu chi tiết bên trong nó. (ví dụ: tiêu đề và mô tả)

Tuy nhiên, điều này sẽ không hoạt động trừ khi CSS thực sự được áp dụng, vì vậy tôi sẽ đưa ra tùy chọn thứ hai đáng tin cậy hơn trong <title> các phần tử so với bộ chọn biến thể Unicode (Tôi đang xem bạn GitHub. Tôi không thích các biểu tượng giả mạo trong tab trình duyệt):

Nếu bạn đang đặt một chuỗi do người dùng cung cấp vào một <title>phần tử, hãy lọc ra biểu tượng cảm xúc cùng với bất kỳ chữ in đậm / nghiêng / gạch dưới / v.v. nào. đánh dấu. (Vâng, đối với những người đã bỏ lỡ nó, tiêu chuẩn yêu cầu nội dung của <title>phải là văn bản thuần túy ngoại trừ dấu và thoát và các trình duyệt mà tôi đã thử nghiệm giải thích tất cả các thẻ bên trong dưới dạng văn bản nghĩa đen.)

Hai cách tôi có thể nghĩ ra là:

  1. Trực tiếp sử dụng regex được bảo trì thủ công phù hợp với các khối mà phiên bản Unicode mới nhất đặt biểu tượng cảm xúc và các bộ sửa đổi của chúng.
  2. Lặp lại thông qua các cụm grapheme và loại bỏ bất kỳ cụm từ nào có chứa mã biểu tượng cảm xúc được công nhận. (Một cụm grapheme là một glyph cơ sở cộng với tất cả các dấu phụ và các bổ ngữ khác tạo nên ký tự hiển thị. Ví dụ tôi liên kết để sử dụng công cụ regex của Python để mã hóa và sau đó là emojigói cho cơ sở dữ liệu, nhưng Rust là một ví dụ điển hình về một ngôn ngữ trong đó việc lặp lại các cụm grapheme nhanh chóng và dễ dàng thông qua một thùng như unicode-segmentation.)

0

Google Chrome, phiên bản 75 dành cho máy tính để bàn, dường như không phân biệt được cách tiếp cận của nó để hiển thị các ký tự Unicode dựa trên lối thoát Unicode đầu tiên mà nó gặp phải khi tải trang. Ví dụ: khi được phân tích cú pháp dưới dạng lối thoát Unicode HTML đầu tiên trong nguồn trang và không có biểu tượng cảm xúc tương đương, & # 9207; dường như làm rõ với Chrome rằng trang chứa các đoạn thoát không được hiển thị dưới dạng biểu tượng cảm xúc.


0

Mở rộng theo câu trả lời của ssokolow , sử dụng bộ lọc là tốt và ít nhất là làm cho các đường viền có thể nhìn thấy thay vì sử dụng một phông chữ đơn giản, nhưng việc chuyển đổi màu RGB thành một chuỗi các bộ lọc CSS là rất khó khi bạn muốn sử dụng một màu cụ thể.

Một tùy chọn tốt hơn (mặc dù khá dài dòng) là sử dụng <feColorMatrix>bộ lọc SVG. Kết hợp với bộ lọc thang độ xám và lược đồ URI dữ liệu, bạn có thể biểu diễn màu thông qua RGB và CSS nội dòng:

.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");
}

Thật không may, bạn không thể nội suy URL với dữ liệu (lấy từ các thuộc tính hoặc biến), nhưng ít nhất bạn không phải tính toán các bộ lọc CSS từ RGB.


-2

Tôi không biết cách tắt hiển thị loại biểu tượng cảm xúc. Thông thường, tôi sử dụng một phông chữ biểu tượng như phông chữ tuyệt vời hoặc glyphicons (đi kèm với Bootstrap 3).

Lợi ích của việc sử dụng chúng trên các ký tự unicode là

  1. bạn có thể chọn từ nhiều kiểu khác nhau để nó phù hợp với thiết kế của trang web của bạn;
  2. chúng nhất quán trên các trình duyệt (nếu bạn đã từng thử tạo ký tự sao unicode, bạn sẽ nhận thấy nó khác biệt trong IE so với trình duyệt khác);
  3. ngoài ra, chúng hoàn toàn có thể tạo kiểu, giống như các ký tự unicode mà bạn đang cố gắng sử dụng.

Nhược điểm duy nhất của nó là trình duyệt phải tải xuống khi họ xem trang của bạn.


-2

Đối với tôi trên OSX, giải pháp là đặt font-family thành EmojiSymbols


-3

Không có giải pháp nào ở trên phù hợp với Tiện ích mở rộng "Biểu tượng cảm xúc cho Google Chrome".

Vì vậy, để giải quyết vấn đề này, tôi đã tạo một ảnh chụp màn hình của ký tự Unicode 'HỘP BÓNG ĐÁ CÓ KIỂM TRA' (U + 2611) và thêm nó dưới dạng hình ảnh bằng php:

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

nhập mô tả hình ảnh ở đây

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


Gần như chắc chắn tốt hơn là dán nó vào Inkscape bằng công cụ văn bản (với phông chữ được chọn giấy phép phù hợp) và sau đó chạy tự động theo dõi, vì vậy bạn có thể lấy SVG ra khỏi nó mà sẽ mở rộng đến bất kỳ kích thước nào bạn cần. (Để làm cho nó càng nhỏ càng tốt, ghép một minifier SVG với một số chỉnh sửa bằng tay để giảm số lượng các nút trong đường dẫn nơi auto-trace goofed.)
ssokolow
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.