4

我想获取文件中的字符数。我所说的字符是指“真实”字符,而不是字节。假设我知道文件编码。

我尝试使用mbstowcs()但它不起作用,因为它使用系统语言环境(或使用 setlocale 定义的语言环境)。因为 setlocale 不是线程安全的,所以我认为在调用mbstowcs(). 即使它是安全的,我也必须确保我的程序不会在调用之间“跳转”(信号等)setlocale()(一个调用将其设置为文件的编码,并在调用时恢复到上一个)。

因此,举个例子,假设我们有一个使用俄罗斯编码(例如 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;
}

没有外部依赖。

更新:

如果您想处理其他不同的编码,您有两种选择:

  1. 使用可以处理的第三方库,例如ICU http://site.icu-project.org/

  2. 为您要使用的每种编码自己编写计算函数。

于 2013-08-12T12:26:42.773 回答