我需要从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);
}
打印输出如:
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
肉眼的长度x√abc似乎是6,但在代码中它是9? x√abc的正确答案是1 ...即它只有1个非ascii字符,但在上面的输出中它是3(不是ascii字符的时间)。
如何正确地从UTF-8字符串中找到非ascii字符。
请指导这个主题。
答案 0 :(得分:6)
C调用char
实际上是一个字节。 UTF-8字符可以由几个字节组成。
实际上只有 ASCII字符由UTF-8中的单个字节表示(这就是为什么所有有效的ASCII编码文本也都是UTF-8编码的原因)。
因此,要计算必须进行部分解码的UTF-8字符数:计算UTF-8 start 代码点的数量。
请参阅the Wikipedia article on UTF-8以了解它们的编码方式。
基本上有3个类别:
要计算unicode代码点的数量,只需计算所有不是连续字节的字符。
然而 unicode代码点与&#34;字符&#34;之间始终没有一对一的对应关系。 (取决于你对角色的确切定义)。
答案 1 :(得分:3)
在字符数组中使用的UTF-8字符占用它时,每个UTF-8字符占用的第一个字节将包含有关表示字符所用字节数的信息。来自第一个字节的MSB的连续1的数量将表示非ascii字符所占的总字节数。如果'√',二进制形式为:11100010,10001000,10011010。计算第一个字节中的1的数量给出占用的字节数为3.类似下面的代码将适用于此:
int get_count(char non_ascii_char){
/*
The function returns the number of bytes occupied by the UTF-8 character
It takes the non ASCII character as the input and returns the length
to the calling function.
*/
int bit_counter=7,count=0;
/*
bit_counter - is the counter initialized to traverse through each bit of the
non ascii character
count - stores the number of bytes occupied by the character
*/
for(;bit_counter>=0;bit_counter--){
if((non_ascii_char>>bit_counter)&1){
count++;// increments on the number of consecutive 1s in the byte
}
else{
break;// breaks on encountering the first 0
}
}
return count;// returns the count to the calling function
}