Đếm biểu tượng cảm xúc trong văn bản python

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);
0

let 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);
1

Vậ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);
3

let 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

UTF 8 có chứa Biểu tượng cảm xúc không?

Ký tự biểu tượng cảm xúc . 😄 là 128516. Emojis are also characters from the UTF-8 alphabet: 😄 is 128516.

Tổng cộng có bao nhiêu biểu tượng cảm xúc?

👉 Tổng cộng có 3.664 biểu tượng cảm xúc trong Tiêu chuẩn Unicode, kể từ tháng 9 năm 2021. Bản phát hành biểu tượng cảm xúc gần đây nhất là Emoji 15. 0, đã thêm 31 biểu tượng cảm xúc mới.

Regex có hoạt động với Biểu tượng cảm xúc không?

emoji-regex cung cấp một biểu thức chính quy để khớp với tất cả các ký hiệu và chuỗi biểu tượng cảm xúc (bao gồm cả biểu diễn văn bản của biểu tượng cảm xúc) theo Tiêu chuẩn Unicode . Nó dựa trên emoji-test-regex-pattern, tạo ra (tại thời điểm xây dựng) mẫu biểu thức chính quy dựa trên Tiêu chuẩn Unicode.

Có danh sách Biểu tượng cảm xúc không?

Nhưng đôi khi thật khó để tìm được biểu tượng cảm xúc phù hợp để sử dụng, vì vậy tôi quyết định chuẩn bị một bảng khổng lồ về chúng mà bạn có thể chỉ cần sao chép và dán vào bất kỳ trình chỉnh sửa nào. . Danh sách tất cả các biểu tượng cảm xúc