字符数组中的滤波器unicode字符



我有可能包含Unicode字符的字符数组。在场时,它将是Unicode和ASCII字符的混合物。我需要找到一种方法来过滤Unicode字符,同时通过char浏览字符串char。

我需要在C 中完成所有操作。

这通常是不可能的。角色只是一个数字。它不带有有关其编码的信息。

考虑一个类比:一个数值不带有有关单元的信息。如果太空飞船以0.5的速度移动,那么行驶一公里需要多长时间?这取决于单元。是每秒0.5米吗?还是光速的0.5倍?您无法从数字中分辨出来。

同样,值76代表什么字符?除非您知道编码,否则您不知道。如果编码为UTF-8,则代表'L'。如果编码是EBCDIC,则表示'<'。因此,您应该过滤的76个无焦点'L',还是您不应该过滤的EBCDIC '<'

您无法从一个值中分辨出它在什么中的编码。但是,在某些情况下,您可以确定一个值不在特定的编码中。例如,ASCII是一个7位编码,因此您知道任何大于127的(无符号)的数字不能在ASCII中。

因此,如果您有ASCII和Unicode的混合物,则可以确定大于127的值是Unicode,而其他值则是Unicode或ASCII。实际上,其他值同时是Unicode ascii,因为Unicode的第一个127代码点与设计与ASCII的映射相同。

要回答您的问题,重要的是要了解字符数组中使用的特定Unicode 编码。由于您在问题中提到char,因此我假设您的"字符" 数组是char数组,因此您很有可能使用 utf-8 作为Unicode编码。

UTF-8的不错属性之一是ASCII是其适当的子集。因此,您可以简单地扫描整个char数组。如果当前char的高阶位清除(即相等的0或等效的字节值为<= 127),则这是一个纯净(7位)ASCII字符,您接受它。否则,此char是多字节UTF-8序列的一部分,您可以跳过并移至数组中的下一个char,然后重复。

eihter代码为wdie字节格式,或者是utf-8。无论哪种情况,逻辑都是相同的。

ASCII代码在0-127范围内。

int j = 0;
int i;
for(i=0;i<Len;i++)
  if(unicode[i] >= 0 && unicode[i] <=127)
     unicode[j++] = unicode[i];

如果格式为UTF-8,则是相同的代码,但是您将跳过几个字符,每个扩展字符都设置高钻头。您需要8位char *ascii,当然必须分配给ASCII缓冲区,而不是将数据保存在Unicode Buffer中。

最新更新