テキスト処理の基本概念
ユーザーインターフェースを持つほとんどのプログラムではテキスト操作が必要です。国際市場向けのアプリケーションでは、世界各地の言語規則に準拠したテキスト表示が求められます。Javaではロケールに依存しないテキスト処理を支援するクラスが提供されています。
文字プロパティの検査
Characterクラスの比較メソッドを使用して、主要言語の文字プロパティを検査できます。
char ch = 'A';
if (Character.isLetter(ch)) {
System.out.println("文字です");
}
文字列比較
Collatorクラスを使用してロケールに依存しない文字列比較を実行できます。
Collator collator = Collator.getInstance(Locale.JAPANESE);
int result = collator.compare("東京", "大阪");
テキスト境界の検出
BreakIteratorクラスを使用して文字、単語、文、行の境界を検出できます。
BreakIterator iterator = BreakIterator.getWordInstance();
iterator.setText("こんにちは世界");
int firstBoundary = iterator.first();
Unicode以外のテキスト変換
異なるエンコーディングシステム間でテキストを変換するためのクラスが提供されています。
String str = "日本語";
byte[] utf8Bytes = str.getBytes("UTF-8");
高度なテキスト処理技術
正規化APIの使用
テキストを様々な正規化形式に変換できます。
String normalized = Normalizer.normalize("コンニチハ", Normalizer.Form.NFKC);
双方向テキストの処理
JTextComponentクラスを使用して左から右、右から左の両方向のテキストを処理できます。
JTextPane pane = new JTextPane();
pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
実用的なコード例
文字列比較の実装
public int compareStrings(String s1, String s2, Locale locale) {
Collator collator = Collator.getInstance(locale);
return collator.compare(s1, s2);
}
テキスト境界検出の実装
public void printWordBoundaries(String text, Locale locale) {
BreakIterator iterator = BreakIterator.getWordInstance(locale);
iterator.setText(text);
int start = iterator.first();
for (int end = iterator.next(); end != BreakIterator.DONE; end = iterator.next()) {
System.out.println(text.substring(start, end));
start = end;
}
}
パフォーマンス最適化
頻繁に比較を行う場合、CollationKeyクラスを使用してパフォーマンスを向上できます。
Collator collator = Collator.getInstance(Locale.JAPANESE);
CollationKey key1 = collator.getCollationKey("東京");
CollationKey key2 = collator.getCollationKey("大阪");
int result = key1.compareTo(key2);
国際化対応のベストプラクティス
- char型ではなくコードポイントを使用する
- 文字数をカウントする際はcodePointCountを使用する
- 大文字/小文字変換にはStringクラスのメソッドを使用する
- テキスト処理前に正規化を検討する