将字符串转换为is0-8859-1,以base64格式保存到数据库,但解码后输出为utf8

时间:2017-02-27 09:29:48

标签: perl utf-8

我真的很困惑这一个!所以这是正在发生的事情。我正在使用MIME::Base64将hashref加密为字符串,使用:

encode_base64(JSON::XS->new->latin1->encode($vars))

$vars中的一个变量称为comment ... $vars->{comment}

当我从数据库中获取文本时,内容为:

eyJwaG9uZSI6InNkZnNkZnNmZCIsImNvbW1lbnRzIjoi7fPpIHRlc3QgYWNjZW50cyB4eHh4eCIs
InJvb21zIjpbeyJkZXBvc2l0X2NhbmNlbF9wZXJpb2RfdGVybXMiOiJE6XD0dCByZXF1aXM6IDEw
JTxicj5cblx0XHRcdFx0XHRcdFx0ICBQ6XJpb2RlIGQnYW5udWxhdGlvbjogNiBtb2lzIiwiYnJl
YWtmYXN0X2F2YWlsYWJsZSI6MSwidXNlcl9pZF9mayI6ImFuZHkxIiwicm9vbV9uYW1lX3Nob3ci
OiJDaGFtYnJlIGJsZXUg7fPpIC8gQ2hhbWJyZSBEb3VibGUiLCJwZW9wbGUiOiIyIiwiYnJlYWtm
YXN0X3ByaWNlIjowLCJkZXBvc2l0X3BlcmNlbnRhZ2UiOiIxMCIsInByaWNlIjo3NSwiZGVwb3Np
dF9jYW5jZWxfcGVyaW9kIjoiMTgwIiwicm9vbV9pZCI6IjIyMiIsImRlcG9zaXRfY2FuY2VsX3Bl
cmlvZF9jYW50IjoxLCJkZXBvc2l0IjoiNy41MCJ9XSwidG90YWxfZHVlIjoiNzUuMDAiLCJlbWFp
bCI6ImFuZHkubmV3YnlAZ21haWwuY29tIiwicmVtYWluaW5nX2R1ZSI6IjY3LjUwIiwibnVtX3Bl
b3BsZSI6MiwidG8iOiIyMDE3MDQwMSIsImZyb20iOiIyMDE3MDMzMSIsImRlcG9zaXQiOiI3LjUw
In0=

在base64上执行 Devel :: Peek :: Dump ,标志看起来很完美:

SV = PV(0x2e419b8) at 0x1eece38
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x2eeaf70 "eyJwaG9uZSI6InNkZnNkZnNmZCIsImNvbW1lbnRzIjoi7fPpIHRlc3QgYWNjZW50cyB4eHh4eCIs\nInJvb21zIjpbeyJkZXBvc2l0X2NhbmNlbF9wZXJpb2RfdGVybXMiOiJE6XD0dCByZXF1aXM6IDEw\nJTxicj5cblx0XHRcdFx0XHRcdFx0ICBQ6XJpb2RlIGQnYW5udWxhdGlvbjogNiBtb2lzIiwiYnJl\nYWtmYXN0X2F2YWlsYWJsZSI6MSwidXNlcl9pZF9mayI6ImFuZHkxIiwicm9vbV9uYW1lX3Nob3ci\nOiJDaGFtYnJlIGJsZXUg7fPpIC8gQ2hhbWJyZSBEb3VibGUiLCJwZW9wbGUiOiIyIiwiYnJlYWtm\nYXN0X3ByaWNlIjowLCJkZXBvc2l0X3BlcmNlbnRhZ2UiOiIxMCIsInByaWNlIjo3NSwiZGVwb3Np\ndF9jYW5jZWxfcGVyaW9kIjoiMTgwIiwicm9vbV9pZCI6IjIyMiIsImRlcG9zaXRfY2FuY2VsX3Bl\ncmlvZF9jYW50IjoxLCJkZXBvc2l0IjoiNy41MCJ9XSwidG90YWxfZHVlIjoiNzUuMDAiLCJlbWFp\nbCI6ImFuZHkubmV3YnlAZ21haWwuY29tIiwicmVtYWluaW5nX2R1ZSI6IjY3LjUwIiwibnVtX3Bl\nb3BsZSI6MiwidG8iOiIyMDE3MDQwMSIsImZyb20iOiIyMDE3MDMzMSIsImRlcG9zaXQiOiI3LjUw\nIn0=\n"\0
  CUR = 775
  LEN = 776

然后我用:

解码它
my $vars = JSON::XS->new->latin1->decode(decode_base64($base64));

然而,如果我做了解码,那么:

Dump($vars->{comments});

我在Dump();

中得到了这个
SV = PV(0x31c06b8) at 0x2f4f208
  REFCNT = 1
  FLAGS = (POK,pPOK,UTF8)
  PV = 0x32635f0 "\303\255\303\263\303\251 test accents xxxxx"\0 [UTF8 "\x{ed}\x{f3}\x{e9} test accents xxxxx"]
  CUR = 25
  LEN = 32

如您所见,它仍然具有UTF8标志。我很难过为什么会这样做。

有没有人对我可以尝试的内容有所了解?

UPDATE:正如所建议的那样,我在编码之前完成了转储,并在解码之后(立即跳过数据库)。如建议的那样,它似乎 将其转换为utf8:/

BEFORE ENCODING:

SV = PVMG(0x2a19a40) at 0x2a66588
  REFCNT = 1
  FLAGS = (POK,pPOK)
  IV = 0
  NV = 0
  PV = 0x2320af0 "\355\363\351 test accents xxxxx"\0
  CUR = 22
  LEN = 24

AFTER DECODING STRAIGHT AFTER:
SV = PV(0x2a64b08) at 0x2a6b730
  REFCNT = 1
  FLAGS = (POK,pPOK,UTF8)
  PV = 0x2ab2200 "\303\255\303\263\303\251 test accents xxxxx"\0 [UTF8 "\x{ed}\x{f3}\x{e9} test accents xxxxx"]
  CUR = 25
  LEN = 32

我有什么想法可以阻止它这样做?

更新2:

来自jQuery $.ajax()请求的数据来自 utf8 格式。所以我正在做的是将其转换为 iso-8859-1 格式:

$in->{$_} = Unicode::MapUTF8::from_utf8({-string => $in->{$_}, -charset => 'ISO-8859-1'});

不幸的是,所有的网站和数据库都是iso-8859-1格式,所以我不能将UTF8用于任何数据(这就是我要转换的原因)

1 个答案:

答案 0 :(得分:2)

JSON :: XS正在对数据进行一些编码,因为它想要的东西是在utf8中。如果你不需要JSON,但是你只想保留数据以便以后检索它,你可以使用不同的序列化方式,而不会弄乱你的编码。

带有核心Perl的Storable模块允许您将Perl数据结构转换为可以保存在数据库中的二进制表示形式。 BLOB字段是有意义的。

use Storable;

my $binary = freeze($data_structure);

# somewhere else...

my $data_structure = thaw($binary)