2010-08-04 36 views
7

Có ai đó biết một cách dễ dàng để tìm các ký tự trong Unicode giống với ký tự ASCII hay không. Ví dụ là "CYRILLIC SMALL LETTER DZE (ѕ)". Tôi muốn thực hiện tìm kiếm và thay thế cho các ký tự tương tự. Cũng giống như tôi có nghĩa là con người có thể đọc được. Bạn không thể thấy sự khác biệt bằng cách nhìn vào nó.Tìm ký tự ASCII tương tự trong Unicode

Trả lời

11

Như đã được ghi chú bởi những người bình luận khác, Unicode normalisation ("nhân vật tương thích") sẽ không giúp bạn ở đây vì bạn không tìm kiếm sự tương đương chính thức nhưng đối với điểm tương đồng trong glyphs (hình dạng chữ cái). (Báo cáo kỹ thuật Unicode được liên kết vẫn đáng đọc, vì nó được viết rất tốt.)

Nếu tôi là bạn, hãy dành cho bạn công việc tẻ nhạt khi tự lắp ráp danh sách các ký tự, tôi sẽ tìm kiếm tài nguyên trên homograph attacks: Đây là phương pháp của người dùng web gây hiểu nhầm gây hại bằng cách hiển thị các URL chứa tên miền trong đó một số chữ cái đã được thay thế bằng các chữ cái giống nhau. Một Unicode Technical Report, về bảo mật, có chứa một phần về vấn đề này. Cũng có - và đó có thể là thứ bạn cần nhất - "confusables" table. Dưới đây là một bài viết khác với các dấu chấm câu chủ yếu, một số trong đó có ASCII, có các đối tác tương tự trực quan trong số non-ASCII code tables.

Điều tôi hy vọng là bạn không đặt câu hỏi để xây dựng cuộc tấn công như vậy.

+0

Cảm ơn tất cả các liên kết và giải thích tốt. Tôi thực sự cố gắng để bảo vệ chống lại các cuộc tấn công như vậy. :-) Và tôi đoán tôi sẽ tìm thấy một số công cụ hơn nữa với từ khóa "homograph attack". – DrDol

+0

Điều đó là tốt để nghe :). Vâng, đó là từ khóa bạn cần! Tôi đã chỉnh sửa một liên kết (nó chỉ ra một phiên bản lỗi thời). – chryss

+0

Sử dụng hợp pháp: để thử nghiệm quốc tế hóa, tôi có một công cụ tạo văn bản bằng tiếng nước ngoài giả mạo bằng các ký tự trông giống nhau. Một người kiểm tra nói tiếng Anh có thể đọc văn bản "nước ngoài", nhưng họ cũng có thể nói rõ ràng rằng nó không phải là tiếng Anh được mã hóa cứng. Mặc dù nó không hoạt động nếu các ký tự unicode là như vậy tương tự mà bạn không thể nói sự khác biệt. Tôi chủ yếu làm những việc như thêm dấu trọng âm vào nguyên âm. – Kip

-1

Xem Cơ sở dữ liệu Unicode: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Mỗi dòng mô tả một caharacter unicode, ví dụ:

1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; 

Nếu có bất kỳ (tương thích) nhân vật tương tự cho biểu tượng đó, nó sẽ xuất hiện trong <compat> lĩnh vực nhập cảnh. Trong ví dụ này, 0061 (ASCII a) tương thích với ký tự Unicode LATIN SMALL LETTER A WITH RIGHT HALF RING.

Đối với nhân vật của bạn, sự xâm nhập là

0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 

đó, như bạn có thể thấy, không chỉ định một nhân vật tương thích.

+0

Trường tương thích mô tả chuỗi ký tự có cùng nghĩa với ký tự được đề cập. Trong ví dụ của bạn, trình tự tương thích sẽ là 'U + 0061' (chữ 'a') theo sau là' U + 02BE' (công cụ sửa đổi 'nửa vòng bên phải'). Đối với các ký tự từ các bảng chữ cái khác nhau, nó sẽ là khá bất thường khi có chuỗi tương thích - và điều đó làm cho những gì OP đang cố gắng làm không thể mà không cần thêm thông tin. – cHao

+0

OP nói 'tương tự như ký tự ASCII', không chính xác. Nếu bạn đang tìm kiếm 'a' bằng nửa vòng bên phải, bạn có thể giải quyết một mã ASCII 'a' nếu không có gì khác. – adamk

+0

Đồng ý - trong trường hợp đó. Nhưng nếu bạn đang tìm kiếm một ASCII char tương tự như một Cyrillic & # x0455 ;, đó là ví dụ OP được sử dụng, điều đó sẽ không hoạt động. – cHao

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