- PR -

文字化けについて

投稿者投稿内容
kirito
常連さん
会議室デビュー日: 2004/03/19
投稿数: 24
投稿日時: 2004-04-16 14:19
'−'の文字が'?'に化けていたのでそれを修正するロジックを考えたのですが
うまく動きませんなぜでしょうか?

String text = ""; //文字化け対策
char moji;
for(int i=0; i<str1.length(); i++){
moji=str1.charAt(i);
if(moji=='?'){
text = text + "−";
}else{
text = text + moji;
}
}

str1が化けている文字列です
環境はlinux+tomcatです

[ メッセージ編集済み 編集者: kirito 編集日時 2004-04-16 14:29 ]
悶吉
会議室デビュー日: 2004/03/30
投稿数: 14
投稿日時: 2004-04-16 14:34
1:文字コードの存在はご存知ですよね?
2:googleなどで、"java 文字化け"と検索してみましたか?

#多分、クライアントにWindowsを使っていると予想しますが
kirito
常連さん
会議室デビュー日: 2004/03/19
投稿数: 24
投稿日時: 2004-04-16 14:55
'−'がUnicode EUC変換で失敗しているということはわかっています
おそらく moji == '?' ではなくUnicodeにおける文字コードを指定すれば
よさそうだということは分かります
でも実際どういうコードを書けばよいかは全然わかりません
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-16 15:01
引用:

kiritoさんの書き込み (2004-04-16 14:55) より:
'−'がUnicode EUC変換で失敗しているということはわかっています
おそらく moji == '?' ではなくUnicodeにおける文字コードを指定すれば
よさそうだということは分かります
でも実際どういうコードを書けばよいかは全然わかりません


まぁそう言わずに悶吉さんの仰る通りにwebで調べてみてください。2つ目にヒットする
http://www.ingrid.org/java/jserv/i18n/corruptedchar.html
なんかを読めば、kiritoさんが明後日の方向に行ってしまっているのが理解できると思います。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-04-16 15:28
引用:

たーぞうさんの書き込み (2004-04-16 15:01) より:
まぁそう言わずに悶吉さんの仰る通りにwebで調べてみてください。2つ目にヒットする
http://www.ingrid.org/java/jserv/i18n/corruptedchar.html
なんかを読めば、kiritoさんが明後日の方向に行ってしまっているのが理解できると思います。


今回のケースはむしろ一つ目の
http://www.dmz.hitachi-sk.co.jp/Java/Tech/i18n/unicode.html
がビンゴではないでしょうか?

MS932とShift_JISの違いは以下のコードを実行するとよくわかります。
コード:
public static void main(String[] args)
  throws UnsupportedEncodingException {
  String str = "あいう−〜¬";
  System.out.println(str);
  System.out.println(new String(str.getBytes()));
  System.out.println(new String(str.getBytes("MS932"),"MS932"));
  System.out.println(new String(str.getBytes("windows-31j"),"windows-31j"));
  System.out.println(new String(str.getBytes("SJIS"),"SJIS"));
  System.out.println(new String(str.getBytes("Shift_JIS"),"Shift_JIS"));
  
  System.out.println(System.getProperty("file.encoding"));
}

BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2004-04-16 15:29
こんにちは。

仕事の納期に追われているので手短に。

・「?」に化けているのではありません。出力の結果が「?」になっているだけです
・化けている(と思われる)文字のcharと「?」をデバッグ出力してみましょう

コード:

//こんな感じで。debugはどこかに出してやってください。
//多分、一度も一致していないですよね?
StringBuffer debug = new StringBuffer();
debug.append(" ? : " + Integer.toHexString('?') + "<br>");
String text = ""; //文字化け対策
char moji;
for(int i=0; i<str1.length(); i++){
moji=str1.charAt(i);
debug.append("moji: " + Integer.toHexString(moji) + "<br>");
if(moji=='?'){
text = text + "−";
}else{
text = text + moji;
}
}



引用:

でも実際どういうコードを書けばよいかは全然わかりません



そうですか。

コード:

text = text.replace('\u2212', '−');



で、とりあえずこの文字の表示に関してだけは対応できます。
他の問題に関しては、他の方のアドバイスを参考にしてみると良いと思います。


[ メッセージ編集済み 編集者: BBC 編集日時 2004-04-16 15:39 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-16 16:21
私の場合、一度全て URLEncode, URLDecode してから表示するようにしてますが、
どうしても OS が採用してる文字コードセットでカバーしてる範囲外の表示不可能な
コードは 0x3F に強制変換されてしまうようで。

http://43.233.98.50:81/cobra/public_html/java/dencoder3.java

アプレットにしてブラウザ上に舞台を移しても、エンコード時の16進がデコード時の文字コード
セットのマトリックス範囲外だと、表示しようがないみたいです。

http://43.233.98.50:81/cobra/public_html/java/encode.html
http://43.233.98.50:81/cobra/public_html/java/encoder.java

java で nkf や kcc の機能を実装するのは無理なんでしょうか。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-16 18:23
Linux のターミナル上で

$ echo 屁 | nkf -j | jhd
00000000 1B 24 42 55 7B 1B 28 42 0A .$BU{.(B.

自分が作ったプログラムで

$ java dencoder3 3 0 屁
%1B%24%42%55%7B

(後、意味不明の文字化け)

どちらも、「屁」という漢字を一旦 JIS コード化したものを、16進で出す共通部分があるが、
何故か自作の Java では nkf + jhd で出したものに含まれる後半3バイト分がどこかへ
飛んでしまっている。しかし、デコードは成功しているようだ。

一体、これはどういう訳なんでしょうか?

スキルアップ/キャリアアップ(JOB@IT)