如何将\u0421转换成字母"C"?

How to convert \u0421 into letter "C"?

我对服务器进行了 post 查询并获得了 json。它包含错误的符号:相反 "Correct" 我得到的是“\u0421orrect”。我如何编码此文本?

一个 parse_json 函数执行它就像 "РЎorrect";

我发现

$a = "\x{0421}orrect";
$a= encode("utf-8",  $a);

returns "РЎorrect",

$a = "\x{0421}orrect";
$a= encode("cp1251",  $a);

returns "Correct"

所以我决定将 \u 更改为 \x,然后使用 cp1251。

\u to \x

我写了:

Encode::Escape::enmode 'unicode-escape', 'perl';
Encode::Escape::demode 'unicode-escape', 'python';       
$content= encode 'unicode-escape', decode 'unicode-escape', $content;

得到\x{0421}正确的。

然后我尝试了:

$content = encode( 'cp1251', $content );

而且……什么都没变!我还有\x{0421}正确...

我注意到一些有趣的事情:

$a = "\x{0421}orrect";
$a= encode("cp1251",  $a);

returns "Correct"

但是

$a = '\x{0421}orrect';
$a= encode("cp1251",  $a);

仍然returns“\x{0421}正确”。

也许这是一把钥匙,但我不知道我能用它做什么。

我已经尝试过编码和解码,Encode:: from_to,JSON::XS and utf8.

你多次提到转义,但你想做相反的事情(unescape)。

decode_json/from_json 将正确 return "Сorrect"(其中 "C" 是西里尔大写字母 ES)。

use JSON::XS qw( decode_json );

my $json_utf8 = '{"value":"\u0421orrect"}';
my $data = decode_json($json_utf8);

不过,您确实需要对输出进行编码。例如,如果您有基于西里尔文的 Windows 系统,并且您想要创建一个本地文件,您可以使用

open(my $fh, '>:encoding(cp1251)', $qfn)
   or die("Can't create \"$qfn\": $!\n");

say $fh $data->{value};

如果您想对编码进行硬编码,或者如果您对 STDOUT 和 STDERR 的编码输出也感兴趣,请查看 this

抱歉,如果您已经意识到这一点 - 我只是认为值得指出,所以我们都在同一页上。

因此,根据您使用的字体,这两个字符很可能看起来完全相同。

您问了 "How can I encode this text?",但没有解释您的意思或为什么要 "encode"。没有将 'С' (\x{0421}) 转换为 'C' (\x{0043}) 的编码 - 它们是来自两个不同字母表的两个不同字符。

所以问题是,你想达到什么目的?您是否要检查来自服务器的字符串 return 是否与 "Correct" 匹配?如果是这样,那根本行不通,因为服务器正在 returning 字符串 "Сorrect"。它们可能看起来相同,但它们是两个不同的字符串。

整个情况可能是服务器代码错误,应该是 returning "Correct"。如果是这种情况并且您不能可靠地依赖服务器 returning "Correct",一种解决方法是使用 character replacement 到 "normalise" 之前的字符串你检查它的内容。例如:

use JSON::XS qw( decode_json );

my $response = <<EOF;
{
    "status": "\u0421orrect"
}
EOF

my $data = decode_json($response);

my $status = $data->{status};
$status =~ tr/\x{0421}/C/;

if($status eq "Correct") {
    say "The status is correct";
}
else {
    say "The status is not correct";
}

此代码现在可以使用,如果服务器代码固定为 return "Correct"