Visual C でマルチバイト文字列のバイト サイズを取得するにはどうすればよいですか? 関数はありますか、それとも自分で文字数を数えなければなりませんか?
または、より一般的には、TCHAR 文字列の適切なバイト サイズを取得するにはどうすればよいですか?
解決:
_tcslen(_T("TCHAR string")) * sizeof(TCHAR)
編集:
null で終わる文字列のみについて話していました。
Visual C でマルチバイト文字列のバイト サイズを取得するにはどうすればよいですか? 関数はありますか、それとも自分で文字数を数えなければなりませんか?
または、より一般的には、TCHAR 文字列の適切なバイト サイズを取得するにはどうすればよいですか?
解決:
_tcslen(_T("TCHAR string")) * sizeof(TCHAR)
編集:
null で終わる文字列のみについて話していました。
私がこれを片付けることができるかどうか見てみましょう:
「マルチバイト文字列」は、そもそもあいまいな用語ですが、Microsoftの世界では、通常、「ASCIIではなく、UTF-16ではない」という意味です。したがって、1文字あたり1バイト、2バイト、またはそれ以上を使用する可能性のある文字エンコードを使用している可能性があります。するとすぐに、文字列の文字数!=文字列のバイト数になります。
MSプラットフォームでは使用されていませんが、例としてUTF-8を取り上げましょう。文字éは、メモリ内で「c3 a9」としてエンコードされます。つまり、2バイトですが、1文字です。文字列「thé」がある場合は、次のようになります。
text: t h é \0
mem: 74 68 c3 a9 00
これは、nullで終わるという点で「nullで終了する」文字列です。文字列にnullを含めることができるようにする場合は、次のような他の方法でサイズを格納する必要があります。
struct my_string
{
size_t length;
char *data;
};
...そしてそれに対処するのに役立つ多くの関数。std::string
(これは、かなり大まかに、一種の仕組みです。)
ただし、nullで終了する文字列の場合、サイズは文字ではなくバイト単位strlen()
で計算されます。(文字を数えるための他の関数があります)それが0バイトを見る前にバイト数を数えるだけです-何も派手ではありません。strlen
現在、MSの世界での「ワイド」または「ユニコード」文字列はUTF-16文字列を指します。バイト数!=文字数という点でも同様の問題があります。(また:バイト数/ 2!=文字数)もう一度見てみましょう:
text: t h é \0
shorts: 0x0074 0x0068 0x00e9 0x0000
mem: 74 00 68 00 e9 00 00 00
これはUTF-16の「thé」であり、リトルエンディアンで保存されます(これが通常のデスクトップです)。すべての00バイトに注意してください-これらはstrlenをトリップします。したがって、を呼び出します。これは、1バイトではなくwcslen
2バイトと見なされshort
ます。
最後に、が定義さTCHAR
れているかどうかに応じて、上記の2つのケースのいずれかであるsがあります。適切な関数(またはのいずれか)であり、またはのいずれかです。Windowsの世界でUTF-16への移行を容易にするために作成されました。UNICODE
_tcslen
strlen
wcslen
TCHAR
char
wchar_t
TCHAR
MSDNによると、が定義されている場合に_tcslen
対応します。文字列のバイト数を返します。に対応するものを使用すると、マルチバイト文字の数が返されます。strlen
_MBCS
strlen
_tcsclen
_mbslen
また、マルチバイト文字列には(AFAIK)埋め込まれたヌルが含まれていません。
そもそもマルチバイト エンコーディングの使用には疑問があります...レガシー アプリをサポートしていない限り、Unicode よりもマルチバイトを選択する理由はありません。