質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • Java

    14088questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6628questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unicodeに変換できない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,068

Unicodeにうまく変換できません。文字コードの指定の仕方が悪いのかもしれませんが…

private EditText unicodeText;
            private byte[] stringchar;
            ByteBuffer bytebuffer;
            CharBuffer charbuffer;
            public void onClick(View v){
                this.unicodeText=(EditText) findViewById(R.id.unicode);

                bytebuffer=ByteBuffer.wrap(text.getText().toString().getBytes());
                CharsetDecoder decoder = 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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

>実は某質問サイト(コチラもプログラマー向け)ので解決していましたが、
>こちらも分かりやすかったです。ありがとうございました。
マルチポストするなとは書きません、
マルチポストするなら最低限、相互にアドレス位は、載せましょう。
会員制有料掲示板以外の、質問サイトはクローラが好んで巡回しますので、
大抵の場所では、書込みを検索できてしまいます。

情報共有
文字列をUnicodeに変換できない
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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 09:05

    分かりました。

    キャンセル

checkベストアンサー

0

提示いただいたコードから、やりたいことが読み取れないのですが、いまは以下のような内容になってます:

  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() のところさえ直せば)うまく動くはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/23 21:18 編集

    分かりやすかったです。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    android 簡単な電卓(足し算だけ)

    android studioで電卓を作っています とりあえず、足し算だけをできるようにしているのですがうまくいきません どこが間違っていて、どうすればいいか教えてくださいお願い

  • 受付中

    明解Java入門編演習9−3

    この演習はDayクラスを使わずに行う演習なのでしょうか? Dayクラスを使うのなら、銀行口座クラスにtoStringメソッドを作る理由が分かりません。 また、もしDayクラスを

  • 解決済

    toString()メソッドのうまい書き方がわかりません。

    簡単な単方向連結リストの実装をしてみたのですが、toStringメソッドがうまく書けないで、困っています。 どのように記述するのがベストだと思われますか? public c

  • 解決済

    Recursive 問題。

    このケースではAを返すと思ったのですが、まだ空のままです。どうしてでしょうか?多分add の奴を自分は間違って理解していると思うのですが。 public class Recu

  • 解決済

    HTTP通信でJSONデータをカラムごとに取得したいです。

    前提・実現したいこと RailsAPIからJSONデータをカラムごとにAndroid側で取得したいです。 取得するデータは以下です。(en_titleカラムの値を取得したいです

  • 解決済

    Javaにおいてmain関数以外が書けません

    mainクラスと実行結果が与えられていて、その他のクラスなどをつくらなければならないのですが、いまいちやり方がつかめません。 countNameのように途中から大文字になるものが入

  • 解決済

    オブジェクトを配列に入れて各要素を表示をスマートにやりたい

     前提・実現したいこと 五人の名前と、数学、英語、物理のテストの結果をそれぞれ表示したうえで集計し、平均を出すプログラムを書いています。 方針としては、まず一人一人のオブジェク

  • 解決済

    作って覚えるプログラミング精選課題集(Java基礎編)の課題が解けません

    Qiitaというサイトに 『作って覚えるプログラミング精選課題集(Java基礎編)』 という課題が記載してあるのですが、レベル1と2は何とか解けたのですが、レベル3と4が全く歯

同じタグがついた質問を見る

  • Java

    14088questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6628questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。