Programming Field - プログラミング Tips

MultiByteToWideChar、WideCharToMultiByte の文字数計算

MultiByteToWideCharWideCharToMultiByte 関数では、文字数のみを取得するために、バッファのアドレスを指定するころに 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 つ目の例)。