我想获取文件中的字符数。字符我的意思是"真实"字符,而不是字节。假设我知道文件编码。
我尝试使用mbstowcs()
,但它不起作用,因为它使用系统区域设置(或使用setlocale定义的系统区域设置)。因为setlocale不是线程安全的,所以我不认为在调用mbstowcs()
之前使用它是个好主意。即使它是安全的,我也必须确定
我的节目赢了"跳#34; setlocale()
的调用之间的(信号等)(一次调用将其设置为文件的编码,然后调用以恢复到前一次)。
因此,举一个例子,假设我们有一个使用俄语编码(例如KOI8)编码的文件 ru.txt 。所以,我想打开文件并获取字符数,假设文件的编码是KOI8。
如果mbstowcs()
可以采用source_encoding
参数......
编辑:使用mbstowcs()
的另一个问题是,必须在系统上安装与文件编码对应的语言环境...
答案 0 :(得分: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)。应该可以使用固定大小outbuf逐个转换输入,如果一个人仔细选择outbytesleft(即4 * inbytesleft + 2: - )。
答案 1 :(得分: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;
}
没有外部依赖。
<强>更新强>
如果您想处理其他不同的编码,您有两种选择:
使用可以处理它的第三方库,例如ICU http://site.icu-project.org/
自行编写您想要使用的每种编码的计算函数。