Unicode
日本語 | 単一文字コード |
英語 | unicode |
ふりがな | ゆにこーど |
フリガナ | ユニコード |
Javaの標準文字コード。
あらゆる国のあらゆる文字を表現することができる。
1文字が2バイトの整数値で表現され、char型変数で格納することができる。また文字列はStringクラスに格納することができる。
Javaプログラムにおいて文字列と言えば必ずUnicodeであり、char型変数に格納する文字やStringクラスに格納する文字列は、必ずUnicodeである必要がある。もしファイルやインターネット経由で別の文字コードの文字列を取得した場合には、その文字列をbyte型の配列として受け取り、それをUnicodeに変換してStringクラスに格納することになる。
Unicodeは2バイトの符号なし整数値で表現されるため、全部で65536文字しか表現できない。
その関係もあり、似た文字をひとつの文字で表現していたり、他の文字コードとの変換時に整合性が取れない等の問題もある。
しかし、他の文字コードと異なり、必ず1文字がchar型変数1文字に格納されるため、Shift JISのように複数の文字で1文字とみなす必要がないといったメリットもある。
現在のUnicodeは、他の文字コードに比べプログラムでの処理がしやすいという点で比較的ベターではあるが、いくつかの問題によりベストとは言えない面もある。しかし、Javaの標準文字コードである以上避けようがないため、上手に付き合う必要があるだろう。
以上の「標準文字コード」というのは、実行中に変数に格納される文字コードの話である。
よって、ソースファイルの文字コードとは全く関係ないことに注意。ソースファイルの文字コードはコンパイラが対応している文字コードであればどの文字コードで記述しても構わず、コンパイル時にその文字コードを指定すればよい。
ソースファイルの文字コードで表現できない文字だが、Unicodeでは表現できる文字を文字リテラル及び文字列リテラルで使用したい場合には、エスケープシーケンス「\uXXXX」という形式で「XXXX」にその文字に該当する16進整数値を記述すればよい。
ただし、出力時の環境、特にフォントがその文字を持っていなければ当然表示はできないため注意が必要。
「Unicode」という名称にはJavaで使用されているものの他に「UTF-8」「UTF-16」といったものも存在するが、これらは別の文字コードであり、体系的には全く関連性はない。
「Unicode」とは「様々な言語の文字を表現できる文字コード」という意味で一般的に使用されている用語であり、特定の文字コードを指さない場合があり、その場合には、Unicodeは広い意味で使用され、「UTF-8」等も含むことになる。
Javaで使用するUnicodeは、正確には「UCS-2」と呼ぶ。IANAで登録されている名称は"ISO-10646-UCS-2"である。
あらゆる国のあらゆる文字を表現することができる。
1文字が2バイトの整数値で表現され、char型変数で格納することができる。また文字列はStringクラスに格納することができる。
Javaプログラムにおいて文字列と言えば必ずUnicodeであり、char型変数に格納する文字やStringクラスに格納する文字列は、必ずUnicodeである必要がある。もしファイルやインターネット経由で別の文字コードの文字列を取得した場合には、その文字列をbyte型の配列として受け取り、それをUnicodeに変換してStringクラスに格納することになる。
Unicodeは2バイトの符号なし整数値で表現されるため、全部で65536文字しか表現できない。
その関係もあり、似た文字をひとつの文字で表現していたり、他の文字コードとの変換時に整合性が取れない等の問題もある。
しかし、他の文字コードと異なり、必ず1文字がchar型変数1文字に格納されるため、Shift JISのように複数の文字で1文字とみなす必要がないといったメリットもある。
現在のUnicodeは、他の文字コードに比べプログラムでの処理がしやすいという点で比較的ベターではあるが、いくつかの問題によりベストとは言えない面もある。しかし、Javaの標準文字コードである以上避けようがないため、上手に付き合う必要があるだろう。
以上の「標準文字コード」というのは、実行中に変数に格納される文字コードの話である。
よって、ソースファイルの文字コードとは全く関係ないことに注意。ソースファイルの文字コードはコンパイラが対応している文字コードであればどの文字コードで記述しても構わず、コンパイル時にその文字コードを指定すればよい。
ソースファイルの文字コードで表現できない文字だが、Unicodeでは表現できる文字を文字リテラル及び文字列リテラルで使用したい場合には、エスケープシーケンス「\uXXXX」という形式で「XXXX」にその文字に該当する16進整数値を記述すればよい。
ただし、出力時の環境、特にフォントがその文字を持っていなければ当然表示はできないため注意が必要。
「Unicode」という名称にはJavaで使用されているものの他に「UTF-8」「UTF-16」といったものも存在するが、これらは別の文字コードであり、体系的には全く関連性はない。
「Unicode」とは「様々な言語の文字を表現できる文字コード」という意味で一般的に使用されている用語であり、特定の文字コードを指さない場合があり、その場合には、Unicodeは広い意味で使用され、「UTF-8」等も含むことになる。
Javaで使用するUnicodeは、正確には「UCS-2」と呼ぶ。IANAで登録されている名称は"ISO-10646-UCS-2"である。
参考サイト
- (参考サイトはありません)
// Sample.java
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// char型変数を作り、文字リテラル「あ」を格納します。
char ch = 'あ';
System.out.println( ch );
// あ
// この変数には、Unicodeで「あ」に該当する整数値0x3042が
// 格納されています。
System.out.println( Integer.toHexString( ch ) );
// 3042
// ソースファイルの文字コードと、実行中に変数に格納される
// 文字コードは無関係です。Eclipseやエディタで入力できない
// 文字ても、Unicodeのコードが分かっていれば
// エスケープシーケンス「\u0000」(0000は文字を表すの16進数)
// を使用して表現できます。
// たとえば「草なぎ剛」の「なぎ」は以下のようにして
// 出力できます。
System.out.println( '\u5F45' );
// ただし、出力時のフォントがこの文字をサポートしていなければ
// 出力できませんが……。
try
{
// 文字コード「UCS-2」(Unicodeの正式名称)での
// 「あいう」をStringクラスに渡します。
byte[] source = new byte[] { (byte)0x30, (byte)0x42, (byte)0x30, (byte)0x44, (byte)0x30, (byte)0x46 };
// 文字コードの変換はStringクラスのコンストラクタで行います。
// 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。
// 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。
// そうするとUnicodeに変換されて格納されます。
String string = new String( source, "ISO-10646-UCS-2" );
System.out.println( string );
// あいう
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「ISO-10646-UCS-2」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
import java.io.UnsupportedEncodingException;
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// char型変数を作り、文字リテラル「あ」を格納します。
char ch = 'あ';
System.out.println( ch );
// あ
// この変数には、Unicodeで「あ」に該当する整数値0x3042が
// 格納されています。
System.out.println( Integer.toHexString( ch ) );
// 3042
// ソースファイルの文字コードと、実行中に変数に格納される
// 文字コードは無関係です。Eclipseやエディタで入力できない
// 文字ても、Unicodeのコードが分かっていれば
// エスケープシーケンス「\u0000」(0000は文字を表すの16進数)
// を使用して表現できます。
// たとえば「草なぎ剛」の「なぎ」は以下のようにして
// 出力できます。
System.out.println( '\u5F45' );
// ただし、出力時のフォントがこの文字をサポートしていなければ
// 出力できませんが……。
try
{
// 文字コード「UCS-2」(Unicodeの正式名称)での
// 「あいう」をStringクラスに渡します。
byte[] source = new byte[] { (byte)0x30, (byte)0x42, (byte)0x30, (byte)0x44, (byte)0x30, (byte)0x46 };
// 文字コードの変換はStringクラスのコンストラクタで行います。
// 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。
// 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。
// そうするとUnicodeに変換されて格納されます。
String string = new String( source, "ISO-10646-UCS-2" );
System.out.println( string );
// あいう
}
catch( UnsupportedEncodingException e )
{
// StringクラスのコンストラクタがUnsupportedEncodingException例外を
// 投げるので拾います。第2引数で渡された文字コード
// (上記の例では「ISO-10646-UCS-2」)が、Javaではサポート
// されていない文字コードの場合にエラーとなります。
e.printStackTrace();
}
}
}
// Sample.java import java.io.UnsupportedEncodingException; // Sample.java public class Sample { public static void main( String[] args ) { // char型変数を作り、文字リテラル「あ」を格納します。 char ch = 'あ'; System.out.println( ch ); // あ // この変数には、Unicodeで「あ」に該当する整数値0x3042が // 格納されています。 System.out.println( Integer.toHexString( ch ) ); // 3042 // ソースファイルの文字コードと、実行中に変数に格納される // 文字コードは無関係です。Eclipseやエディタで入力できない // 文字ても、Unicodeのコードが分かっていれば // エスケープシーケンス「\u0000」(0000は文字を表すの16進数) // を使用して表現できます。 // たとえば「草なぎ剛」の「なぎ」は以下のようにして // 出力できます。 System.out.println( '\u5F45' ); // ただし、出力時のフォントがこの文字をサポートしていなければ // 出力できませんが……。 try { // 文字コード「UCS-2」(Unicodeの正式名称)での // 「あいう」をStringクラスに渡します。 byte[] source = new byte[] { (byte)0x30, (byte)0x42, (byte)0x30, (byte)0x44, (byte)0x30, (byte)0x46 }; // 文字コードの変換はStringクラスのコンストラクタで行います。 // 第1引数には他文字コードの文字列が格納されたbyte型配列を渡します。 // 第2引数には、そのbyte型配列に格納されている文字列の文字コードを渡します。 // そうするとUnicodeに変換されて格納されます。 String string = new String( source, "ISO-10646-UCS-2" ); System.out.println( string ); // あいう } catch( UnsupportedEncodingException e ) { // StringクラスのコンストラクタがUnsupportedEncodingException例外を // 投げるので拾います。第2引数で渡された文字コード // (上記の例では「ISO-10646-UCS-2」)が、Javaではサポート // されていない文字コードの場合にエラーとなります。 e.printStackTrace(); } } }