今までJavaに関する記事を投稿したことはありませんが、仕事で少しだけ文字コードの変換を行う際に使いましたので、記事にしたいと思います。
何分、Javaに関しては初心者ですので、誤り等ありましたらご指摘の程よろしくお願い致します。
初回はASCII制御文字を置換する方法について紹介します。
1. 正規表現を利用した置換方法
特定の文字を単純に指定した文字に置換するだけなら、文字列(String)に対してreplaceAll()
を利用して1行で済みます。
str.replaceAll("\p{C}", "");
Stack OverflowにQ&Aがありましたので、そのまま引用しています。
この正規表現「p{C}
」(先頭のバックスラッシュ””はエスケープです)は、ASCII制御文字である「0x00〜0x1F」を削除します。
詳しい正規表現はこちらをご覧ください。
基本はこれで問題ないです。
しかし、文字コードを細かく指定したい場合は、次の2つの方法が有効です。
2. 1文字ずつ判定して置換する方法
以下のコードは、文字列(String)を1文字ずつループし、文字コードがASCII制御文字かどうかを判定して置換します。
最終的に置換後の文字列を返す関数を作って見ました。
public static String replaceControlCharacter(String str) {
if (str == null) {
return str;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c >= 0x00 && c <= 0x1F) {
sb.append("");
} else {
sb.append(c);
}
}
String result = sb.toString();
return result;
}
説明
関数の引数に文字列(String)を渡します。
for文で文字数(str.length()
)だけループを回します。
あとは、Char型の変数に格納したも文字をif文でASCII制御文字(0x00〜0x1F)かどうか判定してStringBuffer変数にappend()
していきます。
if分の箇所は自由に指定できるので、自由に置換したい文字コードを指定することができます。
最後は、toString()
関数で文字列にして返却します。
3. MatcherとPatternクラスを利用する
もう1つは、JavaのMatcherとPatternという便利なクラスを利用します。
以下のサンプルは、クラス変数(Pattern)などに置換対象の文字コードを指定し、Matcherクラスを利用して文字列の中から一致した文字をreplaceAll()
関数で置換する方法です。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
・・・
private static final Pattern controlCharacters = Pattern.compile(
"[\u0000-\u001F]");
・・・
public static String replaceControlCharacters(String str) {
Matcher match = controlCharacters.matcher(str);
return match.replaceAll("");
}
説明
クラス変数にASCII制御文字のコード範囲を指定します。
そして、matcher()
関数の引数に文字列を渡して、変数(Mather)に格納し、最後は1つ目の方法と同じようにreplaceAll()
関数を利用して置換して完了です。
こちらが参考サイトです。
情報ありがとうございます!
最後に…
このように、Javaで文字コードの変換をするのが初めてでしたので、様々なサイトを参考にさせていただきました。
その中で「正規表現を使うと処理が遅い」という情報が多かった気がします。
それを踏まえると2番目の変換方法がオススメです。
そして、ASCII制御文字に0x7F〜0x9F(u007f〜u009f)を含めるかどうかも参考にしたサイトによって異なりました。
1番目のケースで言うと「p{Cc}
」のような書き方になります。
この辺りも要件によって異なると思いますので、皆さんのご意見も頂けると幸いです。
- Original:https://minory.org/java-ascii-control-character.html
- Source:Minory
- Author:管理者