c++ - utf8 字符计数不起作用

标签 c++ unicode utf-8

有人可以解释为什么第一个功能有效而第二个功能无效吗?

unsigned int utf8_count(char* in)
{
    unsigned int i = 0, c = 0;
    while (in[i])
    {
        if ((in[i] & 0xc0) != 0x80)
            c++;

        i++;
    }

    return c;
}

unsigned int utf8_count(char* in, unsigned int in_size)
{
    unsigned int i = 0, c = 0;
    while (i < in_size)
    {
        if ((in[i] & 0xc0) != 0x80)
            c++;

        i++;
    }

    return c;
}

我明白了什么(in[i] & 0xc0) != 0x80会,但我不明白为什么 i < in_size != in[i]

示例字符串:ゴールデンタイムラバー/スキマスイッチ 57 个字节,19 个字符。

为什么 utf8_count(in, 57)返回 57 而不是 19?

示例字符串的二进制表示:

enter image description here

最佳答案

您看到的问题与您的示例字符串有关。

ガールドンタイムラバー/スキマスイッチ 您的示例字节在空字节之前显示 18x '00111111'。 根据我的计算,第一个函数应该返回 18,第二个函数应该返回更大的数字。您确定传递的字符串正确吗?

我不认为你在图像中向我们展示的字节对应于文本 グールドンタイムラバー/スキマスイッチ(如果只是因为我没有看到相同的字符重复多次这个字符串的开始。

关于c++ - utf8 字符计数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22310201/

相关文章:

c++ - Windows 上的 Qt 5.4.0,在某些情况下在 QWidget 上调用的 isActive() 返回明显错误的值

c++ - Win32 : Prevent folder modification?

java - String 的 char 表示形式是否不同且固定?

c++ - windows中宽字符和多字节字符串之间如何相互转换?

php - UTF-8贯穿始终

java - 如何将原始字节值放入 oracle 的 varchar2 列中?

C++ 返回语句不工作

c++ - glob 只给出匹配模式的第一个文件

python-3.x - PyXB:以 Unicode 生成类名

html - Perl 中的波兰字符 [HTML::TreeBuilder 和 utf8 输入文件]