今までJavaに関する記事を投稿したことはありませんが、仕事で少しだけ文字コードの変換を行う際に使いましたので、記事にしたいと思います。
何分、Javaに関しては初心者ですので、誤り等ありましたらご指摘の程よろしくお願い致します。
今回はASCII制御文字を置換する方法について紹介します。
1. 正規表現を利用した置換方法
特定の文字を単純に指定した文字に置換するだけなら、文字列(String)に対してreplaceAll()
を利用して1行で済みます。
1 |
str.replaceAll("\p{C}", ""); |
Stack OverflowにQ&Aがありましたので、そのまま引用しています。
この正規表現「p{C}
」(先頭のバックスラッシュ””はエスケープです)は、ASCII制御文字である「0x00〜0x1F」を削除します。
詳しい正規表現はこちらをご覧ください。
基本はこれで問題ないです。
しかし、文字コードを細かく指定したい場合は、次の2つの方法が有効です。
2. 1文字ずつ判定して置換する方法
以下のコードは、文字列(String)を1文字ずつループし、文字コードがASCII制御文字かどうかを判定して置換します。
最終的に置換後の文字列を返す関数を作って見ました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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()
関数で置換する方法です。
1 2 3 4 5 6 7 8 9 10 |
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}
」のような書き方になります。
この辺りも要件によって異なると思いますので、皆さんのご意見も頂けると幸いです。
コメント
コメント一覧 (1件)
[…] 前回、JavaでASCIIの制御文字の取り扱いについて記事にしました。 そして今回は、前回の対策を応用して、もっと厄介なサロゲートペア文字をJavaでゴニョゴニョする方法を2つ程ご紹介したいと思います。 JavaでASCIIの制御文字を置換する3つの方法https://minory.org/java-ascii-control-character.html今までJavaに関する記事を投稿したことはありませんが、仕事で少しだけ文字コードの変換を行う際に使いましたので、記事にしたいと思います。何分、Javaに関しては初心者ですので、誤り等ありましたらご指摘の程よろしくお願い致します。初回はASCII制御文字を置換す…Minory […]