Hôm nay, tôi muốn nói về biểu tượng cảm xúc và cách kỳ lạ mà JavaScript [và các ngôn ngữ lập trình khác] xử lý chúng
Cụ thể, biểu tượng cảm xúc không bao giờ có thuộc tính length
của 1
, điều này khiến nhiều thứ trở nên khó khăn hơn mức bình thường. Điều này xuất hiện trong phiên hiện tại của hội thảo Vanilla JS Academy và một trong những sinh viên của tôi đã đưa ra một giải pháp đơn giản để đếm độ dài biểu tượng cảm xúc
Nào cùng đào vào bên trong
Cập nhật. Cách khắc phục được đề xuất trong bài viết này bị hỏng trong nhiều tình huống khác nhau. Tôi đã viết một bản cập nhật xem xét các phương pháp thay thế chính xác hơn
Vấn đề
Hãy nhìn vào biểu tượng cảm xúc kem ốc quế. ________số 8. Nếu bạn gọi thuộc tính length
trên đó, bạn sẽ nhận được giá trị là
let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
0let str = '🍦';
// returns 2
str.length;
Tại sao vậy?
Tôi không phải là người đầu tiên viết về điều này. Henri Sivonen cung cấp một trong những lời giải thích chi tiết và rõ ràng nhất mà tôi từng đọc về chủ đề này, sử dụng biểu tượng cảm xúc facepalm [
let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
1] làm ví dụChuỗi chứa một biểu tượng cảm xúc duy nhất bao gồm năm giá trị vô hướng Unicode
[nhấp qua bài viết cho biểu đồ đi kèm]
Chuỗi chứa một đơn vị đồ họa bao gồm 5 giá trị vô hướng Unicode. Đầu tiên, có một ký tự cơ bản có nghĩa là một người đang úp mặt. Theo mặc định, người đó sẽ có màu vàng hoạt hình
Ký tự tiếp theo là công cụ sửa đổi tông màu da của biểu tượng cảm xúc, thay đổi màu da của người đó [và trên thực tế, cả màu tóc của người đó]. Theo mặc định, giới tính của người đó không được xác định và e. g. Apple mặc định những gì họ coi là ngoại hình nam giới và e. g. Google mặc định những gì họ coi là ngoại hình nữ
Hai giá trị vô hướng tiếp theo chọn giao diện điển hình của nam giới cụ thể bất kể phông chữ và nhà cung cấp. Thay vì là một công cụ sửa đổi dành riêng cho biểu tượng cảm xúc như tông màu da, thông số giới tính sử dụng biểu tượng giới tính trước biểu tượng cảm xúc [DẤU HIỆU NAM] được liên kết rõ ràng bằng cách sử dụng ZERO WIDTH JOINER với người dùng tay để che mặt [có màu da săn chắc]. [Cho dù đó là ý tưởng tốt hay xấu khi các thông số kỹ thuật về màu da và giới tính sử dụng các cơ chế khác nhau nằm ngoài phạm vi của bài đăng này. ]
Cuối cùng, VARIATION SELECTOR-16 nói rõ rằng chúng tôi muốn hiển thị biểu tượng cảm xúc nhiều màu thay vì hiển thị dingbat đơn sắc
Các ngôn ngữ lập trình khác nhau xử lý các giá trị vô hướng để đếm khác nhau
Trong JavaScript, biểu tượng cảm xúc facepalm có length
trên
let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
3. Trong Python 3, đó là let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
0. Trong Rust, nó là let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
1Vậy… làm thế nào để bạn tính một biểu tượng cảm xúc là một ký tự?
Một giải pháp đơn giản để đếm biểu tượng cảm xúc dưới dạng các ký tự đơn lẻ
Tôi thấy rất nhiều cách tiếp cận sử dụng các mẫu biểu thức chính quy phức tạp để cố gắng tìm và cô lập biểu tượng cảm xúc trong chuỗi
Một trong những sinh viên của tôi trong hội thảo Học viện của tôi đã đưa ra một giải pháp đơn giản hơn. một vòng lặp
let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
2 và một biến let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
3let str = '🍦🎉';
let count = 0;
for [let char of str] {
count++;
}
// logs 2
console.log[count];
// logs 4
console.log[str.length];
Đây là một bản demo
Hơi khó chịu khi phải lặp và đếm thay vì chỉ sử dụng thuộc tính length
, nhưng cách tiếp cận này đơn giản, dễ đọc và hiệu quả. Đủ tôt cho tôi