<文字コード>
●1byte文字コード
○ASCII(7bit)
→ISO/IEC 646(7bit)
→ASCII(一部異なる)(7bit)+片仮名など(7bit):JIS X 0201
●2byte文字コード、符号化方式(可変長、マルチバイト文字)
○ISO/IEC 2022
→JIS X 0208
○JIS X 0208の符号化方式
→ASCII(1byte)を同時使用:EUC-JP(後述)
→JIS X 0201(1byte)を同時使用:Shift-JIS(後述)
●ワイド文字コードと符号化方式
○Unicode(16bit=2byte):UCS-2(固定長)
○ISO/IEC 10646(4byte)、JIS X 0221:UCS-4(固定長)
→Unicodeとの互換、UCS-2の拡張:UTF-16(注:サロゲート含む、2byteとは限らない)
→ASCIIとの互換:UTF-8(注:マルチバイト文字コード)
※UCS:Universal multi-octet coded Character Set
※UTF:UCS Transformation Format
<文字符号化方式>
●EUC-JP
※EUC:Extended Unix Code
○ASCII(1byte)は第8ビットが0、JIS X 0208等は第8ビットが1(第2バイト以降でも)。
・第1バイトが0x80未満であれば1バイト文字:ASCII
・第1バイトが0x80以上0x8E未満(0x8D)であれば2バイト文字:JIS X 0208
・第1バイトが0x8Eであれば2バイト文字:JIS X 0201
・第1バイトが0x8F以上(0x8F)であれば3バイト文字:JIS X 0212。
●Shift-JIS
・Windows メモ帳 では ANSI
○第8ビットを含め、JIS X 0201が使用しない部分にJIS X 0208を割り当て。
・第1バイトが0x81~0x9F、0xE0~0xEF(Windows-31J:0xFC)であれば2バイト文字。第2バイトは0x40~0x7E、0x80~0xFC。
・第2バイトを1バイト文字と見なすと、ASCIIやJIS X 0201で割り当てのある領域なので注意。
●UTF-16
・以前のWindows メモ帳 では Unicode
○UCS-2の拡張、UCS-2で文字の割り当てのない領域をサロゲートとして利用。
→サロゲートは、UCS-4にあるUCS-2に収まらなかった部分を示す。
○ビッグエンディアンとリトルエンディアン
●UTF-8
・Windows 10 ver.1903以降 メモ帳 のデフォルト保存形式、BOM無。
・Excel 2016 以降 CSVファイルの保存形式で選択可能、BOM有らしい。
○ASCII(1byte)は第8ビットが0、それ以外は第8ビットが1(第2バイト以降でも)。
・0x00以上0x7F以下(0b0xxxxxxx)であれば第1バイト、1バイト文字。
・0x80以上0xBF以下(0b10xxxxxx)であれば第2バイト以降。(RFC3629:2003では一部変更)
・0xc0以上0xDF以下(0b110xxxxx)であれば第1バイト、2バイト文字。
・0xe0以上0xEF以下(0b1110xxxx)であれば第1バイト、3バイト文字。
・0xF0以上0xF7以下(0b11110xxx)であれば第1バイト、4バイト文字。(RFC3629:2003では0xF4以下に変更)
・0xF8以上0xFB以下(0b111110xx)であれば第1バイト、5バイト文字。(RFC3629:2003では廃止)
・0xFC以上0xFD以下(0b1111110x)であれば第1バイト、6バイト文字。(RFC3629:2003では廃止)
<データ型>
●char型
・byte数は必ず1byte
・シングルバイト文字、マルチバイト文字:可変byte
・EUC-JP、Shift-JIS、UTF-8
・mblen関数:1文字のbyte数を調べるが、使用前にロケール設定が必要。
●wchar_t型
・byte数は処理系依存
・ワイド文字(UCS-2、UCS-4):固定byte
・UTF-16、UTF-32
<プログラムの文字コード>
ネイティブコード(C/C++):Windows-31J(Shift_JISベース)
マネージコード(C++/CLI,C#):Unicode(UTF-16)
//マネージコードの文字列をネイティブコードの文字列から作成
System::String^ ToCLI(std::string& input, System::Text::Encoding^ encoding)
{
return gcnew System::String(
input.data(),
0,
input.size(),
encoding); // 変換元エンコーディング(ネイティブコード)
}
//ネイティブコードの文字列をマネージコードの文字列から作成
std::string FromCLI(String^ input, System::Text::Encoding^ encoding)
{
std::string result;
if ( input != nullptr && input->Length > 0 )
{
array<Byte>^ barray =
System::Text::Encoding::Convert(
Encoding::Unicode, // 変換元エンコーディング(マネージコード)
encoding, // 変換先エンコーディング(ネイティブコード)
Encoding::Unicode->GetBytes(input));
pin_ptr<Byte> pin = &barray[0];
result.assign(reinterpret_cast(pin), barray->Length);
}
return result;
}
C/C++ではWin32スタティック・ライブラリとして.libファイルを生成、C++/CLIでは.libファイルと.hファイルへの参照を追加して、C++クラスとの区別のためにrefキーワードを付けてC++/CLIクラスを定義し.NETダイナミック・ライブラリとして.dllファイルを生成することで、C#からC/C++を呼び出すことができるようになる。
C++/CLIのクラスでは、C関数であれは、static関数として定義し、C++クラスであれば、ネイティブコードのインスタンスを生成して代入するネイティブコードのポインタをメンバとして定義、ポインタに対する処理でメソッドを定義、ファイナライザを定義してデストラクタから呼出、というように記述する。
<参考書籍、参考URL>
・UnicodeとUTF-8とUCS-2の関係-符号化文字集合? 文字符号化方式?
<参考URL>
・charとUnicodeとワイド文字をごっちゃにしないために
・UCSとUnicode
・UCSとUTF
・文字コードに関する覚え書きと実験
・弘前学院聖愛中学高等学校:java プログラミング もくじ
・RFC3629でUTF-8のバイト範囲が変更されている
・Vista到来。既存C/C++資産の.NET化を始めよう! - @IT
●1byte文字コード
○ASCII(7bit)
→ISO/IEC 646(7bit)
→ASCII(一部異なる)(7bit)+片仮名など(7bit):JIS X 0201
●2byte文字コード、符号化方式(可変長、マルチバイト文字)
○ISO/IEC 2022
→JIS X 0208
○JIS X 0208の符号化方式
→ASCII(1byte)を同時使用:EUC-JP(後述)
→JIS X 0201(1byte)を同時使用:Shift-JIS(後述)
●ワイド文字コードと符号化方式
○Unicode(16bit=2byte):UCS-2(固定長)
○ISO/IEC 10646(4byte)、JIS X 0221:UCS-4(固定長)
→Unicodeとの互換、UCS-2の拡張:UTF-16(注:サロゲート含む、2byteとは限らない)
→ASCIIとの互換:UTF-8(注:マルチバイト文字コード)
※UCS:Universal multi-octet coded Character Set
※UTF:UCS Transformation Format
<文字符号化方式>
●EUC-JP
※EUC:Extended Unix Code
○ASCII(1byte)は第8ビットが0、JIS X 0208等は第8ビットが1(第2バイト以降でも)。
・第1バイトが0x80未満であれば1バイト文字:ASCII
・第1バイトが0x80以上0x8E未満(0x8D)であれば2バイト文字:JIS X 0208
・第1バイトが0x8Eであれば2バイト文字:JIS X 0201
・第1バイトが0x8F以上(0x8F)であれば3バイト文字:JIS X 0212。
●Shift-JIS
・Windows メモ帳 では ANSI
○第8ビットを含め、JIS X 0201が使用しない部分にJIS X 0208を割り当て。
・第1バイトが0x81~0x9F、0xE0~0xEF(Windows-31J:0xFC)であれば2バイト文字。第2バイトは0x40~0x7E、0x80~0xFC。
・第2バイトを1バイト文字と見なすと、ASCIIやJIS X 0201で割り当てのある領域なので注意。
●UTF-16
・以前のWindows メモ帳 では Unicode
○UCS-2の拡張、UCS-2で文字の割り当てのない領域をサロゲートとして利用。
→サロゲートは、UCS-4にあるUCS-2に収まらなかった部分を示す。
○ビッグエンディアンとリトルエンディアン
●UTF-8
・Windows 10 ver.1903以降 メモ帳 のデフォルト保存形式、BOM無。
・Excel 2016 以降 CSVファイルの保存形式で選択可能、BOM有らしい。
○ASCII(1byte)は第8ビットが0、それ以外は第8ビットが1(第2バイト以降でも)。
・0x00以上0x7F以下(0b0xxxxxxx)であれば第1バイト、1バイト文字。
・0x80以上0xBF以下(0b10xxxxxx)であれば第2バイト以降。(RFC3629:2003では一部変更)
・0xc0以上0xDF以下(0b110xxxxx)であれば第1バイト、2バイト文字。
・0xe0以上0xEF以下(0b1110xxxx)であれば第1バイト、3バイト文字。
・0xF0以上0xF7以下(0b11110xxx)であれば第1バイト、4バイト文字。(RFC3629:2003では0xF4以下に変更)
・0xF8以上0xFB以下(0b111110xx)であれば第1バイト、5バイト文字。(RFC3629:2003では廃止)
・0xFC以上0xFD以下(0b1111110x)であれば第1バイト、6バイト文字。(RFC3629:2003では廃止)
<データ型>
●char型
・byte数は必ず1byte
・シングルバイト文字、マルチバイト文字:可変byte
・EUC-JP、Shift-JIS、UTF-8
・mblen関数:1文字のbyte数を調べるが、使用前にロケール設定が必要。
●wchar_t型
・byte数は処理系依存
・ワイド文字(UCS-2、UCS-4):固定byte
・UTF-16、UTF-32
<プログラムの文字コード>
ネイティブコード(C/C++):Windows-31J(Shift_JISベース)
マネージコード(C++/CLI,C#):Unicode(UTF-16)
//マネージコードの文字列をネイティブコードの文字列から作成
System::String^ ToCLI(std::string& input, System::Text::Encoding^ encoding)
{
return gcnew System::String(
input.data(),
0,
input.size(),
encoding); // 変換元エンコーディング(ネイティブコード)
}
//ネイティブコードの文字列をマネージコードの文字列から作成
std::string FromCLI(String^ input, System::Text::Encoding^ encoding)
{
std::string result;
if ( input != nullptr && input->Length > 0 )
{
array<Byte>^ barray =
System::Text::Encoding::Convert(
Encoding::Unicode, // 変換元エンコーディング(マネージコード)
encoding, // 変換先エンコーディング(ネイティブコード)
Encoding::Unicode->GetBytes(input));
pin_ptr<Byte> pin = &barray[0];
result.assign(reinterpret_cast
}
return result;
}
C/C++ではWin32スタティック・ライブラリとして.libファイルを生成、C++/CLIでは.libファイルと.hファイルへの参照を追加して、C++クラスとの区別のためにrefキーワードを付けてC++/CLIクラスを定義し.NETダイナミック・ライブラリとして.dllファイルを生成することで、C#からC/C++を呼び出すことができるようになる。
C++/CLIのクラスでは、C関数であれは、static関数として定義し、C++クラスであれば、ネイティブコードのインスタンスを生成して代入するネイティブコードのポインタをメンバとして定義、ポインタに対する処理でメソッドを定義、ファイナライザを定義してデストラクタから呼出、というように記述する。
<参考書籍、参考URL>
・UnicodeとUTF-8とUCS-2の関係-符号化文字集合? 文字符号化方式?
<参考URL>
・charとUnicodeとワイド文字をごっちゃにしないために
・UCSとUnicode
・UCSとUTF
・文字コードに関する覚え書きと実験
・弘前学院聖愛中学高等学校:java プログラミング もくじ
・RFC3629でUTF-8のバイト範囲が変更されている
・Vista到来。既存C/C++資産の.NET化を始めよう! - @IT