2015-01-19 25 views
5

Tôi đã nhập văn bản từ thiết bị di động. Nó chứa biểu tượng cảm xúc. Trong C#, tôi có văn bản nhưLàm cách nào để xóa ký tự biểu tượng cảm xúc khỏi chuỗi?

Text text 

một cách đơn giản, tôi muốn các văn bản đầu ra được

Text text 

Tôi đang cố gắng để chỉ loại bỏ tất cả các biểu tượng cảm xúc như vậy từ các văn bản với rejex .. ngoại trừ, tôi không chắc chắn làm thế nào để chuyển đổi biểu tượng cảm xúc đó vào chuỗi unicode của nó .. Làm cách nào để làm điều đó?

chỉnh sửa:

Tôi đang cố lưu đầu vào của người dùng vào mysql. Dường như mysql UTF8 không thực sự hỗ trợ các ký tự unicode và right way to do it would be by changing the schema nhưng tôi không nghĩ rằng đó là một lựa chọn cho tôi. Vì vậy, tôi đang cố gắng để loại bỏ tất cả các ký tự biểu tượng cảm xúc trước khi lưu nó trong cơ sở dữ liệu.

Đây là sơ đồ của tôi cho các cột có liên quan:

enter image description here

Tôi đang sử dụng Nhibernate như ORM của tôi và truy vấn chèn tạo ra vẻ như thế này:

Insert into `Content` (ContentTypeId, Comments, DateCreated) 
values (?p0, ?p1, ?p2); 
?p0 = 4 [Type: Int32 (0)]. ?p1 = 'Text text' [Type: String (20)], ?p2 = 19/01/2015 10:38:23 [Type: DateTime (0)] 

Khi tôi sao chép này truy vấn từ nhật ký và chạy trực tiếp trên mysql, tôi nhận được lỗi này:

1 warning(s): 1366 Incorrect string value: '\xF0\x9F\x98\x80 t...' for column 'Comments' at row 1 0.000 sec 

Ngoài ra, tôi đã cố gắng để chuyển đổi nó sang byte mã hóa và nó không thực sự làm việc ..

enter image description here

+0

Nó không thực sự rõ ràng những gì bạn đang cố gắng đạt được - bạn sẽ làm gì với giá trị chuỗi sau khi thay thế các ký tự? –

+0

@JonSkeet đã chỉnh sửa bài đăng, cảm ơn. – LocustHorde

+0

UTF-8 thực sự * nên * ở đây tốt. Bạn có thể đăng chi tiết về cách bạn hiện đang cố gắng lưu dữ liệu, cùng với thông tin lược đồ của bạn không? –

Trả lời

23

Giả sử bạn chỉ muốn loại bỏ tất cả các ký tự không BMP, tức là bất cứ điều gì với một Điểm mã Unicode của U + 10000 trở lên, bạn có thể sử dụng regex để xóa mọi đơn vị mã UTF-16 thay thế khỏi chuỗi. Ví dụ:

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     string text = "x\U0001F310y"; 
     Console.WriteLine(text.Length); // 4 
     string result = Regex.Replace(text, @"\p{Cs}", ""); 
     Console.WriteLine(result); // 2 
    } 
} 

Ở đây "Cs" là danh mục Unicode cho "thay thế".

Có vẻ như Regex hoạt động dựa trên đơn vị mã UTF-16 thay vì mã Unicode, nếu không bạn sẽ cần một cách tiếp cận khác.

Lưu ý rằng có các ký tự không phải BMP khác với biểu tượng cảm xúc, nhưng tôi nghi ngờ bạn sẽ thấy chúng sẽ có cùng một vấn đề khi bạn cố lưu trữ chúng.

+0

Xin chào, tôi đã đặt câu hỏi để mô tả những gì tôi nghĩ là vấn đề của tôi .. nhưng tôi đã thử câu trả lời của bạn và hóa ra tôi không thực sự cần chuyển đổi chúng. Vì vậy, tôi đã chỉnh sửa câu hỏi ngay bây giờ! http://i.imgur.com/NoQfxud.png Cảm ơn bạn! – LocustHorde

+0

@LocustHorde: Miễn là bạn biết rằng bạn chỉ đang vứt bỏ các bit đầu vào của người dùng ... –

+0

Yea! đây là một giải pháp tạm thời (hy vọng ngắn hạn!) – LocustHorde

Các vấn đề liên quan