4

ファイル内の文字数を取得したいと思います。文字とは、バイトではなく「実際の」文字を意味します。ファイルのエンコーディングを知っていると仮定します。

使用しようとしましmbstowcs()たが、システム ロケール (または setlocale で定義されたロケール) を使用しているため、機能しません。setlocale はスレッドセーフではないため、 を呼び出す前に使用するのは得策ではないと思いますmbstowcs()。たとえそれがトレッドセーフだったとしても、私のプログラムがsetlocale()(ファイルのエンコーディングに設定するための 1 つの呼び出しと、元に戻すための呼び出しの間に) の呼び出しの間に「ジャンプ」(信号など) しないことを確認する必要があります。前のものへ)。

たとえば、ロシア語のエンコーディング (KOI8 など) を使用してエンコードされたファイルru.txtがあるとします。そこで、ファイルのエンコーディングがKOI8であると仮定して、ファイルを開いて文字数を取得したいと思います。

引数mbstowcs()を取ることができれば、とても簡単かもしれません...source_encoding

編集:使用する他の問題mbstowcs()は、ファイルのエンコーディングに対応するロケールをシステムにインストールする必要があることです...

4

2 に答える 2

5

iconv(3) を使用することをお勧めします。

NAME
   iconv - perform character set conversion

SYNOPSIS
   #include <iconv.h>

   size_t iconv(iconv_t cd,
                char **inbuf, size_t *inbytesleft,
                char **outbuf, size_t *outbytesleft);

そしてutf32に変換します。変換された文字ごとに 4 バイトの出力が得られます (さらに BOM 用に 2 バイト)。outbytesleft を慎重に選択すれば (つまり、4 * inbytesleft + 2 :-)、固定サイズの outbuf を使用して入力を少しずつ変換できるはずです。

于 2013-08-12T12:14:55.150 に答える
0

ファイル内の UTF8 文字数を計算するには、その内容をこの関数に渡すだけです。

int CalcUTF8Chars( const std::string& S )
{
    int Count = 0;

    for ( size_t i = 0; i != S.length(); i++ )
    {
        if ( ( S[i] & 0xC0 ) != 0x80 ) { Count++; }
    }

    return Count;
}

外部依存関係はありません。

アップデート:

他の異なるエンコーディングを処理したい場合は、2 つの選択肢があります。

  1. ICU http://site.icu-project.org/など、それを処理できるサードパーティ ライブラリを使用します。

  2. 使用するすべてのエンコーディングについて、計算関数を自分で作成します。

于 2013-08-12T12:26:42.773 に答える