「cpp/string/multibyte」の版間の差分
細 (Use {{lc}}. Update links. Various fixes.) |
|||
1行: | 1行: | ||
− | + | {{title|}} | |
− | {{title| | + | |
{{cpp/string/multibyte/navbar}} | {{cpp/string/multibyte/navbar}} | ||
− | + | null-terminated multibyte stringNTMBS) () | |
− | + | UTF-8 GB18030, EUC-JP, Shift-JIS {{c|{'\xe4','\xbd','\xa0','\xe5','\xa5','\xbd','\0'}}} {{c|"你好"}} GB18030 {{c|{'\xc4', '\xe3', '\xba', '\xc3', '\0'}}} | |
− | + | -:..SCSU | |
− | + | /stringbyte(NTBS) {{lc|std::codecvt}}, {{lc|std::wstring_convert}} | |
− | === | + | ====== |
{{dsc begin}} | {{dsc begin}} | ||
{{dsc header | cstdlib}} | {{dsc header | cstdlib}} | ||
35行: | 34行: | ||
{{dsc end}} | {{dsc end}} | ||
− | === | + | ====== |
{{dsc begin}} | {{dsc begin}} | ||
{{dsc header | cwchar}} | {{dsc header | cwchar}} | ||
48行: | 47行: | ||
{{dsc inc | cpp/string/multibyte/dsc MB_CUR_MAX}} | {{dsc inc | cpp/string/multibyte/dsc MB_CUR_MAX}} | ||
{{dsc header | cuchar}} | {{dsc header | cuchar}} | ||
− | {{dsc macro const | __STDC_UTF_16__ | nolink=true | | + | {{dsc macro const | __STDC_UTF_16__ | nolink=true | UTF-16 }} |
− | {{dsc macro const | __STDC_UTF_32__ | nolink=true | | + | {{dsc macro const | __STDC_UTF_32__ | nolink=true | UTF-32 }} |
+ | |||
+ | |||
+ | |||
+ | |||
+ | }} | ||
{{dsc end}} | {{dsc end}} | ||
2018年3月3日 (土) 05:05時点における版
NULL終端マルチバイト文字列 (null-terminated multibyte string; NTMBS) または「マルチバイト文字列」は、非ゼロのバイト列に値ゼロのバイト (終端のNULL文字) が続いたものです。
文字列に格納されている各文字は2つ以上のバイトを使う場合があります。 マルチバイト文字列の文字を表すために使われるエンコーディングはロケール固有です。 UTF-8 であったり、 GB18030, EUC-JP, Shift-JIS などであったりします。 例えば、文字の配列 {'\xe4','\xbd','\xa0','\xe5','\xa5','\xbd','\0'} は UTF-8 エンコーディングでは "你好" を保持するNTMBSです (最初の3つのバイトが文字「你」を符号化し、次の3つのバイトが文字「好」を符号化します)。 同じ文字列が GB18030 では {'\xc4', '\xe3', '\xba', '\xc3', '\0'} になります (各文字が2バイトで符号化されます)。
一部のマルチバイトエンコーディングでは、あるマルチバイト文字シーケンスが、以前に現れた「シフトシーケンス」と呼ばれるバイトシーケンスに依存して、異なる文字を表現する場合があります。 このようなエンコーディングは状態依存と呼ばれ、各文字を解釈するためには現在のシフト状態を知る必要があります。 NTMBSは初期シフト状態で始まり初期シフト状態で終わる場合に限り有効です。 シフトシーケンスが現れた場合は、終端のNULL文字の前に、対応する脱シフトシーケンスが現れる必要があります。 このようなエンコーディングの例としては7ビット JIS、BOCU-1 や SCSU があります。
マルチバイト文字列はNULL終端バイト文字列 (NTBS) とレイアウト互換です。 つまり、同じ設備を使用して格納したり、コピーしたり、検査することができます。 ただし、文字数の計算は除きます。 現在のロケールが有効であれば、入出力関数はマルチバイト文字列も取り扱えます。 std::codecvt, std::wstring_convert または以下のロケール依存変換関数を使ってマルチバイト文字列をワイド文字列に変換したり、ワイド文字列をマルチバイト文字列に変換したりできます。
目次 |
マルチバイト文字列とワイド文字列の変換
ヘッダ
<cstdlib> で定義 | |
次のマルチバイト文字のバイト数を返します (関数) | |
次のマルチバイト文字をワイド文字に変換します (関数) | |
ワイド文字をマルチバイト表現に変換します (関数) | |
マルチバイト文字列をワイド文字列に変換します (関数) | |
ワイド文字列をマルチバイト文字列に変換します (関数) | |
ヘッダ
<cwchar> で定義 | |
mbstate_t オブジェクトが初期シフト状態を表しているかどうかチェックします (関数) | |
可能であればシングルバイト文字をワイド文字に変換します (関数) | |
可能であればワイド文字をシングルバイト文字に変換します (関数) | |
指定された状態を使用して次のマルチバイト文字のバイト数を返します (関数) | |
指定された状態を使用して次のマルチバイト文字をワイド文字に変換します (関数) | |
指定された状態を使用してワイド文字をマルチバイト表現に変換します (関数) | |
指定された状態を使用してマルチバイト文字列をワイド文字列に変換します (関数) | |
指定された状態を使用してワイド文字列をマルチバイト文字列に変換します (関数) | |
ヘッダ
<cuchar> で定義 | |
(C++11) |
ナローマルチバイト文字を UTF-16 エンコーディングに変換します (関数) |
(C++11) |
16ビットワイド文字をマルチバイト文字列に変換します (関数) |
(C++11) |
ナローマルチバイト文字を UTF-32 エンコーディングに変換します (関数) |
(C++11) |
32ビットワイド文字をマルチバイト文字列に変換します (関数) |
型
ヘッダ
<cwchar> で定義 | |
マルチバイト文字列を反復処理するために必要な変換状態情報 (クラス) |
マクロ
ヘッダ
<climits> で定義 | |
MB_LEN_MAX |
マルチバイト文字1文字の最大バイト数 (マクロ定数) |
ヘッダ
<cstdlib> で定義 | |
MB_CUR_MAX |
現在のCのロケールにおけるマルチバイト文字1文字の最大文字数 (macro variable) |
ヘッダ
<cuchar> で定義 | |
__STDC_UTF_16__ |
mbrtoc16 と c16rtomb で UTF-16 エンコーディングが使用されることを表します (マクロ定数) |
__STDC_UTF_32__ |
mbrtoc32 と c32rtomb で UTF-32 エンコーディングが使用されることを表します (マクロ定数) |
参考文献
NULL終端マルチバイト文字列 の C言語リファレンス
|