シフトJIS
日本語 | 横移動ジス |
英語 | shift jis |
ふりがな | しふとじす |
フリガナ | シフトジス |
Windowsの文字コード。
Windows系のテキストファイルで使用される文字コード。「SJIS」とも言われる。
ただし、後述するがこれは正しくなく、正確には「CP932」が正しい文字コードである。
しかし、一般的には「Windowsの文字コード」は「シフトJIS」ということになっている。
日本語用文字コード。
1バイトもしくは2バイトを使用して1文字を表現する。
半角英数字はASCIIをそのまま使用し、この場合は1バイトである。
ASCIIの拡張部分、つまり0x80~8xFFまでには、半角カタカナや記号が含まれており、これも1バイトである。
ひらがな、カタカナ、漢字は1バイト2つを使用する。
2つのうち、1バイト目を「リードバイト」、2バイト目を「トレイルバイト」と呼ぶ。
リードバイトは0x81~0x9F及び0xE0~0xFC、トレイルバイトは0x40~0x7E及び0x80~0xFCの範囲の値となっている。ただし、トレイルバイトはリードバイト及びASCIIと重複するため注意が必要。
恐らく日本で一番使われている文字コード。
日本に存在する「日本語のテキストファイル」の過半数がシフトJISで書かれていると思われる。
それだけメジャーな文字コードだが、問題も多い。
ASCIIとトレイルバイトの範囲が重なっており、特に、Windowsでのパスの区切り文字に使用されている「\」の文字コード0x5Cがトレイルバイトの中に含まれているため、特別な処理をしないとファイルパスの分割に失敗する。
ASCIIの拡張部分に半角カタカナが使用されているが、過去には半角カタカナは普通に使用されていたため、過去のテキストファイルの扱いに困ることが多い。実際には問題になることは少ないが、全体の傾向として使用しない方向にある。
後述する「正しい文字コード」の問題もある。
1文字のバイト数がそれぞれ異なり、リードバイトやトレイルバイトの判別が難しいこともあり、直接操作はするのは難しいため、プログラムで処理する場合にはStringクラスに格納してから行うのがいいだろう。
シフトJISのIANAでの登録名は"Shift_JIS"であり、Stringクラスのコンストラクタで渡す場合やgetBytes()メソッドに渡す場合には"Shift_JIS"を使用する。
「JIS」と名前が付いているが、JIS規格には含まれておらず、文字コードとしての「JIS」とも体系が大きく違うため、別物と考えておいた方がいいだろう。
Windowsの正しい文字コードは、「シフトJIS」ではなく「CP932」である。
「シフトJIS」と「CP932」では、文字の「変換表」が一部異なる。「~」や「-」といった一部の文字をUnicodeに変換した場合、異なる文字コードへと変換される。
そのため、Javaのプログラム上で使用する場合、シフトJISではなくCP932を指定することを強く勧める。
ただし、ライブラリの中で固定で使用されている場合もあり、その場合には「~」や「-」といった文字を「一時的に他の文字に置き換える」といった処理が必要な場合もあるため注意。
Windows系のテキストファイルで使用される文字コード。「SJIS」とも言われる。
ただし、後述するがこれは正しくなく、正確には「CP932」が正しい文字コードである。
しかし、一般的には「Windowsの文字コード」は「シフトJIS」ということになっている。
日本語用文字コード。
1バイトもしくは2バイトを使用して1文字を表現する。
半角英数字はASCIIをそのまま使用し、この場合は1バイトである。
ASCIIの拡張部分、つまり0x80~8xFFまでには、半角カタカナや記号が含まれており、これも1バイトである。
ひらがな、カタカナ、漢字は1バイト2つを使用する。
2つのうち、1バイト目を「リードバイト」、2バイト目を「トレイルバイト」と呼ぶ。
リードバイトは0x81~0x9F及び0xE0~0xFC、トレイルバイトは0x40~0x7E及び0x80~0xFCの範囲の値となっている。ただし、トレイルバイトはリードバイト及びASCIIと重複するため注意が必要。
恐らく日本で一番使われている文字コード。
日本に存在する「日本語のテキストファイル」の過半数がシフトJISで書かれていると思われる。
それだけメジャーな文字コードだが、問題も多い。
ASCIIとトレイルバイトの範囲が重なっており、特に、Windowsでのパスの区切り文字に使用されている「\」の文字コード0x5Cがトレイルバイトの中に含まれているため、特別な処理をしないとファイルパスの分割に失敗する。
ASCIIの拡張部分に半角カタカナが使用されているが、過去には半角カタカナは普通に使用されていたため、過去のテキストファイルの扱いに困ることが多い。実際には問題になることは少ないが、全体の傾向として使用しない方向にある。
後述する「正しい文字コード」の問題もある。
1文字のバイト数がそれぞれ異なり、リードバイトやトレイルバイトの判別が難しいこともあり、直接操作はするのは難しいため、プログラムで処理する場合にはStringクラスに格納してから行うのがいいだろう。
シフトJISのIANAでの登録名は"Shift_JIS"であり、Stringクラスのコンストラクタで渡す場合やgetBytes()メソッドに渡す場合には"Shift_JIS"を使用する。
「JIS」と名前が付いているが、JIS規格には含まれておらず、文字コードとしての「JIS」とも体系が大きく違うため、別物と考えておいた方がいいだろう。
Windowsの正しい文字コードは、「シフトJIS」ではなく「CP932」である。
「シフトJIS」と「CP932」では、文字の「変換表」が一部異なる。「~」や「-」といった一部の文字をUnicodeに変換した場合、異なる文字コードへと変換される。
そのため、Javaのプログラム上で使用する場合、シフトJISではなくCP932を指定することを強く勧める。
ただし、ライブラリの中で固定で使用されている場合もあり、その場合には「~」や「-」といった文字を「一時的に他の文字に置き換える」といった処理が必要な場合もあるため注意。
参考サイト
// Sample.java
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 文字コード「シフトJIS」(IANAに登録している名前は"Shift_JIS")
// での「あいう」をStringクラスに渡します。
byte[] source = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 };
// 文字コードの変換はStringクラスのコンストラクタで行います。
// 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。
// 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。
// そうするとUnicodeに変換されて格納されます。
String string = new String( source, "Shift_JIS" );
System.out.println( string );
// あいう
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 文字コード「シフトJIS」(IANAに登録している名前は"Shift_JIS")
// での「あいう」をStringクラスに渡します。
byte[] source = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 };
// 文字コードの変換はStringクラスのコンストラクタで行います。
// 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。
// 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。
// そうするとUnicodeに変換されて格納されます。
String string = new String( source, "Shift_JIS" );
System.out.println( string );
// あいう
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
// Sample.java import java.io.UnsupportedEncodingException; // Sample.java public class Sample { public static void main( String[] args ) { try { // 文字コード「シフトJIS」(IANAに登録している名前は"Shift_JIS") // での「あいう」をStringクラスに渡します。 byte[] source = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 }; // 文字コードの変換はStringクラスのコンストラクタで行います。 // 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。 // 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。 // そうするとUnicodeに変換されて格納されます。 String string = new String( source, "Shift_JIS" ); System.out.println( string ); // あいう } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「Shift_JIS」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } } }