为什么这些泰语字符显示在长尾的网页上?

xia*_*o 啸 27 unicode zalgo

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

我发现了一些有趣的字符,就像我粘贴在上面只有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\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\XB 9\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
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 为什么这些角色的行为如此不同,这是一个错误吗?
  2. 我怎样才能在网站中避免它(也许有一些html过滤器)?

UPDATE

我用更多浏览器测试了角色,长尾只出现在windows平台上的chrome和firefox中.

以下是我拍摄的截图:

赢7 ie8 赢7 ie8


ubuntu firefox ubuntu firefox


赢得7铬 赢得7铬


赢得7火狐 赢得7火狐


因此,我猜这是一个与浏览器相关的bug.

koa*_*oan 8

有两个问题,一个在输出系统(字体渲染器)中,它不是泰语识别的,一个在输入系统中首先生成此文本.

如果你已完成作业,你会知道mai tho和maitaikhu(UniCode名称)是UniCode所指的非间距标记(NSM).这意味着在显示此字形时,字体渲染器不应移动到下一个字符单元格.

为了避免上面看到的混乱,Thai API Consortium(TAPIC)制定了WTT 2.0标准,该标准描述了字体渲染算法在接收泰语字母顺序作为输入时应如何处理泰语字母顺序以及输入方法应如何允许如果您尝试键入它们,则输入字符.

泰语语言概述的标准化和实现

libthai包括输入和输出方法.

thaicheck是一个小程序,可以检测字母序列问题并修复它们.

顺便说一句,你不能有de dek,mai tho和maitaikhu的序列(单词); 输入序列是噪音.

请记住,某些编辑器已经破坏了输入方法,允许键入多个无法组合的NSM,但输出方法只会呈现合法的序列; 结果是一个非法的输入字符串,对他的系统上的用户看起来没问题.

  • 如果每个人"完成了他们的功课",我们就不需要stackoverflow (15认同)
  • 我做过一些功课,但我是泰国人的新手,因此我无法指出如何谷歌.这就是我认为SO很棒的原因. (4认同)

dev*_*vio 4

你提到的代码都是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);
Run Code Online (Sandbox Code Playgroud)

输出:

number of code points: 3
number of text elements: 1
Run Code Online (Sandbox Code Playgroud)

另请参见.Net StringInfo 类