文字列を文字レベルで操作することが避けられない場合があります。
ここに、CR / LFシーケンスをLFのみに置き換え、CRをLFに置き換えるANSI/ASCIIベースの文字列用に記述された関数があります。これを使用するのは、着信テキストファイルが混乱したさまざまなテキストまたは電子メールプログラムのために行末が間抜けになることが多く、将来的に解析/処理/出力を適切に機能させるために一貫した形式にする必要があるためです。
これは、文字ごとに1バイトを実装するための、さまざまな行末からLFのみへのこの圧縮のかなり効率的な実装です。
// returns the in-place conversion of a Mac or PC style string to a Unix style string (i.e. no CR/LF or CR only, but rather LF only)
char * AnsiToUnix(char * pszAnsi, size_t cchBuffer)
{
size_t i, j;
for (i = 0, j = 0; pszAnsi[i]; ++i, ++j)
{
// bounds checking
ASSERT(i < cchBuffer);
ASSERT(j <= i);
switch (pszAnsi[i])
{
case '\n':
if (pszAnsi[i + 1] == '\r')
++i;
break;
case '\r':
if (pszAnsi[i + 1] == '\n')
++i;
pszAnsi[j] = '\n';
break;
default:
if (j != i)
pszAnsi[j] = pszAnsi[i];
}
}
// append null terminator if we changed the length of the string buffer
if (j != i)
pszAnsi[j] = '\0';
// bounds checking
ASSERT(pszAnsi[j] == 0);
return pszAnsi;
}
これをマルチバイト/ユニコード文字列で正しく機能するものに変換しようとしています。次の文字のサイズはマルチバイト幅にすることができます。
それで:
- 有効な文字ポイント(文字の途中ではない)でのみ文字を見る必要があります
- 拒否された部分の一部である文字の部分を適切にコピーする必要があります(つまり、バイトだけでなく文字全体をコピーします)
_mbsinc()は、実際の文字の次の開始のアドレスを教えてくれることを理解しています。しかし、Unicode(UTF16)に相当するものは何ですか?また、完全な文字(たとえば、length_character(wsz))をコピーできるプリミティブはすでにありますか?