我有字符数组,可能包含也可能不包含Unicode字符。如果存在,它将是Unicode和ASCII字符的混合。我需要找到一种在通过char遍历字符串char时过滤掉Unicode字符的方法。
我需要用C ++做所有事情。
答案 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缓冲区中。