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'

文字列は 3 つのタイ文字の組み合わせのようです。

ด \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 でのみ表示されます。

以下は私が撮ったスクリーンショットです:

勝つ 7 ie8 勝つ 7 ie8


Ubuntu ファイアフォックス Ubuntu ファイアフォックス


勝つ 7 クローム 勝つ 7 クローム


win7 ファイアフォックス win7 ファイアフォックス


したがって、ブラウザ関連のバグだと思います。

4

4 に答える 4

8

2 つの問題があります。1 つはタイ語を認識しない出力システム (フォント レンダラー) にあり、もう 1 つはこのテキストを最初に生成した入力システムにあります。

宿題を済ませていれば、mai tho と mataikhu (UniCode 名) は、UniCode が Non Spacing Markers (NSM) と呼んでいるものであることを知っているでしょう。これは、このグリフを表示するときに、フォント レンダラーが次の文字セルに移動しないことを意味します。

上記の混乱を避けるために、Thai API Consortium (TAPIC) は WTT 2.0 標準を作成しました。これは、入力として受け取ったフォント レンダリング アルゴリズムがタイ文字の順序を処理する方法と、入力メソッドがそのようなことを許可する方法の両方を記述するものです。入力しようとすると文字が入力されます。

タイ語の標準化と実装の概要

libthaiには、入力メソッドと出力メソッドの両方が含まれています。

thaicheckは、文字列の問題を検出して修正できる小さなプログラムです。

ちなみに、do dek、mai tho、mataikhu のシーケンス (単語) を使用することはできません。入力シーケンスはノイズです。

一部のエディターでは入力方法が壊れており、結合できない複数の NSM を入力できますが、出力方法では正当なシーケンスのみがレンダリングされることに注意してください。その結果、ユーザーのシステムでは問題ないように見える不正な入力文字列が生成されます。

于 2011-08-19T10:19:02.717 に答える
4

あなたが言及したコードはすべてUTF-8であるため、各文字に3バイトが必要です。尊敬のUnicode コードは次のとおりです。

後者の 2 つはカテゴリ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 クラスも参照してください。

于 2011-08-19T10:18:27.490 に答える
3

何百もの Unicode 文字を 1 つのグラフィック文字に結合することは想定されていませんが、Unicode 形式では技術的には許可されています。通常、2 つまたは 3 つ以下の文字を組み合わせます。

タイ語では、子音文字の上に表示される母音と声調記号があります (母音が下に表示されることもあれば、子音文字の周囲に表示されることもあります...)。これは、フランス語の母音 (é、è...) やドイツ語のウムラウトのアクセントに少し似ています。このような記号がタイ語で 2 つ以上 (フランス語やドイツ語では 1 つ以上) あるのは普通ではありません。これは、あなたの入力が違法なタイ語のテキストであることを意味します (「アスキー アート」のような面白いグラフィック効果を提供するために書かれている可能性があります)。このような違法なテキストの解釈がブラウザによって異なることには驚きません。

于 2014-02-28T12:25:09.163 に答える
1

あなたが見つけたものは、組み合わせ文字またはそれが呼ぶ一般的な人々と呼ばれていますZalgo.

Unicode では、文字の後に分音記号を追加して文字を結合できるため、機能します。

Unicodeを使用するシステムは、これらの文字で動作します。

于 2016-05-19T11:50:00.573 に答える