2015-09-24 24 views
7

Tôi đang cố gắng phân tích chuỗi đến để xác định xem chuỗi có chứa bất kỳ biểu tượng cảm xúc nào không.Phân tích cú pháp biểu tượng cảm xúc Node.js

Tôi đã trải qua this great article by Mathias và đang tận dụng cả hai số punycode gốc để mã hóa/giải mã và regenerate để tạo regex. Tôi cũng đang sử dụng EmojiData để nhận từ điển emojis của mình.

Với điều đó tất cả đã nói, một số biểu tượng cảm xúc nhất định tiếp tục là các trình phát ít phiền toái và từ chối không khớp. Đối với một số biểu tượng cảm xúc nhất định, tôi tiếp tục nhận được một cặp điểm mã.

// Example of a single code point: 
console.log(punycode.ucs2.decode('')); 
>> [ 128169 ] 

// Example of a paired code point: 
console.log(punycode.ucs2.decode('⌛️')); 
>> [ 8987, 65039 ] 

Mathias chạm về vấn đề này trong bài viết của ông (và đưa ra một ví dụ về punycode làm việc xung quanh này) nhưng thậm chí sử dụng ví dụ của mình tôi nhận được một câu trả lời đúng:

function countSymbols(string) { 
    return punycode.ucs2.decode(string).length; 
} 
console.log(countSymbols('')); 
>> 1 
console.log(countSymbols('⌛️')); 
>> 2 

là gì cách tốt nhất để phát hiện liệu một chuỗi có chứa tất cả các biểu tượng cảm xúc hay không? Đây là một bằng chứng về khái niệm để giải pháp có thể là sức mạnh vũ phu khi cần thiết.

--- CẬP NHẬT ---

Một chút ngữ cảnh nữa trên biểu tượng cảm xúc của tôi ở trên.

Đây là giống hệt nhau bằng mắt nhưng trên thực tế giá trị unicode khác nhau (điều thứ hai là từ ví dụ trên):

⌛ // \u231b 

⌛️ // \u231b\ufe0f 

Người đầu tiên hoạt động tuyệt vời, thứ hai thì không. Thật không may, phiên bản thứ hai là những gì iOS dường như sử dụng (nếu bạn sao chép và dán từ iMessage bạn nhận được thứ hai, và khi nhận được một văn bản từ Twilio, cùng một điều).

+0

Vì vậy, có thể thấy rằng dấu kết hợp (có thêm chút unicode trên ví dụ thứ hai) là những gì đang vấp ngã những thứ ở đây. Tôi đang tìm cách để loại bỏ tốt nhất các yếu tố này từ chuỗi của tôi. – thekevinscott

+0

Nếu bất kỳ ai từng gặp phải trường hợp sử dụng tương tự, tôi đã đóng gói tất cả thành một mô-đun npm: https://github.com/scottlabs/emojiExists – thekevinscott

Trả lời

3

U+FE0F không phải là dấu kết hợp, đó là chuỗi biến thể kiểm soát việc hiển thị hình tượng (xem this answer). Việc xóa các chuỗi như vậy có thể thay đổi diện mạo của ký tự, ví dụ: U+231B + U+FE0E (⌛︎).

Ngoài ra, chuỗi biểu tượng cảm xúc có thể được tạo từ nhiều điểm. Ví dụ, U+0032 (2) không phải là một biểu tượng cảm xúc của bản thân, nhưng U+0032 + U+20E3 (2⃣) hoặc U+0032 + U+20E3 + U+FE0F (2⃣️) là-nhưng U+0041 + U+20E3 (A⃣) thì không. Danh sách đầy đủ các chuỗi biểu tượng cảm xúc được duy trì trong tệp emoji-data.txt của Hiệp hội Unicode (thư viện emoji-data-js dường như có thông tin này).

Để kiểm tra xem chuỗi có chứa ký tự biểu tượng cảm xúc hay không, bạn sẽ cần kiểm tra xem có bất kỳ ký tự đơn nào trong emoji-data.txt hay bắt đầu chuỗi con cho chuỗi trong chuỗi đó hay không.

+0

Cảm ơn sự giúp đỡ của bạn. Bây giờ tôi đang tìm kiếm các cặp mã đầu tiên trước tiên, tiếp theo là các điểm mã riêng lẻ và nó hoạt động cho trường hợp sử dụng của tôi. – thekevinscott

0

Nếu, giả sử, bạn biết những ký tự không phải biểu tượng cảm xúc nào bạn muốn chạy vào, bạn có thể sử dụng một chút ma thuật lodash thông qua toArray hoặc các mô-đun tách, là biểu tượng cảm nhận.Ví dụ, nếu bạn muốn để xem nếu một chuỗi chứa các ký tự chữ và số, bạn có thể viết một hàm như sau:

function containsAlphaNumeric(string){ 
return _(string).toArray().filter(function(char){ 
    return char.match(/[a-zA-Z0-9]/); 
}).value().length > 0 ? true : false; 
} 
Các vấn đề liên quan