MultiByteToWideChar、WideCharToMultiByte の文字数計算
MultiByteToWideChar、WideCharToMultiByte 関数では、文字数のみを取得するために、バッファのアドレスを指定するころに NULL を指定することができます。また、変換元の文字列の長さを指定する引数に -1 を指定すると、変換元の文字列の長さを自動的に計算(NULL 文字まで)してくれます。
この -1 を指定したときの動作にちょっとした落とし穴があり、-1 を指定すると、計算される文字列の長さには NULL 文字分が入ります。
変換元 | 指定する長さ | 変換後 | 返る長さ |
---|---|---|---|
てすと(null) | 6 | てすと | 3 |
てすと(null) | -1 | てすと(null) | 4 |
てすと(null) | 5 | てす | 2 |
てすと(null)字(null) | 9 | てすと(null)字 | 5 |
右の表では、MultiByteToWideChar 関数を利用したときの、「マルチバイト文字列」→「Unicode 文字列」の変換結果を示しています(日本語での変換です。また、(null) は NULL 文字を表します)。「てすと」という文字列は、マルチバイトでは 6 文字(6 バイト)です(NULL 文字を除く)。なので、長さを 6 として変換を行うと、バッファには Unicode 文字列で「てすと」と書き込まれ、長さは「3」となります(この場合、NULL 文字は書き込まれません。1 つ目の例)。
ここで、指定する長さを「-1」とすると、バッファには NULL 文字も含まれ、その分返る長さも 1 文字長くなります (2 つ目の例)。
また、マルチバイト文字列で「2 バイトで 1 文字」となる文字に関して、指定した長さがちょうど 2 バイト文字の 1 バイト目で止まっていたら、その文字は変換の対象になりません (3 つ目の例)。
指定する長さは、NULL 文字を跨いでいても何ら問題はなく、バッファにも NULL 文字の右側にちゃんと書き込まれます(4 つ目の例)。