过滤字符数组中的Unicode字符

时间:2017-03-02 09:30:58

标签: c++ unicode-string

我有字符数组,可能包含也可能不包含Unicode字符。如果存在,它将是Unicode和ASCII字符的混合。我需要找到一种在通过char遍历字符串char时过滤掉Unicode字符的方法。

我需要用C ++做所有事情。

3 个答案:

答案 0 :(得分:2)

这一般是不可能的。角色只是一个数字。它不包含有关其编码的信息。

考虑一个类比:数字值不包含有关单位的信息。如果太空船以0.5的速度移动,行驶一公里需要多长时间?这取决于单位。它是每秒0.5米?或者它是光速的0.5倍?你无法从数字中得知。

同样,76代表什么字符?除非你知道编码,否则你无法知道。如果编码为UTF-8,则表示'L'。如果编码是EBCDIC,则表示'<'。那么,76是你应该过滤的Unocide 'L',还是你不应该过滤的EBCDIC '<'

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

因此,如果混合使用ASCII和Unicode,则可以确定大于127的值是Unicode,其他值是Unicode或ASCII。实际上,其他值同时是Unicode ASCII,因为Unicode的前127个代码点与设计中的ASCII具有相同的映射。

答案 1 :(得分:1)

要回答您的问题,了解字符数组中使用的特定Unicode 编码非常重要。由于您在问题中引用了char,因此我假设您的“character”数组是char数组,因此您很可能正在使用 {{3 }} 作为Unicode编码。

UTF-8之一是ASCII是它的适当子集。因此,您只需扫描整个char数组即可。如果当前char的高位被清除(即等于0,或等效地字节值为<= 127),那么这是一个纯(7位)ASCII字符,你接受了否则,此char是多字节UTF-8序列的一部分,您可以跳过它并移动到数组中的下一个char,然后重复。

答案 2 :(得分:1)

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位字符* ascii,当然必须分配给ascii缓冲区而不是将数据保存在Unicode缓冲区中。