postgresql - 识别隐藏的非 UTF8 编码字符

标签 postgresql encoding utf-8

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

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

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

Notepad++ 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?"

"Executive Admininstrative Assistant in Toronto, ON for a Group"

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

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

最佳答案

这个答案可能会帮助您回去解决问题。它不会直接帮助您朝您询问的方向前进。

查看 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 helps here—确实有:IBM850,已经用于一些法语文本。

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


“处理非 UTF-8 字符”:实际上并没有任何非 UTF-8 字符。 UTF-8 是 Unicode 字符集的一种编码。有些地方有异常(exception),但实际上,Unicode 拥有所有字符,而 UTF-8 可以对它们进行编码。因此,如果您认为存在非 UTF-8 字符,则说明编写者不符合要求或读者使用了错误的编码。

关于postgresql - 识别隐藏的非 UTF8 编码字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44419001/

相关文章:

python - Twitter API Python 字符编码

java - 使用 Java 替换来自阿拉伯语推文的表情符号 Unicode 范围

php - 使用 PHP 5.5 UTF-8 问题插入对 MYSQL 的更新

PostgreSQL : How to run ALTER queries returned as a result from SQL SELECT statement

php - 启用 PHP APC 查询缓存

sql - 不支持表/列名称中的方括号?

php - 如何将 url-array-parameter 传递给 pg_execute

python - 显然,Python字符串不是“天生相等”的

php - 最佳实践。我是在数据库中保存 html 标签还是存储 html 实体值?

mysql - 如何使用 Django ORM 将表情符号插入 MYSQL 5.5 及更高版本