繁体   English   中英

如何在Linux上的C中获取文件中的字符数(而不是字节数)

[英]How to get the number of characters in a file (not bytes) in C on Linux

我想获取文件中的字符数。 字符我的意思是“真正的”字符,而不是字节。 假设我知道文件编码。

我尝试使用mbstowcs()但它不起作用,因为它使用系统区域设置(或使用setlocale定义的系统区域设置)。 因为setlocale不是线程安全的,所以在调用mbstowcs()之前我不认为使用它是个好主意。 即使它是安全的,我也必须确保我的程序不会在setlocale()的调用之间“跳转”(信号等setlocale() (一次调用将其设置为文件的编码,然后打开打电话恢复到前一个)。

因此,举一个例子,假设我们有一个使用俄语编码(例如KOI8)编码的文件ru.txt 所以,我想打开文件并获取字符数,假设文件的编码是KOI8。

如果source_encoding mbstowcs()可以采用source_encoding参数,那可能很容易......

编辑:使用mbstowcs()的另一个问题是必须在系统上安装与文件编码对应的语言环境...

我建议使用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)。 应该可以使用固定大小outbuf逐个转换输入,如果一个人仔细选择outbytesleft(即4 * inbytesleft + 2 :-)。

要计算文件中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. 为您要使用的每个编码自己编写计算函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM