CP932
日本語 | 符号頁932 |
英語 | code page 932 |
ふりがな | シーピーキューサンニ |
フリガナ | しーぴーきゅーさんに |
Windowsでの正しい文字コード。
Windowsの文字コードは、一般的には「シフトJIS」だが、正しくは「CP932」である。
「MS932」とも言う。
CP932は、シフトJISを拡張したものである。
ただし、基本的には文字コードとしての違いはない。各文字の「整数値としての値」が異なることはない。
違いが現れるのは、他の文字コードへと変換する場合である。
他の文字コードへと変換する場合、「~」や「-」といった一部の文字が、異なる整数値へと変換される。
たとえばUnicodeへと変換する場合、以下のように変換される。
■「~」
・シフトJIS:0x81,0x60→Unicode:0x301C
・CP932:0x81,0x60→Unicode:0xFF5E
■「-」
・シフトJIS:0x81,0x7C→Unicode:0x2212
・CP932:0x81,0x7C→Unicode:0xFF0D
このように、元は同じ文字である「~」や「-」が、その文字を「シフトJIS」としてUnicodeに変換するか、「CP932」としてUnicodeに変換するかで、Unicodeに変換後の文字が異なる。
このように、変換結果が変わってしまうため、文字化けの原因となる。
文字化けする文字の「~」から、この問題を「WAVE DASH問題」「FULLWIDTH TILDE問題」「WAVE DASH - FULLWIDTH TILDE問題」とも言う。
文字コードを直接指定できる場合にはCP932を指定すればよいが、指定することができない場合も多く、その場合には「~」や「-」を別の文字に一時的に置き換え、それをあとで元に戻すことで対処することになる。
また、一部の文字は、CP932には存在するが、シフトJISに存在しない。
たとえば「①」(CP932では0x87,0x40、Unicodeでは0x2460。丸に数字の1)等の丸数字は、シフトJISには存在しないため、CP932を使用する必要がある。
IANAでの登録名は"Windows-31J"であり、Stringクラスのコンストラクタで渡す場合やgetBytes()メソッドに渡す場合には"Windows-31J"を使用する。
その他、JSP等での文字コードの指定時にも、シフトJISの"Shift_JIS"ではなく"Windows-31J"の使用を勧める。
このように、プログラム内ではシフトJISではなくCP932を使用することを強く勧めるが、会議やミーティングや日常会話では、「しーぴーきゅーさんにの場合……」と言うとやや疎ましく感じる場合もあるため、特に差し支えなければ一般的な「シフトJIS」の名称を使用しておいた方がいいだろう。
Windowsの文字コードは、一般的には「シフトJIS」だが、正しくは「CP932」である。
「MS932」とも言う。
CP932は、シフトJISを拡張したものである。
ただし、基本的には文字コードとしての違いはない。各文字の「整数値としての値」が異なることはない。
違いが現れるのは、他の文字コードへと変換する場合である。
他の文字コードへと変換する場合、「~」や「-」といった一部の文字が、異なる整数値へと変換される。
たとえばUnicodeへと変換する場合、以下のように変換される。
■「~」
・シフトJIS:0x81,0x60→Unicode:0x301C
・CP932:0x81,0x60→Unicode:0xFF5E
■「-」
・シフトJIS:0x81,0x7C→Unicode:0x2212
・CP932:0x81,0x7C→Unicode:0xFF0D
このように、元は同じ文字である「~」や「-」が、その文字を「シフトJIS」としてUnicodeに変換するか、「CP932」としてUnicodeに変換するかで、Unicodeに変換後の文字が異なる。
このように、変換結果が変わってしまうため、文字化けの原因となる。
文字化けする文字の「~」から、この問題を「WAVE DASH問題」「FULLWIDTH TILDE問題」「WAVE DASH - FULLWIDTH TILDE問題」とも言う。
文字コードを直接指定できる場合にはCP932を指定すればよいが、指定することができない場合も多く、その場合には「~」や「-」を別の文字に一時的に置き換え、それをあとで元に戻すことで対処することになる。
また、一部の文字は、CP932には存在するが、シフトJISに存在しない。
たとえば「①」(CP932では0x87,0x40、Unicodeでは0x2460。丸に数字の1)等の丸数字は、シフトJISには存在しないため、CP932を使用する必要がある。
IANAでの登録名は"Windows-31J"であり、Stringクラスのコンストラクタで渡す場合やgetBytes()メソッドに渡す場合には"Windows-31J"を使用する。
その他、JSP等での文字コードの指定時にも、シフトJISの"Shift_JIS"ではなく"Windows-31J"の使用を勧める。
このように、プログラム内ではシフトJISではなくCP932を使用することを強く勧めるが、会議やミーティングや日常会話では、「しーぴーきゅーさんにの場合……」と言うとやや疎ましく感じる場合もあるため、特に差し支えなければ一般的な「シフトJIS」の名称を使用しておいた方がいいだろう。
参考サイト
// Sample.java
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 文字コード「CP932」(IANAに登録している名前は"Windows-31J")
// での「あいう」を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, "Windows-31J" );
System.out.println( string );
// あいう
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
// シフトJISは、正確には「Windowsの文字コード」ではありません。
// 正確にはCP932です。
try
{
// たとえば、「~」(0x81,0x60)の場合。
byte[] bytes = new byte[] { (byte)0x81, (byte)0x60 };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?
// 301c
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// ~
// ff5e
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
try
{
// 同じく、「-」(0x81,0x7C)の場合。
byte[] bytes = new byte[] { (byte)0x81, (byte)0x7C };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?
// 2212
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// -
// ff0d
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
try
{
// たとえば、「①」(CP932では0x87,0x40、Unicodeでは0x2460。丸に数字の1)の場合。
byte[] bytes = new byte[] { (byte)0x87, (byte)0x40 };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?@
// fffd
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// ①
// 2460
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 文字コード「CP932」(IANAに登録している名前は"Windows-31J")
// での「あいう」を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, "Windows-31J" );
System.out.println( string );
// あいう
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
// シフトJISは、正確には「Windowsの文字コード」ではありません。
// 正確にはCP932です。
try
{
// たとえば、「~」(0x81,0x60)の場合。
byte[] bytes = new byte[] { (byte)0x81, (byte)0x60 };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?
// 301c
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// ~
// ff5e
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
try
{
// 同じく、「-」(0x81,0x7C)の場合。
byte[] bytes = new byte[] { (byte)0x81, (byte)0x7C };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?
// 2212
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// -
// ff0d
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
try
{
// たとえば、「①」(CP932では0x87,0x40、Unicodeでは0x2460。丸に数字の1)の場合。
byte[] bytes = new byte[] { (byte)0x87, (byte)0x40 };
// シフトJISとして変換すると、文字化けしてしまいます。
String shiftJis = new String( bytes, "Shift_JIS" );
System.out.println( shiftJis );
System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) );
// ?@
// fffd
// CP932(IANAに登録している名前は"Windows-31J")なら変換できます。
String windows31J = new String( bytes, "Windows-31J" );
System.out.println( windows31J );
System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) );
// ①
// 2460
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
// Sample.java import java.io.UnsupportedEncodingException; // Sample.java public class Sample { public static void main( String[] args ) { try { // 文字コード「CP932」(IANAに登録している名前は"Windows-31J") // での「あいう」を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, "Windows-31J" ); System.out.println( string ); // あいう } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「Windows-31J」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } // シフトJISは、正確には「Windowsの文字コード」ではありません。 // 正確にはCP932です。 try { // たとえば、「~」(0x81,0x60)の場合。 byte[] bytes = new byte[] { (byte)0x81, (byte)0x60 }; // シフトJISとして変換すると、文字化けしてしまいます。 String shiftJis = new String( bytes, "Shift_JIS" ); System.out.println( shiftJis ); System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) ); // ? // 301c // CP932(IANAに登録している名前は"Windows-31J")なら変換できます。 String windows31J = new String( bytes, "Windows-31J" ); System.out.println( windows31J ); System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) ); // ~ // ff5e } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } try { // 同じく、「-」(0x81,0x7C)の場合。 byte[] bytes = new byte[] { (byte)0x81, (byte)0x7C }; // シフトJISとして変換すると、文字化けしてしまいます。 String shiftJis = new String( bytes, "Shift_JIS" ); System.out.println( shiftJis ); System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) ); // ? // 2212 // CP932(IANAに登録している名前は"Windows-31J")なら変換できます。 String windows31J = new String( bytes, "Windows-31J" ); System.out.println( windows31J ); System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) ); // - // ff0d } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } try { // たとえば、「①」(CP932では0x87,0x40、Unicodeでは0x2460。丸に数字の1)の場合。 byte[] bytes = new byte[] { (byte)0x87, (byte)0x40 }; // シフトJISとして変換すると、文字化けしてしまいます。 String shiftJis = new String( bytes, "Shift_JIS" ); System.out.println( shiftJis ); System.out.println( Integer.toHexString( shiftJis.charAt( 0 ) ) ); // ?@ // fffd // CP932(IANAに登録している名前は"Windows-31J")なら変換できます。 String windows31J = new String( bytes, "Windows-31J" ); System.out.println( windows31J ); System.out.println( Integer.toHexString( windows31J.charAt( 0 ) ) ); // ① // 2460 } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「Shift_JIS」や「Windows-31J」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } } }