识别隐藏的非UTF8编码字符

时间:2017-06-07 17:16:23

标签: postgresql encoding utf-8

我在postgreSQL数据库工作,我有文本专栏,有各种语言,如俄语,中文,韩语,英语等。虽然我们的应用程序很好地处理这些语言,但我们遇到的问题是处理非UTF-8字符。

例如,如果您从记事本++中看到我已经完成编码的图像>用UTF-8编码,它整齐地显示所有不可识别的字符。

但是,我们正面临着在postgres中将这些记录标记为不可处理的问题。像旗子这样的东西也应该做,但是我正在尝试类似下面的东西,但它也标记了有效的俄语记录,而记事本++明确地显示了隐藏/非UTF-8字符。

记事本++ notepad++ UTF-8

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

数据库 enter image description here

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

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

示例数据

  

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

     

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

     

“多伦多的行政管理助理,一群人”

     

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

     

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

1 个答案:

答案 0 :(得分:1)

这个答案可能会帮助您回过头来解决问题。它并没有直接帮助你朝着你所要求的方向前进。

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

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

因此,似乎有人错误处理了用户的文本,导致数据丢失。 文本编码的基本规则是必须使用与编写文本字节相同的编码来读取文本字节。不要猜测;询问或参考标准,规范,文档或惯例。也许你可以回去找到行为不当的过程/代码 - 至少可以防止将来的数据丢失。

“处理非UTF-8字符”:实际上没有任何非UTF-8字符。 UTF-8是Unicode字符集的编码。有些区域有例外,但实际上,Unicode有所有字符,UTF-8可以对它们进行编码。因此,如果您认为存在非UTF-8字符,则编写器不符合要求或读者使用错误的编码。