質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

4回答

1548閲覧

SJISのHTMLファイルをUTF-8に変換したい

yuu9999

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/10/20 21:36

JAVA8にて以下を行いたいです。

・SJISのhtmlファイルをUTF-8に変換

■経緯
SJISのhtmlのファイル自体の文字コードセットを変換するために
手動でサクラエディタなどの「上書き保存」ダイアログで
文字コードを変換しています。
(以下は例です)
イメージ説明

その場合は
・ファイル自体の日本語が文字化けせず
・ブラウザにてcharsetがUTF-8で正常に表示
されます。

これを手動ではなくJAVAで実現したいのですが
・ファイル自体の日本語が文字化け
したり
・ファイルをUTF-8で作成しているのに出力ファイルの文字コードセットがSJISになってしまう

という現象が起きており、なかなかうまくいきません。

例えば以下のコードだと
・ファイル自体の日本語が文字化け
・ファイル自体の文字コードセットがSJIS
になってしまいます。

どうしたら
・ファイル自体が文字化けせず日本語が表示される
・ファイル自体の文字コードセットがUTF-8
に出来るのでしょうか。

public

1 2 3 // 改行コード定義 4 String zero_a = "\n"; 5 6 7 final String FROM = "SJIS"; 8 FileInputStream fis=new FileInputStream("C:\test\html\sample.html"); 9 InputStreamReader isr=new InputStreamReader(fis,"SJIS"); 10 BufferedReader br=new BufferedReader(isr); 11 12 13 14 // FileOutputStreamで文字コード・改行コードを指定(UTF-8,\n) 15 PrintWriter pw2 = new PrintWriter( 16 new BufferedWriter( 17 new OutputStreamWriter( 18 new FileOutputStream 19 ("C:\test\html\henkan.txt"),"UTF-8"))); 20 21 String line; 22 String str; 23 while((line =br.readLine()) != null) { 24 byte[] b = line.getBytes(); 25 //文字コードをUTF-8に変換する 26 str = new String(b, "UTF-8"); 27 System.out.println(str); 28 pw2.print(str+zero_a); 29 //bw.newLine(); 30 } 31 br.close(); 32 //bw.close(); 33 34 35 36 pw2.close(); 37 38 } 39コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

質問者さんご提示のコードではBufferedReaderPrintWriterを併用していて、悪いわけではないのですが少々ヤヤコシイことになっています。ファイルを取り扱うJavaのサンプルコードではBufferedReaderなどを使った例が多くみられますが、これは読み書きするファイルのデータをバッファリングすることで効率よく処理をするためです。しかしそれは文字コード変換だけで考えると必ずしも必要なわけではありません。

単純にただ「シフトJISエンコードのファイルを入力として、UTF-8エンコードのファイルを出力する」だけであれば、以下のコードで実現できます。
シフトJISエンコードのsjisin.txt ファイルをUTF-8エンコードのutf8out.txt ファイルとして出力します。

Java

1public static void f1() 2 throws Exception 3{ 4 String source = "sjisin.txt"; 5 FileInputStream fis= new FileInputStream(source); 6 // 入力ファイルのエンコーディングをシフトJISとして扱う。 7 InputStreamReader isr = new InputStreamReader(fis, "SJIS"); 8 9 String dest = "utf8out.txt"; 10 // 出力ファイルのエンコーディングをUTF-8として扱う。 11 FileOutputStream fos = new FileOutputStream(dest); 12 OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); 13 14 int cc; 15 while ((cc = isr.read()) != -1) { 16 // read()したJavaの1文字を、UTF-8のOutputStreamで出力する。 17 osw.write(cc); 18 } 19 isr.close(); 20 osw.close(); 21} 22

今どきであればtry-with-resourceを使って以下のようなかんじでしょうか。

Java

1public static void f2() 2 throws Exception 3{ 4 String source = "sjisin.txt"; 5 String dest = "utf8out2.txt"; 6 try (InputStreamReader isr = new InputStreamReader(new FileInputStream(source), "SJIS") 7 ; OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(dest), "UTF-8")) { 8 9 int cc; 10 while ((cc = isr.read()) != -1) { 11 osw.write(cc); 12 } 13 } 14}

尚、例外(Exception)はあえてthrows Exceptionで呼び出し側に任せているのと、CRLFの改行コードを変換するなどはしていないのでご注意ください。

このような方法もある、ということでの参考までの回答です。

投稿2021/10/21 00:31

編集2021/10/21 00:35
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/21 00:42

たくさんのファイルをサクラエディタで手動で文字コード変換するのが面倒くさくて大変、というところからの質問だと思いますが、「nkf」という有名で実績のある便利なコマンドがあるので、そういったものを使えるようにしておくのもよいです
yuu9999

2021/10/21 04:06

ありがとうございます!
guest

0

入力のストリームは SJIS、出力のストリームは UTF-8 とちゃんと指定してありますので、それ以外の変換は不要です。

java

1 pw2.print(line + zero_a);

だけでよく、変数 b str は消してください。

投稿2021/10/20 23:28

int32_t

総合スコア20914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu9999

2021/10/21 04:06

ありがとうございます!
guest

0

皆様ありがとうございます。
実は、変換自体はうまくできていて
サクラエディタがSJISに間違って認識していました。
ファイル⇒開きなおす⇒UTF8で開きなおすで文字化けせずに表示できました。

投稿2021/10/21 04:08

yuu9999

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Javaには詳しくないのですが、new String()の2つ目の引数に"UTF-8"ではなく"SJIS"を指定すればよいのではないでしょうか。

Java - Shift-JISからUTF-8への変換方法 | teratail

上記の質問の回答を参考にしました。

java

1//文字コードをUTF-8に変換する 2str = new String(b, "SJIS");

ご参考まで。

投稿2021/10/20 22:02

fj68

総合スコア752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu9999

2021/10/21 04:06

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問