【问题标题】:Find and replace non utf8 character查找和替换非 utf8 字符
【发布时间】:2021-04-18 12:50:03
【问题描述】:

我有一个将数据插入 PDF 的过程,该过程最终加载到系统中,该系统会根据插入的数据进行搜索。插入的数据如下所示:

<<
/IBM-ODIndexes
<< /Private
<<
  /DOB (05031983)
  /FULL_NAME (TEST USER)
  /YEAR (2020)
>>
/LastModified(D:20210112201530)
>>

但是,在某些情况下,FULL_NAME 字段中的数据包含非 UTF8 字符,然后用户无法搜索数据。具体来说,撇号来自 Microsoft Word,然后被解释如下:

/FULL_NAME (JERRY OÃ&lt;83&gt;¢ââ&lt;80&gt;&lt;9a&gt;‰â&lt;80&gt;&lt;9e&gt;¢CONNELL)

在这种情况下,我希望去掉表示为 Ã&lt;83&gt;¢ââ&lt;80&gt;&lt;9a&gt;‰â&lt;80&gt;&lt;9e&gt;¢ 的撇号并将其​​替换为空格。

【问题讨论】:

  • 提供有关您的 INPUT 数据外观的更多信息,它是一组文件吗?它是否只包含要插入的数据?从tr -c '\n[:alnum:]/&lt;&gt;():_-' ' ' &lt; inputfile 开始,根据您的输入找出哪些字符被错误删除(删除-c 以仅查看删除的字符)
  • @Camusensei - 输入数据是 PDF,我们有软件在其中抓取该数据并将其保存到平面文件中,以便以后插入数据中。
  • 如果它总是撇号,并且总是被表示为Ã&lt;83&gt;¢ââ&lt;80&gt;&lt;9a&gt;‰â&lt;80&gt;&lt;9e&gt;¢——那么你是否有理由不使用明显的kludge,而是像:% s/Ã&lt;83&gt;¢ââ&lt;80&gt;&lt;9a&gt;‰â&lt;80&gt;&lt;9e&gt;¢/ /一样进行全局替换?

标签: bash vim vi


【解决方案1】:

这里有几个复杂性,但总的来说,我认为唯一可靠的处理方法是找出传入文档的文本编码并将其转换为目标编码。

Ã&lt;83&gt;¢ââ&lt;80&gt;&lt;9a&gt;‰â&lt;80&gt;&lt;9e&gt;¢34 个字符(即,至少 34 个字节),并且没有一种编码曾经为单个字符使用过那么多空间。可能发生的是多级编码,例如 HTML 实体、base64、UTF-8/16/32 或转义字符,如%% 在 SQL 中表示 %\\ 在 Bash 中表示 \。手动反转所有这些级别的编码将涉及大量阅读庞大的 docx 标准。更简单的替代方法是使用一个库,它可以为您将整个文本转换为已知的字符编码,此时您最多只需一次转换为 UTF-8。

对此的另一个论点是“撇号字符串”确实包含其他无害的字符,例如“a”和“e”。如果对编码至少一些了解,您不太可能能够将编码字符与非编码字符分开,这会使生成的文本充满无效文本。

【讨论】:

    猜你喜欢
    • 2015-02-02
    • 2011-11-22
    • 2013-08-27
    • 1970-01-01
    • 2011-08-22
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多