2011-08-19 27 views
25

. Dgggggeeeeegggggeeeeegggggeeeeegggggeeeeegggggeeeeegggggeeeeegggggeeeeeggggg д DeeeeegggggeeeegggggeeeeegggggeeeeegggggeeeeegggggTại sao những nhân vật Thái hiển thị trên trang web với một cái đuôi dài?

Tôi tìm thấy một số nhân vật thú vị cũng giống như tôi dán trên mà chỉ mất 3 không gian rộng. Tuy nhiên độ dài thực tế của chuỗi là 380.

Tôi kiểm tra các chuỗi trong python, và chuỗi mã hóa là như sau :.

'\ xe0 \ xb8 \ x94 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \. xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \. xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \. x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe. 0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \. xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \. x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \. xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \. xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \. x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xd0 \ xb4 \ xe0 \ xb8 \ x94 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \. xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \. x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \. xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \. xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \. x8 9 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \. xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 \ xe0 \ xb9 \ x89 '

dường như chuỗi là sự kết hợp của ba nhân vật Thái:

.
ด \xe0\xb8\x94 THAI CHARACTER DO DEK 

้ \xe0\xb9\x89 THAI CHARACTER MAI THO 

็ \xe0\xb9\x87 THAI CHARACTER MAITAIKHU 

Và câu hỏi của tôi là:

  1. tại sao những hành vi nhân vật rất khác nhau, nó là một lỗi
  2. làm thế nào tôi có thể tránh nó trong ngồi?. e (có lẽ với một số bộ lọc html)?

CẬP NHẬT

Tôi đã thử nghiệm các nhân vật với các trình duyệt khác, và đuôi dài chỉ xuất hiện trong chrome và firefox trên nền tảng Windows.

Sau đây là ảnh chụp màn hình tôi đã thực hiện:

win 7 ie8 win 7 ie8


ubuntu firefox ubuntu firefox


win 7 chrome win 7 chrome


win 7 firefox win 7 firefox


Vì vậy, tôi đoán nó là một lỗi trình duyệt có liên quan.

+3

LOL, ở các ký tự ở trên: P –

+2

Tuyệt vời, tôi muốn biết lý do tại sao chúng cũng hiển thị như vậy. –

+0

Lập trình liên quan đến cách chính xác? – paxdiablo

Trả lời

4

Các mã bạn đề cập là tất cả trong UTF-8, đó là lý do tại sao mỗi ký tự cần 3 byte. Các respectice Unicode codes là:

Sau hai là trong hạng mục Mark, Nonspacing, và có Combine tài sản (Canonical_Combining_Class) được đặt thành 107, có nghĩa là các điểm mã được kết hợp với điểm mã trước trong hiển thị.

Ví dụ: bạn bắt đầu bằng một ký tự đơn và thêm nhiều dấu không nưa trên đầu trang của nó.

Hãy so sánh với mã này # C:

char DODEK = (char)0x0e14; 
char MAITHO = (char)0x0e49; 
char MAITAIKHU = (char)0x0e47; 

string thai = new string(new char[] { DODEK, MAITHO, MAITAIKHU }); 
Console.WriteLine("number of code points: " + thai.Length); 

var si = new System.Globalization.StringInfo(thai); 
Console.WriteLine("number of text elements: " + si.LengthInTextElements); 

Output:

number of code points: 3 
number of text elements: 1 

Xem thêm .Net StringInfo class.

8

Có hai vấn đề, một trong hệ thống đầu ra (trình kết xuất phông chữ) không phải là tiếng Thái và một trong hệ thống đầu vào đã tạo văn bản này ngay từ đầu.

Nếu bạn đã làm bài tập ở nhà, bạn sẽ biết rằng mai tho và maitaikhu (tên UniCode) là những gì UniCode gọi là dấu cách không gian (NSM). Điều này có nghĩa là trình kết xuất phông chữ không được di chuyển đến ô ký tự tiếp theo khi hiển thị hình tượng này.

Để tránh sự lộn xộn mà bạn thấy ở trên, Hiệp hội API Thái (TAPIC) đã đưa ra tiêu chuẩn WTT 2.0 mô tả cả cách thuật toán hiển thị phông chữ xử lý thứ tự chữ Thái khi nó nhận nó như đầu vào và cách nhập phương pháp nên cho phép các ký tự đó được nhập nếu bạn cố gắng nhập chúng.

Standardization and Implementations of Thai Language Overview

libthai bao gồm cả hai phương pháp đầu vào và đầu ra.

thaicheck là một chương trình nhỏ có thể phát hiện các vấn đề về chuỗi thư và khắc phục chúng.

Nhân tiện, bạn không thể có một chuỗi (từ) của do dek, mai tho và maitaikhu; chuỗi đầu vào là tiếng ồn.

Lưu ý rằng một số trình chỉnh sửa đã phá vỡ phương thức nhập cho phép nhập nhiều NSM không thể kết hợp nhưng phương thức đầu ra sẽ chỉ hiển thị các chuỗi hợp pháp; kết quả là chuỗi đầu vào bất hợp pháp có vẻ OK đối với người dùng trên hệ thống của anh ấy.

+13

nếu tất cả mọi người "đã làm bài tập ở nhà", chúng tôi sẽ không cần stackoverflow – devio

+0

Tôi nghĩ rằng nó được coi là lịch sự để cố gắng tìm câu trả lời cho vấn đề của bạn trước khi đăng nó ở đây. – koan

+4

Tôi đã làm một số bài tập về nhà, nhưng tôi là một người mới đến các nhân vật Thái do đó tôi không thể chỉ ra làm thế nào để google nó. Và đó là lý do tại sao tôi nghĩ SO là tuyệt vời. –

2

Bạn không bao giờ phải kết hợp hàng trăm ký tự unicode thành một ký tự đồ họa duy nhất, mặc dù định dạng unicode về mặt kỹ thuật cho phép nó; bạn thường kết hợp không quá 2 hoặc 3 ký tự.

Trong tiếng Thái, bạn có các nguyên âm và dấu âm, được hiển thị phía trên ký tự kết nối (đôi khi nguyên âm xuất hiện bên dưới hoặc thậm chí xung quanh các ký tự kết nối ...). Nó giống như dấu trọng âm trên các nguyên âm tiếng Pháp (& eacute ;, & egrave; ...) hoặc umlauts bằng tiếng Đức. Nó không phải là bình thường khi có nhiều hơn hai dấu hiệu như vậy trong tiếng Thái (và nhiều hơn một trong tiếng Pháp hoặc tiếng Đức). Nó có nghĩa là đầu vào của bạn là văn bản Thái Lan bất hợp pháp (có thể được viết để cung cấp một số hiệu ứng đồ họa vui nhộn, như "nghệ thuật ASCII"). Tôi không ngạc nhiên khi văn bản bất hợp pháp như vậy được diễn giải khác nhau tùy theo trình duyệt.

1

Những gì bạn đã tìm thấy được gọi là Combining Characters hoặc theo dân gian thông thường, nó gọi là Zalgo.

Nó hoạt động vì Unicode cho phép kết hợp các ký tự bằng cách thêm diacritic marks after character.

Mọi hệ thống sử dụng Unicode sẽ hoạt động với các ký tự này.

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