gpt4 book ai didi

perl - 使用 Perl 将数字十六进制格式的 UCS2(未知 LE 或 BE)转换为 UTF-8

转载 作者:行者123 更新时间:2023-12-05 00:49:35 25 4
gpt4 key购买 nike

希望有人能指出我在哪里出错的方向:

我有一串(我认为)是十六进制编码的 UCS2,但提供商无法告诉我它是 UCS2-LE 还是 UCS2-BE。

像这样:0627062E062A062806270631

翻译成这样:اختبا

显然是阿拉伯语...但无论我尝试将其转换为十六进制,将其用作直接 UCS2(LE 或 BE)还是我在阳光下能想到的几乎任何其他东西,我都无法将其转换转换为 native-perl UTF-8,以便我可以重新编码为标准 UTF-8(我们系统的 native 格式)。

代码:

my $string = "0627062E062A062806270631";
my $decodedHex = hex($string);

#NEAREST
my $perlDecodedUTF8 = decode("UCS-2BE", $decodedHex);
my $utf8 = encode('UTF-8',$perlDecodedUTF8);

open(ARABICTEST,">ucs2test.txt");
print(ARABICTEST $perlDecodedUTF8);
print("Done!");
close(ARABICTEST);

此时输出乱码。

现在我提出的一个想法是将有问题的字符串拆分为 4 个字符的部分(即每个十六进制代码),但即使尝试使用单个已知的 UCS2 十六进制值似乎也不起作用。

还尝试强制输出编码,也没有乐趣。

谢谢!

最佳答案

hex不是将十六进制字符串解码为字节序列的方法。 pack是。 (hex 产生一个整数,而不是一串字节。)除此之外,你很接近。试试这个:

use strict;
use warnings;
use Encode;

my $string = "0627062E062A062806270631";
my $decodedHex = pack('H*', $string);

my $perlDecodedUTF8 = decode("UCS-2BE", $decodedHex);

open(my $ARABICTEST,">:utf8", "ucs2test.txt");
print $ARABICTEST $perlDecodedUTF8;
print("Done!");
close($ARABICTEST);

注意:您可能希望使用 UTF-16BE 而不是 UCS-2BE。它们基本上是一样的,但 UTF-16BE 允许代理对,而 UCS-2BE 不允许。所以所有 UCS-2BE 文本也是有效的 UTF-16BE,但反之则不然。

关于perl - 使用 Perl 将数字十六进制格式的 UCS2(未知 LE 或 BE)转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com