propertiesファイルから文字列を読み込む処理を行っているのですが、文字列にカタカナの「ソ」がはいると、「ソ」自体とそれ以降の1文字が文字化けしてしまいます。
これには何か対処方法があるのでしょうか?
こんな感じの処理を行っています。
【propertiesファイルの内容】
path=C:\\MyWork\\ソース\\download
【読み込み処理】
FileInputStream fis = new FileInputStream(propfile);
Properties prop = new Properties();
prop.load(fis);
String sjs_path = getString(prop.getProperty("path");
String uni_path = new String(sjs_path.getBytes("iso-8859-1"), "Shift_JIS");
アドバイスよろしくお願いいたします。
No.7
- 回答日時:
#4です。
なるほど、プロパティーファイルを、シフトJISで書いたんですね。
プロパティーファイルは、Unicode escapesが使用できるようになっていて、
¥マークを特別扱いします。
そのため、¥マークのある文字は正確なバイト配列になりません。
例えば、ファイルに「ソラ」とあったとします。
(シフトJISで 83h 5ch 83h 89h)
これを読んだときに、¥マーク(5ch)があるため、文字列は
83h 83h 89h
になってしまいます。
つまり、質問者さんのコードの
String sjs_path = getString(prop.getProperty("path");
の部分のsjs_pathは¥マークを除去されたものになっています。
従って、正しい変換はできません。
解決策は、
1.Properties#storeで書き込む。
2.手書きするなら、\uXXXXの形式で(Unicodeで記述する)
3.native2ascii ツールを使用する。
のどれかだと思います。
参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
プロパティファイルはお客様が用意されるので、そちらの都合でSJISコードになってしまうんです・・・。
いくつかご提案いただいた対応策を検討中です。
度々のご回答、ありがとうございました。
No.6
- 回答日時:
理由は、ANo.5でお答えになった方の通りです。
対処方法としては、
1.propertiesファイルを予め変換しておく
j2seのsdkに含まれるnative2ascii.exeで予め変換して
おくと、正常に読み込むことが出来ます。
sdkのインストールフォルダのbinフォルダ下にあります。
こうすればエンコーディングの変換は事前に済ませる
ことができます。
2.Jakarta CommonsのExtendedPropertiesを使う
java.util.Propertiesを機能拡張した
org.apache.commons.collections.ExtendedProperties
を使うと、loadの引数にエンコーディング文字列が
使えますので、エンコーディングの変換ソースの
作成がそもそも不要になります。
Jakarta Commonsはオープンソースです。
参考URLに一部の日本語訳サイトを掲示しました。
残念ながら、ExtendedPropertiesは未翻訳の様ですが。
参考URL:http://www.jajakarta.org/
対処方法のご提示、ありがとうございます。
どの方法が一番私が作成する機能にうまく組み込めそうか検討中です。
いろいろな方法を教えていただけて助かりました。
No.5
- 回答日時:
java.util.Properties#load() は、ファイルがISO8859-1エンコーディングで書かれていることを
前提としていますから、多バイト文字を含むファイルを読む時には使えません。
Propertiesを拡張したクラスを作ってload()をオーバーライドし、
java.io.InputStreamReader 等でエンコーディングを指定して読み込めばよいと思います。
ひょっとすると、もっとスマートなやり方もあるかもしれませんが。
> java.util.Properties#load() は、ファイルがISO8859-1エンコーディングで書かれていることを
> 前提としていますから、多バイト文字を含むファイルを読む時には使えません。
このことは初めて知りました・・・。
対応方法は他の方々のご提案も含めいろいろ検討してみます。
ありがとうございました。
No.4
- 回答日時:
>String uni_path = new String(sjs_path.getBytes("iso-8859-1"), "Shift_JIS");
おかしくありませんか?
これだと、
「sjs_pathの内容をiso-8859-1のバイト配列にし、
それを(iso-8859-1のバイト配列)をシフトJISとみなして復号化する」
ことになります。
この回答への補足
以下のコードの説明ですが、
>String uni_path = new String(sjs_path.getBytes("iso-8859-1"), "Shift_JIS");
”sjs_pathをiso-8859_1の文字列としてバイト列に変換して、文字コードをShift_JISと仮定してunicodeへ変換する”という意味だと思うんですが・・・。
http://hp.vector.co.jp/authors/VA017148/java/enc …
を参考にしました。
No.3
- 回答日時:
#2です。
>これは「ソ」以外にも「Ы」「(9)」「噂」「浬」などの
「(9)」はローマ数字「IX」です。
教えてgooが勝手に「IX」を「(9)」に書き替えてくれやがりました(怒)
No.2ベストアンサー
- 回答日時:
「ソ」はシフトJISコードで「835c」ですが、第2バイトの「5c」はエスケープ文字の「\」と同じコードです。
従って「ソ」の次の文字「ー」の第1バイトをエスケープします。つまり「ソ」の第2バイトの「\」が欠落します。
ソース
↓
83 5c 81 5b 83 58
↓
83 \ 81 [ 83 X ←「\ 81」が「81」にエスケープされる
↓
83 81 [ 83 X
↓
メ[ス
これは「ソ」以外にも「Ы」「(9)」「噂」「浬」などの、第2バイトが「\」になる文字で発生します。
読み込むデータをEUCで記述しておくか、中間ファイルにEUCで書き出してから読み込むか、読み込むデータを「C:\\MyWork\\ソ\ース\\download」と書いておくなど、シフトJISコードの第2バイトが「\」になっても構わない書き方をする工夫が必要です。
とてもわかりやすい説明で、私にもよくわかりました。ありがとうございます。
対応方法もいくつか教えていただけたので、検討してみます。
ありがとうございました。
No.1
- 回答日時:
文字「ソ」は、SJISで0x835Cとなり、下位1バイトが5Cすなわち「¥(半角文字)」となります。
Javaはあまり詳しくないので、どうしたらいいかまでアドバイスはできませんが、このへんではないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで「〜」が表現でき...
-
cookie から取り出すと文字化け
-
COBOLで半角カナを全角カナに変換
-
javaで質問です。 文字列2023/2...
-
IBM漢字コード⇒SJIS変換方法
-
byte[] を long,float とかに...
-
javaで「全角が含まれているか...
-
Visual Studio 6.0でビルド可能...
-
CStringをLPCTSTRへ変換
-
文字列の比較
-
数字を読みに変換する方法について
-
BOOL値を逆にしたい
-
Java配列でNullPointerExceptio...
-
java キーボード入力された値の...
-
JAVA EOFの検出 (条件文で「...
-
System.err. printlnとSystem.o...
-
iterateで受け取った値を処理に...
-
EXCEL VBA で、0から?1から?
-
コマンドライン引数の例外処理...
-
Java配列の問題を教えてくださ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
int型のゼロ埋め
-
javascriptで文字列のsjis利用...
-
Visual Basic でのコードをASCI...
-
JavaのStringクラスに「外字」...
-
カタカナをローマジに変換する。
-
C言語32bitから64bitの移行につ...
-
UTF-8とUnicodeの互換性
-
COBOLで半角カナを全角カナに変換
-
文字列の比較
-
byte[] を long,float とかに...
-
全角英数字とハイフンを半角に...
-
byte型のマイナスの扱いについて
-
TEXTAREAからのデータを改行入...
-
javaの初歩的な質問です。
-
エクセルVBAで「〜」が表現でき...
-
DBから取得したデータの文字化け
-
[Javascript]エンターキー押下...
おすすめ情報