1

文字列を文字レベルで操作することが避けられない場合があります。

ここに、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;
}

これをマルチバイト/ユニコード文字列で正しく機能するものに変換しようとしています。次の文字のサイズはマルチバイト幅にすることができます。

それで:

  1. 有効な文字ポイント(文字の途中ではない)でのみ文字を見る必要があります
  2. 拒否された部分の一部である文字の部分を適切にコピーする必要があります(つまり、バイトだけでなく文字全体をコピーします)

_mbsinc()は、実際の文字の次の開始のアドレスを教えてくれることを理解しています。しかし、Unicode(UTF16)に相当するものは何ですか?また、完全な文字(たとえば、length_character(wsz))をコピーできるプリミティブはすでにありますか?

4

2 に答える 2

6

UTF-8の優れた点の1つは、ASCIIサブセットのみを気にする場合は、コードをまったく変更する必要がないことです。非ASCII文字はマルチバイトシーケンスにエンコードされ、すべてのバイトに上位ビットが設定され、ASCII範囲外になります。CR/LFの交換は変更なしで機能するはずです。

UTF-16にも同じプロパティがあります。単一の16ビットエンティティとしてエンコードできる文字は、複数のエンティティを必要とする文字と競合することはありません。

于 2012-10-15T14:35:46.163 に答える
2

テキストを内部的にどのようなエンコーディングと組み合わせて保持しようとしないでください。それが本当の地獄です。

まず、「内部」エンコーディングを選択します。ターゲットプラットフォームがUNIXの場合、UTF-8が適切な候補であり、そこに表示する方が少し簡単です。ターゲットプラットフォームがWindowsの場合、UTF-16が適切な候補であり、Windowsはとにかくどこでも内部的にそれを使用します。何を選んでも、それだけに固執してください。

次に、着信するすべての「ダーティ」テキストをそのエンコーディングに変換します。また、実際にはコードとまったく同じように見える再フォーマットを行うこともできますが、UTF-16を含むwchar_tの場合は、のようなリテラルを使用する必要がありますL'\n'

于 2012-10-15T14:58:52.020 に答える