从UTF-8字符串中查找非ascii字符

nav*_*yad 2 c utf-8

我需要从UTF-8字符串中找到非ASCII字符.

我的理解:UTF-8是字符编码的超集,其中0-127是ascii字符.因此,如果在UTF-8字符串中,字符值不在0-127之间,那么它不是ascii字符,对吧?如果我错了,请纠正我.

基于以上理解,我在C中编写了以下代码:

注意:我正在使用Ubuntu gcc编译器来运行C代码

utf-string是x√abc

long i;
    char arr[] = "x?ab c";
    printf("length : %lu \n", sizeof(arr));
        for(i=0; i<sizeof(arr); i++){

        char ch = arr[i];
        if (isascii(ch))
             printf("Ascii character %c\n", ch);
              else
             printf("Not ascii character %c\n", ch);
    }
Run Code Online (Sandbox Code Playgroud)

其中输出如下:

length : 9 
Ascii character x
Not ascii character 
Not ascii character ?
Not ascii character ?
Ascii character a
Ascii character b
Ascii character  
Ascii character c
Ascii character 
Run Code Online (Sandbox Code Playgroud)

对于x√abc的裸眼长度似乎是6,但在代码中它是9?x√abc的正确答案是1 ...即它只有1个非ascii字符,但在上面的输出中它变为 3(不是ascii字符的次数).

如何正确地从UTF-8字符串中找到非ascii字符.

请指导这个主题.

Joa*_*uer 6

C调用a char实际上是一个字节.UTF-8字符可以由几个字节组成.

事实上,只有 ASCII字符由UTF-8中的单个字节表示(这就是为什么所有有效的ASCII编码文本也有效地进行UTF-8编码).

因此,要计算UTF-8字符的数量,您必须进行部分解码:计算UTF-8 起始码点的数量.

请参阅维基百科有关UTF-8的文章,了解它们的编码方式.

基本上有3类:

  • 单字节代码0b0xxxxxxx
  • 起始字节:0b110xxxxx,0b1110xxxx,0b11110xxx
  • 延续字节:0b10xxxxxx

要计算unicode代码点的数量,只需计算所有不是连续字节的字符.

但是, unicode代码点并不总是与"字符"具有一对一的对应关系(取决于您对字符的确切定义).