JavaA2Z

KAB-studio > プログラミング > JavaA2Z > CP932とは

CP932

日本語 符号頁932
英語 code page 932
ふりがな シーピーキューサンニ
フリガナ しーぴーきゅーさんに

解説

Windowsでの正しい文字コード
Windows文字コードは、一般的には「シフトJIS」だが、正しくは「CP932」である。
MS932」とも言う。
 
CP932は、シフトJISを拡張したものである。
ただし、基本的には文字コードとしての違いはない。各文字の「整数値としての値」が異なることはない。
 
違いが現れるのは、他の文字コードへと変換する場合である。
他の文字コードへと変換する場合、「~」「-」といった一部の文字が、異なる整数値へと変換される。
たとえばUnicodeへと変換する場合、以下のように変換される。
 
「~」
シフトJIS0x81,0x60→Unicode0x301C
・CP932:0x81,0x60→Unicode0xFF5E
 
「-」
シフトJIS0x81,0x7C→Unicode0x2212
・CP932:0x81,0x7C→Unicode0xFF0D
 
このように、元は同じ文字である「~」「-」が、その文字を「シフト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」の名称を使用しておいた方がいいだろう。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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();
        }
    }
}
// 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();
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/20
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。