の検出にUnicode textに合字にClojure/Java
質問
合字のUnicode文字を代表とする複数のコードポイント。例えば、デーヴァナーガリー त्र
は、合字のコードポイント त + ् + र
.
が見られる単純なテキストファイルの編集者など、メモ帳 त्र
として表示してお त् + र
に保存されてUnicode文字です。しかし時と同じファイルを開くとFirefoxのですが、適切なリガチャ.
その後、私の質問は、どのように検出などの合字グを読みながらファイルからのコードです。以降、Firefoxなが必ず存在し、いつでプログラム.はありまUnicode性を含むこれらの情報は必要でしょうかい地図等の合字?
SVG CSSプロパティ text-rendering
時に設定 optimizeLegibility
は同じことをコードポイントへの適合字).
PS:を使用していJava.
編集
目的のコードをカウントの文字のUnicode文字を想定したリガチャにシングル文字です。ながらやっていく必要がある方への崩壊が複数のコードポイントを単一のリガチャ.
解決 4
その間 アーロンの答え 正確ではありません、それは私を正しい方向に押し上げました。 Java APIドキュメントを読んだ後 java.awt.font.GlyphVector
そして、Clojure Replで多くのことをして、私は自分が望むことをする関数を書くことができました。
アイデアは、のグリフの幅を見つけることです glyphVector
グリフをゼロ幅と組み合わせて、最後に見つかった非ゼロ幅グリフと組み合わせます。解決策はClojureにありますが、必要に応じてJavaに翻訳可能である必要があります。
(ns net.abhinavsarkar.unicode
(:import [java.awt.font TextAttribute GlyphVector]
[java.awt Font]
[javax.swing JTextArea]))
(let [^java.util.Map text-attrs {
TextAttribute/FAMILY "Arial Unicode MS"
TextAttribute/SIZE 25
TextAttribute/LIGATURES TextAttribute/LIGATURES_ON}
font (Font/getFont text-attrs)
ta (doto (JTextArea.) (.setFont font))
frc (.getFontRenderContext (.getFontMetrics ta font))]
(defn unicode-partition
"takes an unicode string and returns a vector of strings by partitioning
the input string in such a way that multiple code points of a single
ligature are in same partition in the output vector"
[^String text]
(let [glyph-vector
(.layoutGlyphVector
font, frc, (.toCharArray text),
0, (.length text), Font/LAYOUT_LEFT_TO_RIGHT)
glyph-num (.getNumGlyphs glyph-vector)
glyph-positions
(map first (partition 2
(.getGlyphPositions glyph-vector 0 glyph-num nil)))
glyph-widths
(map -
(concat (next glyph-positions)
[(.. glyph-vector getLogicalBounds width)])
glyph-positions)
glyph-indices
(seq (.getGlyphCharIndices glyph-vector 0 glyph-num nil))
glyph-index-width-map (zipmap glyph-indices glyph-widths)
corrected-glyph-widths
(vec (reduce
(fn [acc [k v]] (do (aset acc k v) acc))
(make-array Float (count glyph-index-width-map))
glyph-index-width-map))]
(loop [idx 0 pidx 0 char-seq text acc []]
(if (nil? char-seq)
acc
(if-not (zero? (nth corrected-glyph-widths idx))
(recur (inc idx) (inc pidx) (next char-seq)
(conj acc (str (first char-seq))))
(recur (inc idx) pidx (next char-seq)
(assoc acc (dec pidx)
(str (nth acc (dec pidx)) (first char-seq))))))))))
また投稿されました 要点について.
他のヒント
コンピュータータイプセット ウィキペディアページは言う -
Texを備えたコンピューターモダンローマの書体には、5つの一般的な結晶FF、FI、FL、FFI、およびFFLが含まれています。 Texがこれらの組み合わせをテキストで見つけると、Taptersetterによってオーバーライドされない限り、適切な結晶を置き換えます。
これは、代替を行うのは編集者であることを示しています。さらに、
Unicodeは、結紮糸が文字定義の問題ではなくプレゼンテーションの問題であり、たとえば「最新のフォントが「H」に続いて「R」が表示されるように求められ、フォントには「HR」の字系があると主張していると主張しています。 、それは結晶を表示できます。」
私が見る限り(私はこのトピックに興味を持っていて、今ではいくつかの記事を読んでいます)、結晶代替の指示はフォント内に埋め込まれています。今、私はもっと掘り下げて、あなたのためにこれらを見つけました。 GSUB-グリフ置換テーブル と 結晶代替微小安定性 Opentypeファイル形式の仕様から。
次に、Opentypeフォントファイル内でピークに達することができるライブラリ、つまり、すばやくアクセスできるファイルパーサーを見つけることができるライブラリを見つける必要があります。次の2つを読んでいます 議論 これらの代替を行う方法についていくつかの指示を与えるかもしれません:
何を言い合字(少なくともそのようなことはしなUnicodeに特有の用語が覚クラスターが標準付属書は関係の発見からテキストの境界を含むグラフェンクラスタの境界線:
http://www.unicode.org/reports/tr29/tr29-15.html#Grapheme_Cluster_Boundaries
もついての説明を参照してくださいあわせたグラフェン集積の正規表現:
http://unicode.org/reports/tr18/#Tailored_Graphemes_Clusters
のの定義照合graphemes:
http://www.unicode.org/reports/tr10/#Collation_Graphemes
私はこれら始ます。いに独立したものではなくこれから見Java Unicode照合アルゴリズムにすることができますDevanagariた。しょ解析を行う事ができない文字列頼OpenTypeが特徴です。このビットクリーナー以降、OpenTypeは純粋に遡及組み替え計数の公表の詳細な文字は、文字やグラフェンクラスタの意味が、照合アルゴリズムに合わせたグラフェンクラスター界の発見アルゴリズムとしてできない場合は、それぞれ独自に実装することのフォント.
Glyphvectorクラスからこの情報を取得できる場合があります。
特定の文字列の場合、フォントインスタンスは、テキストのレンダリングに関する情報を提供できるglyphvectorを作成できます。
layoutglyphvector() フォントのメソッドはこれを提供できます。
flag_complex_glyphs Glyphvectorの属性は、テキストに入力文字を使用した1〜1マッピングがないかどうかを表示できます。
次のコードは、この例を示しています。
JTextField textField = new JTextField();
String textToTest = "abcdefg";
FontRenderContext fontRenderContext = textField.getFontMetrics(font).getFontRenderContext();
GlyphVector glyphVector = font.layoutGlyphVector(fontRenderContext, textToTest.toCharArray(), 0, 4, Font.LAYOUT_LEFT_TO_RIGHT);
int layoutFlags = glyphVector.getLayoutFlags();
boolean hasComplexGlyphs = (layoutFlags & GlyphVector.FLAG_COMPLEX_GLYPHS) != 0;
int numberOfGlyphs = glyphVector.getNumGlyphs();
numberofglyphsは、入力テキストを表示するために使用される文字の数を表す必要があります。
残念ながら、fontrendercontextを取得するには、Java GUIコンポーネントを作成する必要があります。
私はあなたが本当に探しているのは Unicode Normalization
.
Javaについては、確認する必要があります http://download.oracle.com/javase/6/docs/api/java/text/normalizer.html
適切な正規化フォームを選択することで、探しているものを取得できます。