2

エンドユーザーのフォントに合法的な印刷可能な Unicode コード ポイントが存在するかどうかを確認するために、(演習として) Java を使用してやや単純なテーブルを作成したいと考えています。一部のフォントは有効なコード ポイントを印刷できないため、ユーザーのフォントが欠落しているため印刷できない印刷可能なコード ポイントを知る必要があります。

たとえば、フォントがラテン文字のみをサポートしている場合、それを使用してギリシャ文字を印刷することはできません。日本語の文字はもちろんです。Unicode は、それらはすべて印刷可能であると言っていますが、ユーザーのフォントは十分ではない可能性があります。

少し調査した後、(エンコーディングを調整することにより) Eclipse でほとんどの文字を印刷することができました。ただし、出力にはまだ不明な/印刷できない文字がたくさんあります。出力を見ると、印刷可能な文字の一部にこれらすべての空の四角形が表示されます。

それらをフィルタリングしようとしましたが、それを行う方法が見つかりません。参考までに、私は基本的に文字の値を 50、100、または 1000 に設定し、forそこからループを介してインクリメントして、印刷できる文字と印刷できない文字 (または印刷すべきではない文字) を確認しています。

ここから始めるべきヒントを誰か教えてもらえますか?

4

2 に答える 2

3

印刷しようとしているフォントによって出力に大きな違いが生じるため、実際のタスクはエンコードよりも少し複雑です。つまり、すべてのフォントが同じ文字セットをサポートしているわけではありません。実際、文字範囲のサポートはfont ごとに大きく異なります。

そうは言っても、あなたの問題は次のようになります:特定のフォントが特定の文字をサポートしているかどうかをどのように検出しますか? そして、その質問は尋ねられ、答えられました... Font クラスのメンバーであるcanDisplay 関数の Java ドキュメントについては、こちらを参照してください

于 2012-02-09T12:42:18.187 に答える
2

ここで実際に正確に何を意味するのかは不明です。数字で遊ぶつもりなら、Unicode 正規表現に関する Unicode Technical Standard #18 の Annex C はprint、「印刷可能な」コード ポイントを、プロパティを持つ任意のコード ポイントとして定義することを具体的に提案しています。なれ

  • \p{print} 意味[[\p{graph}\p{blank}]&&[^\p{gc=Control}]]
  • \p{graph} 意味[^\p{Whitespace}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}]
  • \p{blank} 意味[\p{Whitespace}&&[^\N{LF}\N{VT}\N{FF}\N{CR}\N{NEL}\p{gc=Line_Separator}\{gc=Paragraph_Separator}]

または、Java 1.7Patternクラスがこれらを文書化しているように、 Java7 の新しい Pattern.UNICODE_CHARACTER_CLASSフラグを有効にしてパターンをコンパイルする場合:

  • \p{Graph} 目に見える文字:[^\p{IsWhite_Space}\p{gc=Cc}\p{gc=Cs}\p{gc=Cn}]
  • \p{Print} 印刷可能な文字:[\p{Graph}\p{Blank}&&[^\p{Cntrl}]]
  • \p{Blank} スペースまたはタブ:[\p{IsWhite_Space}&&[^\p{gc=Zl}\p{gc=Zp}\x0a\x0b\x0c\x0d * \x85]]
  • \p{Cntrl} 制御文字:\p{gc=Cc}
  • \p{XDigit} 16 進数:[\p{gc=Nd}\p{IsHex_Digit}]
  • \p{Space} 空白文字:\p{IsWhite_Space}

「印刷可能な」文字について

Java の(?U)\p{print}パターン プロパティ (またはCharacterクラスからの同等のもの) のような合理的なものを使用するだけでも、いくつかの「興味深い」決定を下す必要があります。

次の各コード ポイントを検討してください。

U+000007 gc=Cc columns=0 print=0 graph=0  ALERT
U+000008 gc=Cc columns=0 print=0 graph=0  BACKSPACE
U+000009 gc=Cc columns=0 print=0 graph=0  CHARACTER TABULATION
U+00000C gc=Cc columns=0 print=0 graph=0  FORM FEED (FF)
U+00000D gc=Cc columns=0 print=0 graph=0  CARRIAGE RETURN (CR)
U+000020 gc=Zs columns=1 print=1 graph=0  SPACE
U+000021 gc=Po columns=1 print=1 graph=1  EXCLAMATION MARK
U+000041 gc=Lu columns=1 print=1 graph=1  LATIN CAPITAL LETTER A
U+000061 gc=Ll columns=1 print=1 graph=1  LATIN SMALL LETTER A
U+000080 gc=Cc columns=0 print=0 graph=0  PADDING CHARACTER
U+000085 gc=Cc columns=0 print=0 graph=0  NEXT LINE (NEL)
U+00008D gc=Cc columns=0 print=0 graph=0  REVERSE LINE FEED
U+0000AB gc=Pi columns=1 print=1 graph=1  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
U+0000AD gc=Cf columns=0 print=1 graph=1  SOFT HYPHEN
U+0002B0 gc=Lm columns=1 print=1 graph=1  MODIFIER LETTER SMALL H
U+0002C6 gc=Lm columns=1 print=1 graph=1  MODIFIER LETTER CIRCUMFLEX ACCENT
U+000302 gc=Mn columns=0 print=1 graph=1  COMBINING CIRCUMFLEX ACCENT
U+00036A gc=Mn columns=0 print=1 graph=1  COMBINING LATIN SMALL LETTER H
U+001100 gc=Lo columns=2 print=1 graph=1  HANGUL CHOSEONG KIYEOK
U+002028 gc=Zl columns=0 print=0 graph=0  LINE SEPARATOR
U+002029 gc=Zp columns=0 print=0 graph=0  PARAGRAPH SEPARATOR
U+00202B gc=Cf columns=0 print=1 graph=1  RIGHT-TO-LEFT EMBEDDING
U+00202F gc=Zs columns=1 print=1 graph=0  NARROW NO-BREAK SPACE
U+002060 gc=Cf columns=0 print=1 graph=1  WORD JOINER
U+002061 gc=Cf columns=0 print=1 graph=1  FUNCTION APPLICATION
U+002062 gc=Cf columns=0 print=1 graph=1  INVISIBLE TIMES
U+002064 gc=Cf columns=0 print=1 graph=1  INVISIBLE PLUS
U+002EC1 gc=So columns=2 print=1 graph=1  CJK RADICAL TIGER
U+002F0B gc=So columns=2 print=1 graph=1  KANGXI RADICAL EIGHT
U+003000 gc=Zs columns=2 print=1 graph=0  IDEOGRAPHIC SPACE
U+003008 gc=Ps columns=2 print=1 graph=1  LEFT ANGLE BRACKET
U+00300A gc=Ps columns=2 print=1 graph=1  LEFT DOUBLE ANGLE BRACKET
U+00300C gc=Ps columns=2 print=1 graph=1  LEFT CORNER BRACKET
U+00302B gc=Mn columns=0 print=1 graph=1  IDEOGRAPHIC RISING TONE MARK
U+003030 gc=Pd columns=2 print=1 graph=1  WAVY DASH
U+003037 gc=So columns=2 print=1 graph=1  IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
U+003041 gc=Lo columns=2 print=1 graph=1  HIRAGANA LETTER SMALL A
U+00E000 gc=Co columns=1 print=1 graph=1 <unnamed codepoint in blk=Private_Use_Area>
U+00F8FF gc=Co columns=1 print=1 graph=1 <unnamed codepoint in blk=Private_Use_Area>
U+00FB1E gc=Mn columns=0 print=1 graph=1  HEBREW POINT JUDEO-SPANISH VARIKA
U+00FE00 gc=Mn columns=0 print=1 graph=1  VARIATION SELECTOR-1
U+00FE23 gc=Mn columns=0 print=1 graph=1  COMBINING DOUBLE TILDE RIGHT HALF
U+00FE58 gc=Pd columns=2 print=1 graph=1  SMALL EM DASH
U+00FE77 gc=Lo columns=1 print=1 graph=1  ARABIC FATHA MEDIAL FORM
U+00FEFF gc=Cf columns=0 print=1 graph=1  ZERO WIDTH NO-BREAK SPACE
U+00FF06 gc=Po columns=2 print=1 graph=1  FULLWIDTH AMPERSAND
U+00FFFA gc=Cf columns=0 print=1 graph=1  INTERLINEAR ANNOTATION SEPARATOR
U+00FFFD gc=So columns=1 print=1 graph=1  REPLACEMENT CHARACTER
U+01B000 gc=Lo columns=2 print=1 graph=1  KATAKANA LETTER ARCHAIC E
U+01D165 gc=Mc columns=1 print=1 graph=1  MUSICAL SYMBOL COMBINING STEM
U+01D167 gc=Mn columns=0 print=1 graph=1  MUSICAL SYMBOL COMBINING TREMOLO-1
U+100002 gc=Co columns=1 print=1 graph=1 <unnamed codepoint in blk=Supplementary_Private_Use_Area-B>

それらのいくつかは、何を印刷するか、あるいは印刷するかどうかについて、非常に条件付きです。たとえば、U+F8FF の ‹› はあなたにはどのように見えますか?

次に、タブとバックスペースの処理方法を決定する必要があります。

さらに、Unicode拡張書記素クラスター\p{Grapheme_Extend}を構築するために使用される さまざまなコード ポイントを考慮する必要があります。つまり、ユーザーに表示される文字です。これらのすべてがノンスペース マークであるとは限りません。実際、マークではなく文字である場合もあります。一部はまったく印刷可能な文字ではありませんが、不可避的に関連付けられている印刷可能な文字を変更します。バリエーション セレクターを 1 つの例として考えてみましょう。\p{Grapheme_Base}

警告

これは、Java プログラマー志望者が忘れがちな非常に重要なポイントであり、完全に忘れられていない場合でも、通常は過小評価されています。

Java 文字は Unicode 文字ではないことを常に覚えておいてください。 Unicode 文字には 2 つの合理的な定義があり、Java ではどちらも提供されません。以下に、2 つの合理的な定義を示します。

  • 文字がプログラマーに見える意味での文字である場合、その文字は Unicode コード ポイントです。これは.、たとえば、Sun または ICU のどちらを使用しても、正規表現エンジンで一致するものです。
  • 文字がユーザーに見える意味での文字である場合、その文字は Unicode 拡張書記素クラスターです。これは\X、(Sun ではなく ICU) 正規表現エンジンで一致するものです。

Java のいわゆる「文字」は、実際の Unicode コード ポイントの可変幅 UTF-16 表現の低レベルの抽象化された 2 バイト要素です。それは抽象コードポイントでも抽象書記素でもありません。抽象的なものではありません Javacharは、抽象化のエンベロープに違反しています。

はい、一部の Java クラスはcodePointAtインターフェイスを提供します。それらが使用可能な場合は、必ずそれらを使用する必要があります。しかし、ここで説明するには時間がかかりすぎる多くの点で、Java は文字の抽象化において根本的に壊れています— 文字の抽象化がないためです。

これにより、Java での Unicode 文字と文​​字列の操作は、せいぜいエラーが発生しやすくなり、ほとんどの場合不可能になります。

幸運を。

于 2012-02-09T14:50:41.663 に答える