首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL:在plperl存储过程中,编码"UTF8“的字符在"LATIN1”中没有等效字符

PostgreSQL:在plperl存储过程中,编码"UTF8“的字符在"LATIN1”中没有等效字符
EN

Stack Overflow用户
提问于 2013-03-22 19:29:04
回答 1查看 3.5K关注 0票数 2

我有一个用Pl/Perl编写的存储过程:

代码语言:javascript
复制
CREATE FUNCTION strip_html_tags(text) RETURNS TEXT AS $$
    use HTML::Strip;
    my $hs = HTML::Strip->new();
    my $clean_text = $hs->parse($_[0]);
    $hs->eof;
    return $clean_text;
$$ LANGUAGE plperlu;

我的数据库中有一些字段(LATIN1 encodend)可能包含一些无效字符,因为我得到的信息如下:

代码语言:javascript
复制
db=# select strip_html_tags(field) from table;
ERROR:  character 0xe2809c of encoding "UTF8" has no equivalent in "LATIN1"
CONTEXT:  PL/Perl function "strip_html_tags"

我尝试过使用PostgreSQL的convert()和convert_from()来尝试更改编码,但是没有成功。有什么想法吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-22 19:39:20

我想这里发生的事情是strip_html_tags正在将HTML实体解码成原生Unicode代码点,表示为utf-8编码文本。解码为utf-8字节序列的0xe2809cthe unicode code point U+201c LEFT DOUBLE QUOTATION MARK - the character ,这是完全可信的,因为您可以从HTML中解码的转义中获得它,特别是由图形用户界面编辑器或MS生成的HTML.在HTML语言中,它将被表示为““ (十进制)或“ (十六进制)。

因为您的数据库编码是拉丁文-1,所以您不能在数据库中表示许多这样的解码字符。

如果您打算使用完整的unicode数据,那么您真的应该考虑将数据库更改为utf-8。如果您的数据库真的在latin-1而不是(ugh) SQL_ASCII中,这通常并不困难;只需转储数据库,使用ENCODING 'utf-8'创建一个新的DB,然后将数据加载到其中以进行验证和检查。根据转换后的数据库测试您的应用程序,并确保它们能够正确处理unicode文本。当你满意时,停止你的应用程序,再次转储数据库,重新加载它,重命名旧的数据库,然后重命名新的数据库,使其具有与旧数据库相同的名称。

如果你愿意修改你的超文本标记语言,你可以使用use Perl modules features to do a lossy encoding conversion from UTF-8 to Latin-1。有一些Perl模块可以做一些事情,比如用"替换,用- (减号)替换 (em破折号)等,还可以去掉不可替换的字符或用"?“这样的替换字符替换它们。这是一个单向的、有损的转换;如果不保留原始版本的副本,就无法恢复原始数据。

您唯一的其他选择是以bytea格式返回数据- utf-8编码的字节字符串-然后在您的应用程序中将它们解码为文本。我真的不推荐这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15569249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档