質問: 与えられた文字列について、UTF-8に定義されているがShiftJIS(正確にはCP932)に定義されていない文字があるかどうか検出する方法はありますか? 文字コードの変換のやり方は結構見つかりますが、ちゃんと変換できたのかどうかを判定したいのです。 ※ShiftJISしか使えない旧システムとの連携があるため、「旧システムに渡せない文字」をユーザが入力したとき、弾けるように・・・ Java8を使っています。
回答: 「文字列`s`がCP932(`MS932`)に変換できるかを調べる」ためのコード: ``` if (Charset.forName("MS932").newEncoder().canEncode(s)) { // 変換可能 } else { // 変換不能 } ``` 「文字列`s`をCP932(`MS932`)のバイト列に変換する、ただし変換不能ならその旨を伝える」ためのコード: ``` try { ByteBuffer bb = Charset.forName("MS932").newEncoder() .onUnmappableCharacter(CodingErrorAction.REPORT) .encode(CharBuffer.wrap(s)); // ByteBufferを得る byte[] ba = bb.array(); // byte配列を得る } catch(CharacterCodingException e) { // 変換不能だった } ``` ※「変換可能」とは「`String#getBytes()`で正常に(`?`に化けずに)変換可能」を指します。