【processing/java】 replaceAllで"?"を置換したい
先週、発表する機会があり、そのためにprocessingでAPIを叩いていたところ2つの問題にぶち当たりました。
一つはAPIから帰ってくる文字の文字コードがなぜかSJISだったって言うことです。
文字コードの変換
なんでUTF-8じゃないんだよ!!
よくわからない文字が帰ってくるな~でも200 OK なんだよな~って思ってたのですが、
String sjisToUtf8(String value) throws UnsupportedEncodingException { byte[] srcStream = value.getBytes("SJIS"); byte[] destStream = (new String(srcStream, "SJIS")).getBytes("UTF-8"); value = new String(destStream, "UTF-8"); return value; }
space.geocities.jp
ココらへんの記事を参考にしながら文字コード問題は解決できたと思ったのですが、こんどはそのせいによる文字化けが起こってしましました。
文字化け(?)の置換について
(まじかよ・・・もうやだよ・・・・)
とりあえず全部、置換しちゃえ!
ってことでこんなコードを書きました。
悪い例
String hoge="?あ?い?う?え?お?"; println(hoge.replaceAll("?",""));
これを実行するとエラーが・・・・・
しかもなんだよ、PatternSyntaxExceptionって
もう意味わかんない!!
よくわかんなかったので、回避策として
一時的な回避策
String hoge="?あ?い?う?え?お?"; while (hoge.indexOf("?")!=-1) { hoge=hoge.replace("?", ""); } println(hoge);
よし動いた~解決~
でやってたのですが。
今回記事を書くとなって詳しく調べてみたら、?は正規表現記号で使うのでエラーを吐いてたみたいです。
よくJavadoc読んでませんでした...
正規表現使えるのなら使えそうだな、役に立ちそうだなと思い、さらにいい勉強になりました。
正しい答え
String hoge="?あ?い?う?え?お?"; println(hoge.replaceAll("\\?",""));
?の前に\\(バックスラッシュ2つ)を入れればできます。
正規表現なので、^$*+も同様にするとreplaceAllで使えます。
この記事が今年最後の更新になると思います。
2015年ありがとうございました。2016年もよろしくおねがいします。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
以下 2015/12/28追記
replaceAll使わなくても行けるとの指摘を頂きました。
String hoge="?あ?い?う?え?お?"; println(hoge.replace("?",""));
すごく無駄なことをしてました・・・