Hướng dẫn can i use unicode in javascript? - tôi có thể sử dụng unicode trong javascript không?

Mặc dù @ruakh đã đưa ra một câu trả lời tốt, tôi sẽ thêm một số lựa chọn thay thế cho sự hoàn chỉnh:

Trên thực tế, bạn có thể sử dụng ngay cả

<script src="./app.js" charset="utf-8">
0 trong JavaScript, nhưng chỉ khi mã JavaScript của bạn là:

  • bên trong một thuộc tính sự kiện, như trong
    <script src="./app.js" charset="utf-8">
    
    1 hoặc
  • Trong phần tử
    <script src="./app.js" charset="utf-8">
    
    2 bên trong tài liệu XHTML (hoặc XHTML + XML) được phục vụ với loại nội dung XML.

Trong những trường hợp này, mã sẽ là đầu tiên (trước khi được chuyển cho trình thông dịch JavaScript) được phân tích cú pháp HTML để trình phân tích cú pháp HTML để các tham chiếu ký tự như

<script src="./app.js" charset="utf-8">
3 được công nhận. Các hạn chế làm cho đây là một cách tiếp cận không thực tế trong hầu hết các trường hợp.

Bạn cũng có thể nhập ký tự như vậy, như trong

<script src="./app.js" charset="utf-8">
4, nhưng sau đó mã hóa ký tự phải cho phép, mã hóa phải được khai báo đúng và bạn cần phần mềm cho phép bạn nhập các ký tự đó. Đây là một giải pháp sạch và khá khả thi nếu bạn sử dụng mã hóa UTF-8 cho mọi thứ và được chuẩn bị để giải quyết các vấn đề được tạo ra bởi nó. Mã nguồn sẽ có thể đọc được và đọc nó, bạn ngay lập tức thấy chính ký tự, thay vì các ký hiệu mã. Mặt khác, nó có thể gây ra bất ngờ nếu người khác bắt đầu làm việc với mã của bạn.

Sử dụng ký hiệu

<script src="./app.js" charset="utf-8">
5, như trong
<script src="./app.js" charset="utf-8">
6, hoạt động độc lập với mã hóa ký tự và trong thực tế gần như phổ biến. Tuy nhiên, nó có thể được sử dụng như vậy chỉ được sử dụng lên đến U+FFFF, tức là lên đến
<script src="./app.js" charset="utf-8">
7, nhưng hầu hết các nhân vật mà hầu hết mọi người từng nghe nói về khu vực đó. (Nếu bạn cần các ký tự cao hơn, bạn cần sử dụng các cặp thay thế hoặc một trong hai cách tiếp cận ở trên.)

Bạn cũng có thể xây dựng một ký tự bằng phương pháp

<script src="./app.js" charset="utf-8">
8, chuyển dưới dạng tham số số unicode, theo số thập phân như trong
<script src="./app.js" charset="utf-8">
9 hoặc trong thập lục phân như trong
...
<head>
  <meta charset="utf-8" />
head>
...
0. Điều này hoạt động đến U+FFFF. Cách tiếp cận này có thể được sử dụng ngay cả khi bạn có số Unicode trong một biến.

  • Hỗ trợ Unicode duy nhất trong các regexes JavaScript là khớp các điểm mã cụ thể với \ uffff. Bạn có thể sử dụng chúng trong phạm vi trong các lớp ký tự.
  • Mã hóa unicode của các tệp nguồn
  • Cách JavaScript sử dụng Unicode bên trong
  • Bình thường hóa
  • Biểu tượng cảm xúc
  • Nhận độ dài thích hợp của một chuỗi
  • Điểm es6 unicode point thoát ra
  • Mã hóa ASCII chars

Hỗ trợ Unicode duy nhất trong các regexes JavaScript là khớp các điểm mã cụ thể với \ uffff. Bạn có thể sử dụng chúng trong phạm vi trong các lớp ký tự.

Mã hóa unicode của các tệp nguồn

Làm thế nào để bạn chỉ định một mã hóa khác, đặc biệt là UTF-8, mã hóa tệp phổ biến nhất trên web?

Nếu tệp chứa một ký tự BOM, điều đó có mức độ ưu tiên trong việc xác định mã hóa. Bạn có thể đọc nhiều ý kiến ​​khác nhau trực tuyến, một số người nói rằng một BOM trong UTF-8 không được khuyến khích, và một số biên tập viên đã giành được thậm chí thêm nó.

Đây là những gì tiêu chuẩn Unicode nói:

Việc sử dụng BOM là không bắt buộc cũng như không được khuyến nghị cho UTF-8, nhưng có thể gặp phải trong các bối cảnh trong đó dữ liệu UTF-8 được chuyển đổi từ các dạng mã hóa khác sử dụng BOM hoặc nơi BOM được sử dụng làm chữ ký UTF-8.

Đây là những gì W3C nói:

Trong các trình duyệt HTML5 được yêu cầu nhận ra BOM UTF-8 và sử dụng nó để phát hiện mã hóa trang và các phiên bản gần đây của các trình duyệt chính xử lý BOM như mong đợi khi được sử dụng cho các trang được mã hóa UTF-8. -https://www.w3.org/i quốc/câu hỏi /qa-byte-order-mark

Nếu tệp được tìm nạp bằng HTTP (hoặc HTTPS), tiêu đề loại nội dung có thể chỉ định mã hóa:Content-Type header can specify the encoding:

Content-Type: application/javascript; charset=utf-8

Nếu điều này không được đặt, dự phòng là để kiểm tra thuộc tính

...
<head>
  <meta charset="utf-8" />
head>
...
1 của thẻ
<script src="./app.js" charset="utf-8">
2:

<script src="./app.js" charset="utf-8">

Nếu điều này chưa được đặt, thẻ meta ký tự tài liệu được sử dụng:

...
<head>
  <meta charset="utf-8" />
head>
...

Thuộc tính Charset trong cả hai trường hợp là trường hợp không nhạy cảm (xem thông số kỹ thuật)

Tất cả điều này được định nghĩa trong các loại phương tiện truyền thông kịch bản RFC 4329.

Các thư viện công cộng thường nên tránh sử dụng các ký tự bên ngoài ASCII được đặt trong mã của họ, để tránh nó được tải bởi người dùng có mã hóa khác với bản gốc của chúng và do đó tạo ra các vấn đề.

Cách JavaScript sử dụng Unicode bên trong

Mặc dù tệp nguồn JavaScript có thể có bất kỳ loại mã hóa nào, JavaScript sau đó sẽ chuyển đổi nó trong nội bộ thành UTF-16 trước khi thực hiện nó.

Các chuỗi JavaScript đều là các chuỗi UTF-16, như tiêu chuẩn Ecmascript nói:

Khi một chuỗi chứa dữ liệu văn bản thực tế, mỗi phần tử được coi là một đơn vị mã UTF-16 duy nhất.

Sử dụng unicode trong một chuỗi

Một chuỗi Unicode có thể được thêm vào bên trong bất kỳ chuỗi nào bằng định dạng

...
<head>
  <meta charset="utf-8" />
head>
...
3:

Một chuỗi có thể được tạo bằng cách kết hợp hai chuỗi Unicode:

const s2 = '\u0065\u0301' //é

Lưu ý rằng trong khi cả hai đều tạo ra một E có dấu, chúng là hai chuỗi khác nhau và S2 được coi là dài 2 ký tự:

s1.length //1
s2.length //2

Và khi bạn cố gắng chọn ký tự đó trong trình soạn thảo văn bản, bạn cần phải trải qua nó 2 lần, vì lần đầu tiên bạn nhấn phím mũi tên để chọn nó, nó chỉ chọn một nửa phần tử.

Bạn có thể viết một chuỗi kết hợp một ký tự unicode với một char đơn giản, vì nội bộ, nó thực sự giống nhau:

const s3 = 'e\u0301' //é
s3.length === 2 //true
s2 === s3 //true
s1 !== s3 //true

Bình thường hóa

Chuẩn hóa Unicode là quá trình loại bỏ sự mơ hồ trong cách thể hiện một ký tự, để hỗ trợ so sánh các chuỗi chẳng hạn.

Giống như trong ví dụ trên:

const s1 = '\u00E9' //é
const s3 = 'e\u0301' //é
s1 !== s3

ES6/ES2015 đã giới thiệu phương thức bình thường hóa () trên nguyên mẫu chuỗi, vì vậy chúng ta có thể làm:

s1.normalize() === s3.normalize() //true

Biểu tượng cảm xúc

Biểu tượng cảm xúc rất thú vị và chúng là các ký tự Unicode, và như vậy chúng hoàn toàn có giá trị để được sử dụng trong các chuỗi:

Biểu tượng cảm xúc là một phần của các mặt phẳng Astral, bên ngoài mặt phẳng đa ngôn ngữ cơ bản đầu tiên (BMP) và vì những điểm bên ngoài BMP không thể được biểu thị bằng 16 bit, JavaScript cần sử dụng kết hợp 2 ký tự để thể hiện chúng

Biểu tượng 🐶, là

...
<head>
  <meta charset="utf-8" />
head>
...
4, theo truyền thống được mã hóa là
...
<head>
  <meta charset="utf-8" />
head>
...
5 (được gọi là cặp thay thế). Có một công thức để tính toán điều này, nhưng nó là một chủ đề khá tiên tiến.

Một số biểu tượng cảm xúc cũng được tạo ra bằng cách kết hợp các biểu tượng cảm xúc khác. Bạn có thể tìm thấy những người đó bằng cách xem danh sách này https://unicode.org/emoji/charts/full-emoji-list.html và chú ý những cái có nhiều hơn một mục trong cột Biểu tượng Unicode.

👩‍❤ được tạo ra kết hợp 👩 (

...
<head>
  <meta charset="utf-8" />
head>
...
6), ❤ (
...
<head>
  <meta charset="utf-8" />
head>
...
7) và một 👩 (
...
<head>
  <meta charset="utf-8" />
head>
...
6) khác trong một chuỗi duy nhất:
...
<head>
  <meta charset="utf-8" />
head>
...
9

Không có cách nào để làm cho biểu tượng cảm xúc này được tính là 1 ký tự.

Nhận độ dài thích hợp của một chuỗi

Nếu bạn cố gắng thực hiện

Bạn sẽ nhận được 8 lần trở lại, vì độ dài tính các điểm mã Unicode duy nhất.

Ngoài ra, lặp đi lặp lại nó là một loại buồn cười:

Hướng dẫn can i use unicode in javascript? - tôi có thể sử dụng unicode trong javascript không?

Và thật kỳ lạ, dán biểu tượng cảm xúc này vào trường mật khẩu mà nó đã đếm được 8 lần, có thể làm cho nó trở thành một mật khẩu hợp lệ trong một số hệ thống.

Làm thế nào để có được độ dài thực tế của một chuỗi có chứa các ký tự unicode?

Một cách dễ dàng trong ES6+ là sử dụng toán tử lây lan:spread operator:

Bạn cũng có thể sử dụng thư viện Punycode của Mathias Bynens:

require('punycode').ucs2.decode('🐶').length //1

(Punycode cũng rất tuyệt khi chuyển đổi Unicode thành ASCII)

Lưu ý rằng các biểu tượng cảm xúc được xây dựng bằng cách kết hợp các biểu tượng cảm xúc khác vẫn sẽ đưa ra số lượng xấu:

require('punycode').ucs2.decode('👩‍❤️‍👩').length //6
[...'👩‍❤️‍👩'].length //6

Tuy nhiên, nếu chuỗi đã kết hợp các nhãn hiệu, điều này vẫn sẽ không cho đúng số lượng. Kiểm tra trục trặc này https://glitch.com/edit/#!combining marks however, this still will not give the right count. Check this Glitch https://glitch.com/edit/#!/node-unicode-ignore-marks-in-length as an example.

.

Chiều dài không phải là điều duy nhất để chú ý. Cũng đảo ngược một chuỗi là lỗi dễ bị xử lý chính xác.

Điểm es6 unicode point thoát ra

ES6/ES2015 đã giới thiệu một cách để biểu diễn các điểm Unicode trong các mặt phẳng Astral (bất kỳ điểm mã Unicode nào cũng yêu cầu hơn 4 ký tự), bằng cách gói mã trong ngoặc đơn đồ thị:

Biểu tượng con chó, là

...
<head>
  <meta charset="utf-8" />
head>
...
4, có thể được biểu diễn dưới dạng
const s2 = '\u0065\u0301' //é
1 thay vì phải kết hợp hai điểm mã Unicode không liên quan, như chúng tôi đã trình bày trước đây:
...
<head>
  <meta charset="utf-8" />
head>
...
5.

Nhưng tính toán

const s2 = '\u0065\u0301' //é
3 vẫn không hoạt động chính xác, bởi vì bên trong, nó đã chuyển đổi thành cặp thay thế được hiển thị ở trên.

Mã hóa ASCII chars

128 ký tự đầu tiên có thể được mã hóa bằng cách sử dụng ký tự Escaping đặc biệt

const s2 = '\u0065\u0301' //é
4, chỉ chấp nhận 2 ký tự:

Điều này sẽ chỉ hoạt động từ

const s2 = '\u0065\u0301' //é
5 đến
const s2 = '\u0065\u0301' //é
6, đây là tập hợp các ký tự ASCII.

Unicode trong JavaScript là gì?

Unicode là một bộ ký tự phổ quát xác định danh sách các ký tự từ phần lớn các hệ thống viết và các cộng sự cho mỗi ký tự là một số duy nhất (điểm mã).a universal character set that defines the list of characters from the majority of the writing systems, and associates for every character a unique number (code point).

JavaScript có sử dụng UTF không

UTF-16 được sử dụng bởi các hệ thống như API Microsoft Windows (mặc dù cũng hỗ trợ UTF-8), ngôn ngữ lập trình Java và JavaScript/Ecmascript.Nó cũng đôi khi được sử dụng cho các tệp dữ liệu xử lý văn bản và xử lý văn bản trên Microsoft Windows.Nó hiếm khi được sử dụng cho các tệp trên các hệ thống giống như Unix. is used by systems such as the Microsoft Windows API (which also supports UTF-8 though), the Java programming language and JavaScript/ECMAScript. It is also sometimes used for plain text and word-processing data files on Microsoft Windows. It is rarely used for files on Unix-like systems.

JavaScript có sử dụng UTF không

UTF-16 được sử dụng bởi các hệ thống như API Microsoft Windows (mặc dù cũng hỗ trợ UTF-8), ngôn ngữ lập trình Java và JavaScript/Ecmascript.Nó cũng đôi khi được sử dụng cho các tệp dữ liệu xử lý văn bản và xử lý văn bản trên Microsoft Windows.Nó hiếm khi được sử dụng cho các tệp trên các hệ thống giống như Unix.

JavaScript có hỗ trợ Unicode Regex không?

Hỗ trợ Unicode duy nhất trong các regexes JavaScript là khớp các điểm mã cụ thể với \ uffff.Bạn có thể sử dụng chúng trong phạm vi trong các lớp ký tự.. You can use those in ranges in character classes.