人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

javaでの文字化け(WAVE DASH問題)の解決方法

String moji = "ABCあいうえおABC??めほー?ABC";
byte[] jis = moji.getBytes("ISO2022JP");
System.out.println(new String(jis, "ISO2022JP"));

実行結果
ABCあいうえおABC??めほー?ABC

となりますが、?じゃなくてちゃんと?や?にするには、
どうすれば、よいのでしょうか?!

●質問者: daigakuinsei
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ABC byte dash Java JIS
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tanashi
●60ポイント

エンコードをMS932にしてはどうでしょうか?

String moji = "ABCあいうえおABC??めほー?ABC";

byte[] jis = moji.getBytes("MS932");

System.out.println(new String(jis, "MS932"));

◎質問者からの返答

すいません。

言葉足りてませんでした。

ISO2022JPで、とある処理をしたくて、

しかも処理が終わった後に、元のエンコーディングに

戻したいのです・・・


2 ● KUROX
●10ポイント

WAVE DASH を FULLWIDTH TILDE に置換してから処理しては?

質問内容だと、

>String moji = "ABCあいうえおABC??めほー?ABC";

UNICODE

>byte[] jis = moji.getBytes("ISO2022JP");

UNICODE -> ISO2022JP に変換(文字化け)

だと思うので・・・。

--------

http://www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.ht...

> 3つ目は、のUnicodeコードポイントを強制変換するコードを自作する方法だ。

>例えば、Windows-31Jベースのテキスト・ファイルから読み込んだコンテンツを1文字ずつ

>チェックし、U+FF5Eの「?」を見つけたらU+301Cに置き換える、といった具合である。

>コーディングの手間は掛かるが、柔軟性は高いといえるだろう。

最悪は、こういう感じのロジックをいれるしかないかと思います。


3 ● afternoontea
●10ポイント

MS932文字列 -> ISO2022JPバイト配列 -> MS932文字列

ということでしょうか?


以下の2つの方法を使えばできると思います。

(1)CharsetEncoderを使って文字列をバイト配列に変換する

(2)CharsetDecoderを使ってバイト配列を文字列に変換する


Unicodeへのマッピングが異なる文字「?」については個別に置換する必要があります。

//(Windows-31J -> Unicode) -> (ISO-2022-JP -> Unicode)

unicode = unicode.replaceAll("\uff5e", "\u301c"); //?

unicode = unicode.replaceAll("\uff0d", "\u2212"); //?


MS932のファイルを読み込んでISO-2022-JPのバイト配列に変換して

もう一度MS932のファイルに書き出すサンプルを作ってみました。

http://d.hatena.ne.jp/afternoontea/20071229

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ