【问题标题】:Filter Unicode characters in character array [closed]过滤字符数组中的 Unicode 字符 [关闭]
【发布时间】:2017-03-02 09:30:58
【问题描述】:

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

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

【问题讨论】:

  • 这个问题有点含糊; unicode 可以用不同的方式编码。 普通字符到底是什么意思? ASCII?一些编码,如UTF-8,包含 ASCII 作为子集,因此我们无法过滤这些。
  • 你忘了问一个具体的可回答问题,并描述它是如何拒绝你解决它的尝试的。

标签: c++ unicode-string


【解决方案1】:

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

考虑一个类比:数值不携带有关单位的信息。如果一艘宇宙飞船以 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 具有相同的映射。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      代码要么是 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 缓冲区中。

      【讨论】:

      • 我想知道语句是否应该像:unicode_filtered[j++]=unicode[i];,我的意思是将过滤后的值存储在一个新的数组中。
      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2020-06-03
      • 2019-12-30
      • 2012-03-01
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多