25078


Unicodeにうまく変換できません。

[code]

    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());//クラス外にtextという変数名のEditTextがある
        CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); 
        try{
            charbuffer=decoder.decode(bytebuffer);
        }
        catch (CharacterCodingException e){Exception(e);}
        //処理をException()にまとめて書いている
        this.unicodeText.setText(charbuffer.toString());
    }
    
[/code]

どこが悪いか教えて下さい。


CC BY-SA 3.0
2016-05-22T04:44:14.670
25075
2016-07-20T09:53:05.390
2016-07-20T09:53:05.390
15185
15185
question
android java unicode
文字列をUnicodeに変換できない


**UPDATE:** コードの一部にバグがあったため修正（7/3）

`\u3042`のような記法は、Unicodeエスケープ文字などの呼び方がされます。[Unicode](https://ja.wikipedia.org/wiki/Unicode)とは規格名です。

`"あ"`という文字から、`3042`という文字コードを得るのは`charAt()`で取得した文字コードを16進数化すればいいので、

[code]

    public void onClick(View v){
        this.unicodeText = (EditText) findViewById(R.id.unicode);
        String input = text.getText().toString();
        StringBuilder result = new StringBuilder();
        for(int i=0; i<input.length(); i++) {
            // 元版は0x1000以下の文字コードを正しくUTF-16化していなかったので修正
            builder.append("\\u" + Integer.toHexString(text.charAt(i) | 0x10000).substring(1));
        }
        this.unicodeText.setText(result.toString());       
    }
    
[/code]

このようなコードになります。

サロゲートペアを考慮しなければならない場合にはもう少し複雑なコードになります。

### 参考

  * [Java 言語による Unicode サロゲート・プログラミング](https://www.ibm.com/developerworks/jp/java/library/j-unicode/)


CC BY-SA 3.0
2016-05-22T08:03:12.753
25078
2016-07-03T02:32:02.347
2016-07-03T02:32:02.347
5337
5337
25075
answer


このような方法もあるみたいです。

[code]

    String input = "あ"; //ここは何でも良い
    StringBuilder result = new StringBuilder();
        for(int i = 0; i < input.length(); i++) {
            result.append("\\u").append(String.format("%04x", (int) input.charAt(i)));
        }
    String unicode = result.toString(); //unicodeの値は'\\u3042'
    
[/code]

## 理由

16進数を4桁にして0x1000より小さいコードをサポートするため。


CC BY-SA 3.0
2016-07-03T00:23:51.760
27284
2016-07-03T04:58:03.660
2016-07-03T04:58:03.660
15185
15185
25075
answer