提示いただいたコードから、やりたいことが読み取れないのですが、いまは以下のような内容になってます:
text
という変数(定義がないため型は不明)から、Java の文字列(UTF-16 形式)を取り出し、getBytes()
により、システムのデフォルトの文字コード でバイト列に変換
CharsetDecoder
で、そのバイト列を UTF-8 形式とみなして、UTF-16 へ変換
なぜ、UTF-16 をバイト列に変換して、すぐに UTF-16 に戻すのか、理由がよくわからなかったです。
まあ、そういうことをやりたいとして、いまのコードで問題が出そうなのは、text.getText().toString().getBytes()
で、システムのデフォルトの文字コードを使っていることです。これだと、デフォルトが、たまたま UTF-8 ならうまく動きますが、もし違ったら、正しく変換されません。
getBytes()
の引数にエンコーディングを指定してください。
以下は、Android のアプリではなく、単独で実験できる Java プログラムの例です。参考にしてください。
java
1import java.nio.charset.Charset;
2
3public class UTF8Test {
4
5 public static void main(String[] args) {
6 Charset utf8 = Charset.forName("UTF-8");
7
8 // オリジナルの文字列:UTF-16 形式
9 String original = "\u30c6\u30b9\u30c8"; // "テスト"
10 System.out.println(original);
11
12 // UTF-16 形式の文字列から、UTF-8 形式のバイト配列に変換
13 byte[] utf8Bytes = original.getBytes(utf8);
14 System.out.println(UTF8Test.toHexString(utf8Bytes));
15
16 // UTF-8 形式のバイト配列から UTF-16 形式の文字列へ変換する
17 String restored = new String(utf8Bytes, utf8);
18 System.out.println(restored);
19 }
20
21 23
24 public static String toHexString(byte[] data) {
25 StringBuilder sb = new StringBuilder(data.length * 2);
26 for (int i : data) {
27 if (sb.length() > 0) {
28 sb.append(", ");
29 }
30 sb.append("0x");
31 String hex = Integer.toHexString(i).toLowerCase();
32 if (hex.length() == 1) {
33 sb.append("0");
34 } else if (hex.length() == 8) {
35 hex = hex.substring(6);
36 }
37 sb.append(hex);
38 }
39 return sb.toString();
40 }
41
42}
実行結果
テスト
UTF-8: 0xe3, 0x83, 0x86, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0x88
テスト
この例のように、文字列程度の小さなデータなら、CharsetDecoder
を使わなくても、new String(byte配列, 文字コード)
で十分対応できます。もちろん、質問文に提示いただいた通りのコードでも、(getBytes()
のところさえ直せば)うまく動くはずです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/25 00:05