2011-08-19 2 views
25

. Dgggggeeeeegggggeeeeegggggeeeeegggggeeeeegggggeeeeegggggeeeeegggggeeeeeggggg д Deeeeegggggeeeegggggeeeeegggggeeeeegggggeeeeeggggg 는 긴 꼬리와 웹 페이지에 표시?

는 내가있는 이상은 3 공간 폭 소요 붙여 넣은 것처럼 몇 가지 흥미로운 문자를 발견했다. 그러나 문자열의 실제 길이가 내가 파이썬에서 문자열을 검사하고, 문자열 인코딩은 다음과 같습니다 (380)

입니다 :.

'\ 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 '

그것은 문자열이 세 가지 타이어 문자의 조합 것 같다 :

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

้ \xe0\xb9\x89 THAI CHARACTER MAI THO 

็ \xe0\xb9\x87 THAI CHARACTER MAITAIKHU 

그리고 제 질문은 다음과 같습니다

  1. 은 왜 다르게 이러한 문자의 동작을, 그것은 버그
  2. 내가 앉아 그것을 피할 수있는 방법?. (아마 일부 HTML 필터) 전자?

UPDATE는

나는 더 많은 브라우저와 문자를 테스트했습니다, 그리고 긴 꼬리는 Windows 플랫폼에서 크롬과 파이어 폭스에 나타납니다.다음

내가 찍은 스크린 샷입니다 : ubuntu firefox


승리 win 7 ie8


우분투 파이어 폭스

승 7 IE8 7 크롬 win 7 chrome

따라서 7 파이어 폭스 win 7 firefox


승리, 나는 그것이 브라우저 관련 버그 같아요.

+3

위의 문자에서 LOL : P –

+2

훌륭하게, 나는 왜 그렇게 똑같이 표시하는지 알고 싶습니다. –

+0

프로그래밍 관련 방법은 정확히 어떻게됩니까? – paxdiablo

답변

4

언급 한 코드는 모두 UTF-8로되어 있기 때문에 각 문자는 3 바이트가 필요합니다. respectice Unicode codes은 :

후자의 두 카테고리 Mark, Nonspacing에 있으며합니다 (Combine 특성을 갖는다 Canonical_Combining_Class)는 107로 설정됩니다. 즉, 코드 포인트는 렌더링시 이전 코드 포인트와 결합됩니다.

이 예제는 단일 문자로 시작하고 맨 위에 공백이없는 많은 표시를 추가합니다.

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

출력 :

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

.Net StringInfo class 참조하십시오.

8

태국어를 인식하지 못하는 출력 시스템 (글꼴 렌더러)과 첫 번째로이 텍스트를 생성 한 입력 시스템에 문제가 있습니다.

숙제를했다면, mai tho와 maitaikhu (UniCode 이름)는 UniCode가 Non Spacing Markers (NSM)라고 부르는 것을 알고있을 것입니다. 즉,이 글리프를 표시 할 때 글꼴 렌더러가 다음 문자 셀로 이동하면 안됩니다.

위에서 보았던 엉망을 피하기 위해 TAPIC (Thai API Consortium)은 WTT 2.0 표준을 만들었습니다.이 표준은 글꼴 렌더링 알고리즘이 태국어 문자 순서를 입력으로 처리하는 방법과 입력 메서드는 이러한 문자를 입력하려고하면 이러한 문자를 입력 할 수 있어야합니다.

Standardization and Implementations of Thai Language Overview

libthai는 입력 및 출력 방법을 포함한다.

thaicheck은 문자 순서 문제를 감지하고 해결할 수있는 작은 프로그램입니다.

그런데 do dek, mai tho 및 maitaikhu의 순서 (단어)를 가질 수는 없습니다. 입력 순서는 노이즈입니다.

일부 편집자는 결합 할 수없는 여러 NSM을 입력 할 수있는 입력 방법이 잘못되었지만 출력 방법은 합법적 인 순서 만 렌더링한다는 점에 유의하십시오. 결과는 사용자의 시스템에으로 보이는 잘못된 입력 문자열입니다.

+13

모두가 "숙제를했다"면 stackoverflow가 필요하지 않습니다. – devio

+0

여기에 게시하기 전에 문제에 대한 답을 찾기 위해 정중하게 생각했다고 생각했습니다. – koan

+4

나는 약간의 숙제를했지만 태국인 캐릭터에게는 초보자이므로 어떻게해야 하는지를 지적 할 수 없었다. 그리고 그것이 내가 SO가 굉장하다고 생각하는 이유입니다. –

2

기술적으로 허용되는 유니 코드 형식이지만 수백 개의 유니 코드 문자를 하나의 그래픽 문자로 결합해서는 안됩니다. 일반적으로 2 ~ 3자를 넘지 않습니다.

태국어에는 자음 문자 위에 표시되는 모음 및 음표가 있습니다 (때로 모음이 아래에 표시되거나 자음 문자 주위에 표시되기도합니다 ...). 프랑스어 (& eacute; egrave; ...) 나 움라우트 (독일어)의 모음보다 약간 액센트가 있습니다. 태국어 (프랑스어 또는 독일어로 2 개 이상)에 2 개 이상의 징후가있는 것은 정상적인 현상이 아닙니다. 그것은 당신의 입력이 불법적 인 태국어 텍스트 (아마도 "ASCII art"와 같은 재미있는 그래픽 효과를 제공하기 위해 쓰여졌을 수도 있음)를 의미합니다. 불법적 인 텍스트가 브라우저에 따라 다르게 해석된다는 것은 놀랄 일이 아닙니다.

1

당신이 발견 한 것을 Combining Characters 또는 일반 민속이라고 부릅니다. Zalgo입니다.

유니 코드가 diacritic marks after character을 추가하여 문자를 결합 할 수 있기 때문에 작동합니다.

Unicode을 사용하는 모든 시스템에서 이러한 문자를 사용할 수 있습니다.