JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 文字コードとは

文字コード

日本語 文字表
英語 character code
ふりがな もじこーど
フリガナ モジコード

解説

文字整数値の「変換表」。
文字は、実中の変数内では整数として格納されている。その「どの整数値がどの文字に該当するか」が書かれた表が「文字コード」である。
文字エンコーディング」「文字セット」と呼ばれることもある。ただし、微妙に意味が異なるため、そのまま同じ意味で使用するには注意が必要。
「文字コード」という用語は古くから買われており、比較的広い意味で使われるため、曖昧な部分が多い。そのため、厳密な定義では使用が避けられる傾向にあり、Javaでは実際のところ、あまり使用されない。ただし、一般的にはよく使用されている用語である。
 
Javaでの標準文字コードは「Unicode」という文字コードであり、たとえばこの文字コードでは、「あ」は「0x3042」という整数値である。このふたつの変換表が「Unicode」という文字コードというわけである。
 
文字コードには様々な種類があり、日本語の文字コードも複数存在する。しかも、それらはOSや使用方法によって異なる。たとえばWindowsでは「シフトJIS」、UNIX系の多くでは「EUC」が使用される。またインターネットでは「UTF-8」もよく使用される。
Javaの標準文字コードはUnicodeのため、これら、他の文字コードをStringクラスに格納する場合には変換する必要がある。
文字列byte配列として格納し、これをStringクラスコンストラクタの第1引数に渡し、第2引数には元の文字列の文字コードを渡すことで変換することができる。
また、Stringクラスに格納された文字列Unicode以外の文字コードに変換する場合にはgetBytes()メソッドを使用する。
ただし、ストリームクラスメソッドの中には自動的に文字コードを変換してくれるものもある。またWebブラウザとの入出力時にも、文字コードを指定すれば自動的に変換される。
 
文字コードの変換は、基本的にJavaがサポートしているため、独自に変換するプログラムを組む必要はない。
文字コードの「正式名称」はIANAによって決められており、「CHARACTER SETS」というページに記述されている。たとえば「シフトJIS」であれば"Shift_JIS"という名称となる。
たとえばStringクラスの、コンストラクタgetBytes()メソッドに渡す「文字コードの名称」は、このページから「正式名称」を調べ、その正式名称を指定すればよい。
 
「文字コード」という単語は「文字整数値での値」を指すこともある。
たとえば、「''という文字Unicodeでの文字コードは0x3042である」といった使われ方をすることもある。

参考サイト


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

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

// Sample.java
import java.io.UnsupportedEncodingException;

public class Sample
{
    public static void main( String[] args )
    {
        // char型変数を作り、文字リテラル「あ」を格納します。
        char ch = 'あ';
        System.out.println( ch );
        // あ

        // 内部的には、文字は2バイトサイズの符号なし整数値です。
        // 先ほどの文字を16進数で表示してみます。
        System.out.println( Integer.toHexString( ch ) );
        // 3042

        try
        {
            // この値は、文字コード「Unicode」での、「あ」の値です。
            // UnicodeはJavaの標準文字コードで、Stringクラスで
            // 格納される文字列の文字コードは全てUnicodeです。

            // 他の文字コードからUnicodeに変換する場合、その文字列を
            // byte型の配列として持ち、文字コードを指定してUnicodeに変換します。
            // 例として、文字コード「シフトJIS」での「あいう」を変換します。
            byte[] bytes = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 };
            // 文字コードの変換はStringクラスのコンストラクタで行います。
            // 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。
            // 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。
            // そうするとUnicodeに変換されて格納されます。
            String string = new String( bytes, "Shift_JIS" );
            System.out.println( string );
            // あいう
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのコンストラクタがUnsupportedEncodingException例外を
            // 投げるので拾います。第2引数で渡された文字コード(上記の例では「Shift_JIS」)
            // が、Javaではサポートされていない文字コードの場合にエラーとなります。
            e.printStackTrace();
        }

        try
        {
            // Unicodeで格納されている文字列を、他の文字コードで
            // 取得する場合にはStringクラスのgetBytes()メソッドを
            // 使用します。
            byte[] bytes = "えお".getBytes( "Shift_JIS" );
            System.out.println( Integer.toHexString( bytes[0] ) );
            System.out.println( Integer.toHexString( bytes[1] ) );
            System.out.println( Integer.toHexString( bytes[2] ) );
            System.out.println( Integer.toHexString( bytes[3] ) );
            // ffffff82
            // ffffffa6
            // ffffff82
            // ffffffa8
        }
        catch( UnsupportedEncodingException e )
        {
            // getBytes()メソッドも、第1引数で渡された文字コードが
            // Javaでサポートされていない文字コードの場合には
            // UnsupportedEncodingException例外が投げられます。
            e.printStackTrace();
        }

        // Unicode以外の文字コードに変換する際に「Stringクラスで受け取る」
        // ことができないという点に注意してください。
        // Javaでは、Stringクラスに格納されている文字列の文字コードは
        // Unicodeと決まっています。それ以外はあり得ません。
        // ……あり得ないけど、ブラウザ経由で取得するときとかは
        // そういうことも……。
        // そういう場合には、次のように1文字ずつ16進数表記で出力してみましょう。
        // いわゆる「文字列の16進ダンプ」と呼ばれるものです。
        String string = "あいう";
        char[] chars = string.toCharArray();
        forint iF1 = 0; iF1 < chars.length; ++iF1 )
        {
            System.out.println( Integer.toHexString( chars[iF1] ) );
        }
        // 3042
        // 3044
        // 3046

        try
        {
            // また、Stringクラスの中に別の文字コードが入っている場合に
            // それをbyte型の配列と取得する場合には、getBytes()メソッドの
            // 引数に"ISO-8859-1"を渡して取得します。
            
            // 文字コード「シフト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 = new String( source, "ISO-8859-1" );
            // ここまでの処理は、通常は、Webアプリケーションで画面から入力された
            // 文字列が格納される場合等に行われます。
            // 画面からはシフトJISで渡されているのに、それを変換せずに格納されて
            // しまった、という場合です。

            // 中には、シフトJISの文字コードの文字が直接入っているので、出力すると変になります。
            // いわゆる「文字化け」です。
            System.out.println( string );
            // ???¢??

            // その場合、getBytes()の引数に"ISO-8859-1"を渡すことで、そのまま
            // Unicodeと見なさず、直接byte型の配列として取得できます。
            byte[] bytes = string.getBytes( "ISO-8859-1" );

            // これで、バイト配列として取得できました。
            // もし、その文字コードが分かっている場合には、Stringクラスの
            // コンストラクタの、第2引数に渡すことで正しい文字コードで
            // 格納することができます。
            string = new String( bytes, "Shift_JIS" );
            System.out.println( string );
            // あいう
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのコンストラクタがUnsupportedEncodingException例外を
            // 投げるので拾います。第2引数で渡された文字コード
            // (上記の例では「ISO-8859-1」や「Shift_JIS」)が、Javaではサポート
            // されていない文字コードの場合にエラーとなります。
            e.printStackTrace();
        }
    }
}
// Sample.java
import java.io.UnsupportedEncodingException;

public class Sample
{
    public static void main( String[] args )
    {
        // char型変数を作り、文字リテラル「あ」を格納します。
        char ch = 'あ';
        System.out.println( ch );
        // あ

        // 内部的には、文字は2バイトサイズの符号なし整数値です。
        // 先ほどの文字を16進数で表示してみます。
        System.out.println( Integer.toHexString( ch ) );
        // 3042

        try
        {
            // この値は、文字コード「Unicode」での、「あ」の値です。
            // UnicodeはJavaの標準文字コードで、Stringクラスで
            // 格納される文字列の文字コードは全てUnicodeです。

            // 他の文字コードからUnicodeに変換する場合、その文字列を
            // byte型の配列として持ち、文字コードを指定してUnicodeに変換します。
            // 例として、文字コード「シフトJIS」での「あいう」を変換します。
            byte[] bytes = new byte[] { (byte)0x82, (byte)0xA0, (byte)0x82, (byte)0xA2, (byte)0x82, (byte)0xA4 };
            // 文字コードの変換はStringクラスのコンストラクタで行います。
            // 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。
            // 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。
            // そうするとUnicodeに変換されて格納されます。
            String string = new String( bytes, "Shift_JIS" );
            System.out.println( string );
            // あいう
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのコンストラクタがUnsupportedEncodingException例外を
            // 投げるので拾います。第2引数で渡された文字コード(上記の例では「Shift_JIS」)
            // が、Javaではサポートされていない文字コードの場合にエラーとなります。
            e.printStackTrace();
        }

        try
        {
            // Unicodeで格納されている文字列を、他の文字コードで
            // 取得する場合にはStringクラスのgetBytes()メソッドを
            // 使用します。
            byte[] bytes = "えお".getBytes( "Shift_JIS" );
            System.out.println( Integer.toHexString( bytes[0] ) );
            System.out.println( Integer.toHexString( bytes[1] ) );
            System.out.println( Integer.toHexString( bytes[2] ) );
            System.out.println( Integer.toHexString( bytes[3] ) );
            // ffffff82
            // ffffffa6
            // ffffff82
            // ffffffa8
        }
        catch( UnsupportedEncodingException e )
        {
            // getBytes()メソッドも、第1引数で渡された文字コードが
            // Javaでサポートされていない文字コードの場合には
            // UnsupportedEncodingException例外が投げられます。
            e.printStackTrace();
        }

        // Unicode以外の文字コードに変換する際に「Stringクラスで受け取る」
        // ことができないという点に注意してください。
        // Javaでは、Stringクラスに格納されている文字列の文字コードは
        // Unicodeと決まっています。それ以外はあり得ません。
        // ……あり得ないけど、ブラウザ経由で取得するときとかは
        // そういうことも……。
        // そういう場合には、次のように1文字ずつ16進数表記で出力してみましょう。
        // いわゆる「文字列の16進ダンプ」と呼ばれるものです。
        String string = "あいう";
        char[] chars = string.toCharArray();
        for( int iF1 = 0; iF1 < chars.length; ++iF1 )
        {
            System.out.println( Integer.toHexString( chars[iF1] ) );
        }
        // 3042
        // 3044
        // 3046

        try
        {
            // また、Stringクラスの中に別の文字コードが入っている場合に
            // それをbyte型の配列と取得する場合には、getBytes()メソッドの
            // 引数に"ISO-8859-1"を渡して取得します。
            
            // 文字コード「シフト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 = new String( source, "ISO-8859-1" );
            // ここまでの処理は、通常は、Webアプリケーションで画面から入力された
            // 文字列が格納される場合等に行われます。
            // 画面からはシフトJISで渡されているのに、それを変換せずに格納されて
            // しまった、という場合です。

            // 中には、シフトJISの文字コードの文字が直接入っているので、出力すると変になります。
            // いわゆる「文字化け」です。
            System.out.println( string );
            // ???¢??

            // その場合、getBytes()の引数に"ISO-8859-1"を渡すことで、そのまま
            // Unicodeと見なさず、直接byte型の配列として取得できます。
            byte[] bytes = string.getBytes( "ISO-8859-1" );

            // これで、バイト配列として取得できました。
            // もし、その文字コードが分かっている場合には、Stringクラスの
            // コンストラクタの、第2引数に渡すことで正しい文字コードで
            // 格納することができます。
            string = new String( bytes, "Shift_JIS" );
            System.out.println( string );
            // あいう
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのコンストラクタがUnsupportedEncodingException例外を
            // 投げるので拾います。第2引数で渡された文字コード
            // (上記の例では「ISO-8859-1」や「Shift_JIS」)が、Javaではサポート
            // されていない文字コードの場合にエラーとなります。
            e.printStackTrace();
        }
    }
}

この単語を含むページ

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

「サンプルプログラムとか」に含まれているページ

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