【问题标题】:Identify hidden non-UTF8 encoded characters识别隐藏的非 UTF8 编码字符
【发布时间】:2017-06-07 17:16:22
【问题描述】:

我在 postgreSQL 数据库中工作,并且我有多种语言的文本列,如俄语、中文、韩语、英语等。虽然我们的应用程序可以很好地处理这些语言,但我们在处理非 UTF-8 字符时遇到了问题。

例如,如果您从我已经完成编码的 notepad++ 中看到图像 > 以 UTF-8 编码,它会整齐地显示所有无法识别的字符。

但是,我们面临在 postgres 中将此类记录标记为不可处理的问题。像标志之类的东西也应该做,但我正在尝试类似下面的东西,但它也会标记有效的俄罗斯记录,而 notepad++ 明确显示隐藏/非 UTF-8 字符。

记事本++

这些字符的奇怪之处在于它们不会显示常规选择查询,但是当我将它们转换为“UTF-8”时,它们会显示如下。

数据库

尝试过这样的事情(下面的查询),但它似乎不起作用,即给我想要的输出。期望为具有无效隐藏 HTML 引用但不会丢失有效文本(如快照中的有效俄语句子)的此类记录设置一个标志。应该能够清楚地识别只有这样的文本。

select text, text ~ '[^[:ascii:]]', text ~ '^[\x00-\x7F]*$' 
from sample_data;

样本数据 -

“Я не наркоман. Это у меня всегда, когда мне афигитительно. А если серьёзно, это интересно,...”

“Ya le dieron amor a la foto de instagram de mi #UberCALAVERITA?”

“多伦多的执行行政助理,ON 为一个团体”

"Сегодня валютные стратеги BMO обновили прогнозы по основнозы по основным валютам на ближайшие пять кварталов (на конеец периода): киталов (на конеец периода)

“Flicitations Gestion d'actifs pour 6 Trophes #FundGradeA+2016 de fondas communs deplacement :”

【问题讨论】:

    标签: postgresql encoding utf-8


    【解决方案1】:

    此答案可能会帮助您返回解决问题。它并不能直接帮助您朝着您所询问的方向前进。

    查看 Flicitations 和 F\302\202licitations,转义看起来像八进制,这可能是您的“IDE”和/或 convert_to 函数的表示选择。从八进制开始,\302\202 是 0xC2 0x82,decoding as UTF-8 给出 U+0082。在 Unicode 中,这是一个控制字符,在 ISO 8859-1 中,它是一个非字符,或者可以解释为什么某些渲染使其不可见或不占用空间。

    现在,Google 告诉我 Flicitations 几乎就像一个法语单词,Félicitations。所以,也许有一个字符集和编码,其中 é 被编码为 0x82。 Wikipedia 在这里有帮助——确实有:IBM850,它已被用于一些法语文本。

    因此,似乎有人对用户的文本处理不当,导致数据丢失。 文本编码的基本规则是读取文本字节时必须使用与写入时相同的编码。不要猜测;询问或参考标准、规范、文档或约定。也许你可以回去找到行为不端的进程/代码——至少这样可以防止未来的数据丢失。


    “处理非 UTF-8 字符”:实际上没有任何非 UTF-8 字符。 UTF-8 是 Unicode 字符集的编码。有例外的地方,但实际上,Unicode 包含所有字符,而 UTF-8 可以对它们全部进行编码。因此,如果您认为存在非 UTF-8 字符,则可能是作者不兼容,或者阅读器使用了错误的编码。

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2015-03-07
      • 2016-02-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多