我有一个用Pl/Perl编写的存储过程:
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)可能包含一些无效字符,因为我得到的信息如下:
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()来尝试更改编码,但是没有成功。有什么想法吗?
提前谢谢。
发布于 2013-03-22 19:39:20
我想这里发生的事情是strip_html_tags正在将HTML实体解码成原生Unicode代码点,表示为utf-8编码文本。解码为utf-8字节序列的0xe2809c是the 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编码的字节字符串-然后在您的应用程序中将它们解码为文本。我真的不推荐这样做。
https://stackoverflow.com/questions/15569249
复制相似问题