C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のワイド文字(wchar_t)と主要ライブラリ関数の使い方


この記事では、C++におけるワイド文字(wide character)とは何かを解説し、ワイド文字を扱うための主要なライブラリ関数についても詳しく紹介します。

ワイド文字は、char型とよく似た文字型ですが、決定的な違いがあります。通常のchar型が1バイトのメモリ領域を使用するのに対し、ワイド文字型(wchar_t)は2バイト(コンパイラによっては4バイト)のメモリ領域を必要とします。2バイトの領域があれば、64K(65536)種類もの異なる文字を表現できます。そのため、ワイド文字はUNICODE文字を扱うことが可能です。UNICODEは国際標準の文字コード体系であり、事実上あらゆる言語のあらゆる文字をエンコードできる仕組みです。

基本のサンプルコード

#include<iostream>
using namespace std;
int main() {
    wchar_t wide_character = L'a';
    cout << "The wide character is: " << wide_character << endl;
    cout << "Wide character size: " <<sizeof(wide_character);
}

出力結果

The wide character is: 97
Wide character size: 2

この例からわかるように、ワイド文字リテラルを作成するには、文字リテラルの前に「L」を付ける必要があります。また、coutではワイド文字の値が正しく表示されず、数値(ASCIIコード値)として出力されてしまいます。ワイド文字を正しく扱うには、出力にはwcoutを、入力にはwcinを使用します。

さらに、ワイド文字の配列を作成し、文字列として出力することもできます。

ワイド文字配列のサンプルコード

#include<iostream>
using namespace std;
int main() {
    char str1[] = "This is character array";
    cout << str1 << endl;
    wchar_t str2 [] = L"This is wide character array";
    wcout << str2;
}

出力結果

This is character array
This is wide character array

続いて、ワイド文字列を操作するための代表的なライブラリ関数を確認していきましょう。

関数名説明
wcslen()構文: size_t wcslen (const wchar_t* wcs);
ワイド文字列の長さを取得するために使用します。
wcscat()構文: wchar_t *wcscat(wchar_t *strDest, const wchar_t *strSrc);
コピー元(ソース)文字列を、コピー先(デスティネーション)文字列の末尾に連結するために使用します。
wcscpy()構文: wchar_t *wcscpy(wchar_t *strDest, const wchar_t *strSrc);
ソース文字列をコピー先の文字列へ複製するために使用します。
wcsncpy()構文: wchar_t* wcsncpy(wchar_t* dest, const wchar_t* src, size_t n);
ソース文字列の先頭n文字をコピー先へ複製します。ソース文字列の長さがnより短い場合は、コピー先の残り部分にNULL文字が詰められます。
wcscmp()構文: int wcscmp(const wchar_t* wcs1, const wchar_t* wcs2);
2つのワイド文字列wcs1とwcs2を比較するために使用します。通常の文字列比較におけるstrcmp()関数に相当する機能です。
wcsstr()構文: const wchar_t* wcsstr (const wchar_t* wcs1, const wchar_t* wcs2);
wcs1の中でwcs2が最初に出現する位置を検索します。見つからない場合はNULLを返します。
wcstok()構文: wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t ** ptr);
strtok()と同様の働きをする関数です。区切り文字を指定して、ワイド文字で構成された文字列をトークン(部分文字列)に分割するのに役立ちます。

  1. STLとC++標準ライブラリの違いを徹底解説!構成要素と特徴をわかりやすく整理

    Standard Template Library(STL)は、C++プログラミング言語向けのソフトウェアライブラリであり、C++標準ライブラリの多くの部分に影響を与えました。STLは「アルゴリズム」「コンテナ」「関数オブジェクト」「イテレータ」という4つのコンポーネントを提供します。ただし注意したいのは、「STL」や「Standard Template Library」という用語はISO 14882 C++標準規格のどこにも登場しないという点です。つまり、C++標準ライブラリを「STL」と呼ぶのは厳密には誤りであり、両者は別のもの。STLはC++標準ライブラリの一部(部分集合)であると理解す

  2. C++の文字リテラルと文字列リテラルの違いをわかりやすく解説

    C++における文字リテラルと文字列リテラルの基本C++では、シングルクォート( )で囲まれた1文字は「文字リテラル」として扱われ、その型は char になります。例えば a は char 型であり、ASCIIベースのシステムでは整数値 97 を持ちます。一方、ダブルクォート( )で囲まれた1文字または複数文字の並びは「文字列リテラル」として扱われます。その型は const char[] であり、実体は「文字列の長さ + 1」のサイズを持つ配列です。この余分な1文字分は、文字列の終端を示すヌル文字(\0)として確保されています。具体的な違いのポイント文字リテラル: 原則として1文字のみを格納する