如何将\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。
抱歉,如果您已经意识到这一点 - 我只是认为值得指出,所以我们都在同一页上。
- 字符编号
\x{0421}
具有描述 "CYRILLIC CAPITAL LETTER ES" 并且看起来像这样:С
- 字符编号
\x{0043}
具有描述 "LATIN CAPITAL LETTER C" 并且看起来像这样:C
因此,根据您使用的字体,这两个字符很可能看起来完全相同。
您问了 "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"
。
我对服务器进行了 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。
抱歉,如果您已经意识到这一点 - 我只是认为值得指出,所以我们都在同一页上。
- 字符编号
\x{0421}
具有描述 "CYRILLIC CAPITAL LETTER ES" 并且看起来像这样:С - 字符编号
\x{0043}
具有描述 "LATIN CAPITAL LETTER C" 并且看起来像这样:C
因此,根据您使用的字体,这两个字符很可能看起来完全相同。
您问了 "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"
。