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.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.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.1
- 回答日時:
文字「ソ」は、SJISで0x835Cとなり、下位1バイトが5Cすなわち「¥(半角文字)」となります。
Javaはあまり詳しくないので、どうしたらいいかまでアドバイスはできませんが、このへんではないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- PDF acrobatでwordファイルをpdfに変換すると文字化けする 3 2023/02/10 09:31
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
substring バイト単位でやりたい
-
Path型をString型へ変換する(Java)
-
javaでのOracleのデータ登録の...
-
文字列の比較
-
JavaのStringクラスに「外字」...
-
javaで「全角が含まれているか...
-
下記問題の答えが"D"になる意味...
-
javaの初歩的な質問です。
-
世界測地から日本測地への変換...
-
javascriptで文字列のsjis利用...
-
文字コード変換
-
replace関数で複数の文字の変換...
-
C言語32bitから64bitの移行につ...
-
カタカナをローマジに変換する。
-
Windows-31Jからutf-8への変換...
-
全角英数字とハイフンを半角に...
-
COBOLで半角カナを全角カナに変換
-
int型のゼロ埋め
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
int型のゼロ埋め
-
javascriptで文字列のsjis利用...
-
byte[] を long,float とかに...
-
C言語32bitから64bitの移行につ...
-
JavaのStringクラスに「外字」...
-
javaの初歩的な質問です。
-
Visual Basic でのコードをASCI...
-
UTF-8とUnicodeの互換性
-
文字列の比較
-
[Javascript]エンターキー押下...
-
下記問題の答えが"D"になる意味...
-
エクセルVBAで「〜」が表現でき...
-
byte配列をImageに変換する
-
javaで「全角が含まれているか...
-
IBM漢字コード⇒SJIS変換方法
-
Windows-31Jからutf-8への変換...
おすすめ情報