Почему эти тайские символы отображаются на веб-странице с длинным хвостом? - PullRequest
27 голосов
/ 19 августа 2011

ด้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้ д ด็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้็็็็็้้้้้

Я нашел несколько интересных символов, как я вставил выше, которые занимают всего 3 пробела шириной.Однако фактическая длина строки составляет 380.

Я проверил строку в python, и кодирование строки выглядит следующим образом:

'\ 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 \ 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 \ xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \xe0 \ xb9 \ x87 \ xe0 \ xb9 \ x87 \ xe0 \ хъ9 \ 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 \ 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\xb8\x94  THAI CHARACTER DO DEK

้  \xe0\xb9\x89  THAI CHARACTER MAI THO

็  \xe0\xb9\x87  THAI CHARACTER MAITAIKHU

И мои вопросы:

  1. Почему эти символы ведут себя по-разному, это ошибка?
  2. как я могу избежать этого на сайте (возможно, с помощью некоторого html-фильтра)?

ОБНОВЛЕНИЕ

Я проверил символыс большим количеством браузеров, и длинный хвост появляется только в Chrome и Firefox на платформе Windows.

Ниже приведен снимок экрана, который я сделал:

win 7 ie8 win 7 ie8


Ubuntu Firefox ubuntu firefox


выиграть 7 хром win 7 chrome


выиграть 7 Firefox win 7 firefox


Следовательно,Я думаю, это ошибка, связанная с браузером.

Ответы [ 4 ]

8 голосов
/ 19 августа 2011

Есть две проблемы: одна в системе вывода (средство визуализации шрифтов), которая не знает тайский язык, и одна в системе ввода, которая сгенерировала этот текст.

Если бы вы выполнили домашнее задание, вы бы знали, что mai tho и maitaikhu (имена UniCode) - это то, что UniCode называет непространственными маркерами (NSM). Это означает, что средство отображения шрифта не должно перемещаться к следующей символьной ячейке при отображении этого символа.

Чтобы избежать беспорядка, который вы видите выше, Консорциум Thai API (TAPIC) разработал стандарт WTT 2.0, который описывает как алгоритм рендеринга шрифта должен обрабатывать тайский порядок букв при его получении в качестве входных данных, а также как метод ввода следует разрешить ввод таких символов, если вы пытаетесь их ввести.

Обзор стандартизации и реализации тайского языка

libthai включает методы ввода и вывода.

thaicheck - небольшая программа, которая может обнаруживать проблемы с последовательностью букв и исправлять их.

Между прочим, у вас не может быть последовательности (слова) do dek, mai tho и maitaikhu; входная последовательность - шум.

Имейте в виду, что некоторые редакторы имеют неработающие методы ввода, которые позволяют вводить несколько NSM, которые нельзя комбинировать, но метод вывода будет отображать только допустимые последовательности; В результате получается недопустимая строка ввода, которая выглядит нормально для пользователя на его системе .

4 голосов
/ 19 августа 2011

Все коды, которые вы упоминаете, находятся в UTF-8, поэтому каждому символу нужно 3 байта. Unicode коды :

Последние два относятся к категории 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 .

3 голосов
/ 28 февраля 2014

Вы никогда не должны объединять сотни символов Unicode в один графический символ, хотя форматы Unicode технически позволяют это;Вы обычно комбинируете не более 2 или 3 символов.

В тайском языке у вас есть гласные и тональные метки, которые отображаются над согласным символом (иногда гласные появляются ниже или даже вокруг согласных символов ...),Это немного похоже на ударение на гласные по-французски (é, è ...) или умлауты по-немецки.Нормально иметь более двух таких знаков на тайском языке (и больше, чем один на французском или немецком языке).Это означает, что вы вводите недопустимый тайский текст (возможно, написанный для создания забавных графических эффектов, таких как «ASCII art»)Я не удивлен, что такой незаконный текст интерпретируется по-разному в зависимости от браузера.

1 голос
/ 19 мая 2016

То, что вы нашли, называется Объединение символов или как обычные люди, это называется Zalgo.

Это работает, потому что Unicode позволяет объединять символы, добавляя диакритические знаки после символа.

Любая система, использующая Unicode , будет работать с этими символами.

...