検索

キーワード


【Java】文字コードの変換

  • 公開日:2020-11-30 23:57:34
  • 最終更新日:2020-12-02 18:55:56
【Java】文字コードの変換

当記事では、文字コードについて解説を行います。文字コードの扱いを間違えると、出力されたテキストデータが文字化けして読めない、なんていうことも起こります。

文字コードという用語の意味から、Java上でテキストファイルの文字コードを変換しする方法をJava Gold SE 11の資格を持つ著者が説明したいと思います。


文字コードとは?

文字コードとは、コンピュータ上で文字を扱うための仕組みのことで、符号化文字集合(Coded Character Set)と文字符号化形式(Character Encoding Scheme)という二つの枠組みから成り立ちます。文字符号化形式は、エンコーディング形式とも呼ばれます。

符号化文字集合は、特定の決まりで一つの文字に一意の(重複しない)数字を割り当てたものの集まりで、文字符号化形式は文字を表す数字をコンピュータが実際に利用できるようにする仕組みのことです。


主な符号化文字集合の一覧

符号化文字集合の名称特徴「あ」の表現
ASCII最も基本的な文字集合で、1バイトで英数字と記号を表現します。日本語には未対応
Unicodeアルファベット、漢字、仮名の他に、アラビア文字やハングルなど、世界中の文字を4バイトで表現できる文字セットです。世界基準の文字コードで、どのOSでも使えるのが特徴です。絵文字も表現することが出来ます。U+3042
JIS日本語の漢字と仮名を2バイトで表現する文字集合です。日本においては、メールやウェブサイトなどで広く使われています。

どの文字符号化形式でも1文字が必ず2バイトになるという特徴を持ちます。

0x2422


主な文字符号化形式の一覧

以下に挙げる文字符号化形式は、基本的にASCIIも扱うことが出来ます。

文字符号化形式の名称扱う符号化文字集合特徴「あ」の表現(URLエンコードでの例)
UTF-8Unicode1文字を1~4バイトの可変長のバイト情報で表す文字符号化形式です。日本語の文字のほとんどは3バイトで表現されます。
Javaでは、内部的にこの文字符号化形式を採用しています。
%E3%81%82
UTF-16Unicode日本語で使われる文字の大半を含む、よく使われる文字を2バイト、マイナーな文字を4バイトで表現する文字符号化形式です。
直列化方式として、リトルエンディアン型とビッグエンディアン型の2種類があります。
%42%30(リトルエンディアン型)
%30%42(ビッグエンディアン型)
ISO-2022-JPJIS「JISコード」とも呼ばれ、電子メールなどで利用される文字符号化形式です。%1B%24%42%24%22%1B%28%42
Shift-JIS
JISWindows上で日本語の文字を扱うための文字符号化方式です。「外字領域」という未使用の領域があり、マイクロソフトなどのベンダーによって独自の文字が割り当てられています。%82%A0
EUC-JP
JISUnix上で日本語の文字を扱うための文字符号化方式です。%A4%A2


Javaにおけるデフォルトの文字コードの確認

デフォルトの文字コードを確認するサンプルコード

システムプロパティを取得するSystem.getPropertyメソッドに、"file.encoding"という文字列を渡すことで、システムプロパティに設定されているデフォルトの文字コードを確認できます。

public class CheckDefaultCharacterEncoding {
	public static void main(String[] args) {
		System.out.println(System.getProperty("file.encoding"));
	}
}


デフォルトの文字コードを確認するサンプルコードの実行結果

UTF-8

Java上でデフォルトになっているエンコーディング形式を表す文字列がコンソールに出力されます。


文字コードの変換

文字コードを指定して、テキストファイルの読み込みと出力を行う方法について解説します。

テキストファイルの読み込みと出力についての詳しい説明は、以下の記事を参照してください。

【Java】テキストファイルの入出力


テキストファイルの文字コードを変換するサンプルコード

まず、以下の内容のテキストファイルを、メモ帳などのワードエディタを使って"UTF-8.txt"という名前で保存して用意します。

こんにちは

以下に示すコードが、文字コードを変換するサンプルコードになります。このサンプルコードでは、UTF-8をShift-JISに変換します。

try-with-resouceが入れ子構造になっていて見づらいかもしれませんが、外側から、

BufferedReader/BufferedWriter

InputStreamReader/OutputStreamWriter

FileInputStream/FileOutputStream

という構造になっています。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class TranslateCharacterEncoding {
	public static void main(String[] args) {
		//InputStreamReader/OutputStreamReaderの第二引数に文字コードを指定することで、
		//文字コードを指定した、読み込み/出力を行います。
		try (BufferedReader br = new BufferedReader(
				new java.io.InputStreamReader(new FileInputStream(".\\UTF-8.txt"), "UTF-8"));
				BufferedWriter bw = new BufferedWriter(
						new OutputStreamWriter(new FileOutputStream(".\\SJIS.txt"), "SJIS"))) {
			String s = "";
			while ((s = br.readLine()) != null) {
				bw.write(s);
				bw.newLine();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


テキストファイルの文字コードを変換するサンプルコードの実行結果

文字コード「Shift-JIS」を使って記述されたテキストファイル「SJIS.txt」が出力されます。

これをそのままメモ帳などのワードエディタで開いてみると、以下のように文字化けすることがあります。

����ɂ���


文字化けへの対処法

文字化けしたテキストファイルの中身を読む手軽な方法として、ブラウザでテキストファイルを開くという方法があります。例えば、「SJIS.txt」をブラウザにドラッグ&ドロップするなどして開くと、自動的にエンコーディングを検出して読めるようになります。

こんにちは

また、サクラエディタなどのフリーのテキストエディタには、文字コードを変換して表示する機能を持つものがあります。

テキストファイルに使われている文字コードを検出する方法としては、juniversalcharsetという外部ライブラリを使う方法があります。これについては、導入方法を含めた記事を書く予定です。


まとめ

今回は文字コードについての概要と、Javaにおける文字コードの変換方法について解説しました。最近のWebサイトでは文字化けが起きることは減りましたが、日本語で記述されたテキストファイルを出力する際は文字コードに気を付けるようにするとよいでしょう。


関連記事:

【Java】入出力ストリーム(java.ioパッケージ)

【Java】テキストファイルの入出力


【著者】

ゆうさい

フォワードソフト株式会社のエンジニア。経験はまだ浅いものの、Java、Python、JavaScriptなど様々な言語の他、クラウドやネットワーク技術を勉強しています。PythonやVBAを使った自動化で楽をするのを考えるのが好きです。 Oracle Certified Java Programmer Gold SE 11、HTML5プロフェッショナル認定試験レベル2、AWSプラクティショナーなどの情報資格を保有しています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様