首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这些泰国文字会长尾显示在网页上?

为什么这些泰国文字会长尾显示在网页上?
EN

Stack Overflow用户
提问于 2011-08-19 08:48:21
回答 4查看 10.9K关注 0票数 27

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

我发现了一些有趣的人物,就像我贴在上面一样,只有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\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‘

字符串似乎是三个泰语字符的组合:

代码语言:javascript
运行
复制
ด \xe0\xb8\x94  THAI CHARACTER DO DEK

้  \xe0\xb9\x89  THAI CHARACTER MAI THO

็  \xe0\xb9\x87  THAI CHARACTER MAITAIKHU

我的问题是:

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

更新

我用更多的浏览器测试了这些字符,而长尾只出现在windows平台上的chrome和firefox中。

以下是我拍摄的截图:

win 7 ie8

ubuntu firefox

win 7铬

win 7 firefox

因此,我想这是一个与浏览器相关的错误。

EN

回答 4

Stack Overflow用户

发布于 2011-08-19 10:19:02

有两个问题,一个在输出系统(字体呈现器)中没有泰国语,另一个在输入系统中,首先生成这个文本。

如果您已经完成了作业,您就会知道mai和maitaikhu (UniCode名称)是UniCode所指的非间距标记(NSM)。这意味着当显示此字形时,字体呈现器不应移动到下一个字符单元格。

为了避免上面看到的混乱,泰国API联合会(TAPIC)制定了WTT 2.0标准,该标准既描述了字体呈现算法在接收到泰国字母顺序作为输入时应该如何处理它,也描述了如果尝试键入这些字符,输入方法应该如何允许输入这些字符。

泰语标准化与实现概述

李柏泰包括输入和输出方法。

塔希克是一个小程序,可以检测字母顺序问题并修复它们。

顺便说一句,你不能有一个序列(字)的多德克,麦索和梅塔伊库;输入序列是噪音。

请记住,一些编辑器已经中断了允许键入无法组合的多个NSM的输入方法,但是输出方法将只呈现合法的序列;结果是一个非法的输入字符串,对系统上的用户来说是OK的。

票数 8
EN

Stack Overflow用户

发布于 2011-08-19 10:18:27

您提到的代码都在UTF-8中,这就是为什么每个字符需要3个字节的原因。尊敬的Unicode码是:

  • 德克 0x0e14
  • 梅索 0x0e49
  • 马塔库 0x0e47

后两者在类别Mark, Nonspacing中,并将Combine属性(班级)设置为107,这意味着在呈现过程中代码点与前面的代码点组合在一起。

您的示例从一个字符开始,并在上面添加了许多非间距标记。

与此C#代码相比:

代码语言:javascript
运行
复制
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);

输出:

代码语言:javascript
运行
复制
number of code points: 3
number of text elements: 1

另见.Net StringInfo类

票数 4
EN

Stack Overflow用户

发布于 2014-02-28 12:25:09

您不应该将数百个unicode字符组合成一个图形字符,尽管unicode格式在技术上是允许的;通常组合的字符不超过2或3个。

在泰语中,您有元音和音调标记,它们显示在辅音字符的上方(有时元音出现在辅音字符下面,甚至在辅音字符周围.)。它有点像法语元音的重音(é,è.)或者是德语的货币。在泰国有超过两个这样的标志是不正常的(在法语或德语中有一个以上)。这意味着您的输入是非法的泰国文本(可能是为了提供一些有趣的图形效果,如"ASCII艺术“)。这些非法文本根据浏览器被不同的解释,我并不感到惊讶。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7119115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档