質問: StandardCharsets.UTF_8.newDecoder(); try{ charbuffer=decoder.decode(bytebuffer); } catch (CharacterCodingException e){Exception(e);} this.unicodeText.setText(charbuffer.toString()); } ``` うまく変換する方法教えてください。 マルチポストのリンクです: http://ja.stackoverflow.com/questions/25075/%E6%96%87%E5%AD%97%E5%88%97%E3%82%92unicode%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84
回答: 提示いただいたコードから、やりたいことが読み取れないのですが、いまは以下のような内容になってます: 1. `text` という変数(定義がないため型は不明)から、Java の文字列(UTF-16 形式)を取り出し、`getBytes()` により、**システムのデフォルトの文字コード** でバイト列に変換 2. `CharsetDecoder` で、そのバイト列を UTF-8 形式とみなして、UTF-16 へ変換 なぜ、UTF-16 をバイト列に変換して、すぐに UTF-16 に戻すのか、理由がよくわからなかったです。 まあ、そういうことをやりたいとして、いまのコードで問題が出そうなのは、`text.getText().toString().getBytes()` で、システムのデフォルトの文字コードを使っていることです。これだと、デフォルトが、たまたま UTF-8 ならうまく動きますが、もし違ったら、正しく変換されません。 `getBytes()` の引数にエンコーディングを指定してください。 以下は、Android のアプリではなく、単独で実験できる Java プログラムの例です。参考にしてください。 ``` import java.nio.charset.Charset; public class UTF8Test { public static void main(String[] args) { Charset utf8 = Charset.forName("UTF-8"); // オリジナルの文字列:UTF-16 形式 String original = "\u30c6\u30b9\u30c8"; // "テスト" System.out.println(original); // UTF-16 形式の文字列から、UTF-8 形式のバイト配列に変換 byte[] utf8Bytes = original.getBytes(utf8); System.out.println(UTF8Test.toHexString(utf8Bytes)); // UTF-8 形式のバイト配列から UTF-16 形式の文字列へ変換する String restored = new String(utf8Bytes, utf8); System.out.println(restored); } /** * バイト配列の内容を16進数の文字列に変換する。 */ public static String toHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.length * 2); for (int i : data) { if (sb.length() > 0) { sb.append(", "); } sb.append("0x"); String hex = Integer.toHexString(i).toLowerCase(); if (hex.length() == 1) { sb.append("0"); } else if (hex.length() == 8) { hex = hex.substring(6); } sb.append(hex); } return sb.toString(); } } ``` **実行結果** ``` テスト UTF-8: 0xe3, 0x83, 0x86, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0x88 テスト ``` この例のように、文字列程度の小さなデータなら、`CharsetDecoder` を使わなくても、`new String(byte配列, 文字コード)` で十分対応できます。もちろん、質問文に提示いただいた通りのコードでも、(`getBytes()` のところさえ直せば)うまく動くはずです。