文字コードの変換について教えてください!

2,998 views
Skip to first unread message

funas...@gmail.com

unread,
Apr 2, 2013, 12:30:57 PM4/2/13
to android-g...@googlegroups.com
現在、文字コードの変換で苦戦しています。
webから文字取得して
画面に表示しようと考えていますが、
文字コードがSJISのため、文字化けしてしまいます。
この対策について、以下の方法を検討しましたが、うまくいきません。
初歩的なことで大変申し訳ありませんが、ご存じの方、よろしくお願いします。
 
String string = "SJIS文字列";
String new_string = new String( string.getBytes("iso-8859-1"), "UTF-8");
textview.settext(string);

Hirokazu Fukami

unread,
Apr 2, 2013, 12:33:55 PM4/2/13
to android-g...@googlegroups.com
こんばんはfkmです。

webからバイト列はどのように取得していますか?

2013/4/3 <funas...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

funas...@gmail.com

unread,
Apr 2, 2013, 12:58:59 PM4/2/13
to android-g...@googlegroups.com
すいません、説明不足でした。
作ろうとしているのは音楽タグの表示です。
音楽のタイトルからweb検索をして画像を探すことを考えています。
その際に、タグ情報から取得したタイトルが文字化けしていて
表示できないといったものです。
 
タグ情報はMyID3()を使って、以下の手法で取得しています。
 
  try {
            src_set = new MyID3().read(src);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } // read metadata
        if (src_set == null) // perhaps no metadata
        {
            Log.i("NULL", "NULL");
        }
        else
        {
        try{
        IMusicMetadata metadata = src_set.getSimplified();
        artist = metadata.getArtist();

Hirokazu Fukami

unread,
Apr 2, 2013, 1:21:31 PM4/2/13
to android-g...@googlegroups.com
こんばんはfkmです。

MyID3のソースがぐぐったら出てきたので読んでみました。
public static final String DEFAULT_CHAR_ENCODING = "ISO-8859-1";
で決めうちでStringに戻しているみたいなので、別のライブラリで読み込まないといけないきがします。。。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

funas...@gmail.com

unread,
Apr 2, 2013, 6:34:34 PM4/2/13
to android-g...@googlegroups.com
ありがとうございます!

DEFAULT_CHAR_ENCODING = "ISO-8859-1";
とあったので


String new_string = new String( string.getBytes("iso-8859-1"), "UTF-8");

"iso-8859-1"でバイト型文字列に戻して、
UTF-8に戻すように考えていました。

基本的に私の理解不足のようです。
もしよろしければ、何故ダメか教えていただけないでしょうか?
(参考になるサイトなどで結構です。)

よろしくお願いします!

Misaki Shibata

unread,
Apr 2, 2013, 8:24:45 PM4/2/13
to android-g...@googlegroups.com
 横から失礼します。
これはms932とかWindows31jの話ですか?
以前サーバーサイドjavaやったとき???だったもので、


2013年4月3日水曜日 funas...@gmail.com:

sos_jp

unread,
Apr 3, 2013, 12:08:57 AM4/3/13
to android-g...@googlegroups.com
はじめまして、大坪と申します。

> String string = "SJIS文字列";
> String new_string = new String( string.getBytes("iso-8859-1"), "UTF-8");

元のstringには、JISのバイト列をISO-8859-1と解釈してUTF-16に変換した
unicodeの文字列が入っているんじゃないでしょうか。

> string.getBytes("iso-8859-1")

それを元のISO 8859-1の文字コードセットのバイト列に戻す操作がこれ。

> String new_string = new String( string.getBytes("iso-8859-1"), "Windows-31J");

そして、文字エンコーディングを指定するタイプのStringのコンストラクタで、
バイト列の本来の文字エンコーディングを指定してやればいけるんじゃないかと。

ちなみに、ISO 8859-1は、C0,GR,C1,GLと 0x00-0xffまで全てを使用する
文字コードセットなので、JavaのCharConverterを通しても1byteも
変換不可能な文字(?)に置換されることなくバイトへの変換ができる
地獄に仏のようなもの。

あと、元のstringがSJISということですが、JIS X 0208なシフトJISと
MicroSoftの独自拡張であるCP932(IANAではWindows-31J)のどちらなのかによって
〜とかが再変換時に化ける問題もあります。
通常 シフトJISといえばWindows-31Jなのですが、Javaの世界でSJISと言えば
JIS X 0208なのでちょっと混乱が生じます。基本的にWindows-31Jを利用して
おけば問題ないと思います。

fullwidth tilde(u+ff5e)とwave dash(u+301c) java 等で検索すれば
ゴロゴロとヒットします。






2013年4月3日 7:34 <funas...@gmail.com>:

funas...@gmail.com

unread,
Apr 3, 2013, 10:03:52 AM4/3/13
to android-g...@googlegroups.com
ありがとうございます。
 
ということは、バイト列を間違ってUTF-8に変換したため、
もう一度、バイト列戻してから
正しい文字エンコーディングで変換し直すということでいいのでしょうか?
 
また、クライアントからは
SJISではなく、GBKである旨を本日聞きました。。。
その場合もstring.getBytes("iso-8859-1")を使って戻してやればいいのでしょうか?
 
よろしくお願いします。

Shinji Otsubo

unread,
Apr 3, 2013, 10:36:19 AM4/3/13
to android-g...@googlegroups.com
大坪です。

はい、元のバイト列をMyID3がISO-8859-1として決めうちでString(Unicode)にしちゃってるから、
元のバイト列に戻して、再度正しい文字エンコーディングでStringにしてやる

ということになります。
(余談ですが、Stringの内部表現はUTF-16で、UTF-8ではありません)

string.getBytes("iso-8859-1")でとにかく元のバイト列に戻し、
GBKの適切な文字エンコーディングで再度unicodeに直してあげてください。
GBKにもいくつか種類があったような記憶がありますので、どれが適切なのかはクライアントさんに
確認したほうがよいかもしれません。


2013年4月3日 23:03 <funas...@gmail.com>:
 
よろしくお願いします。

--

funas...@gmail.com

unread,
Apr 3, 2013, 12:23:53 PM4/3/13
to android-g...@googlegroups.com, shi...@ird.co.jp
ありがとうございます!!
 
おかげさまで、なんとか修正することができました。
 
助かりました。
本当にありがとうございます!
Reply all
Reply to author
Forward
0 new messages