1

我有一个 windows 1251 编码的字符串,需要转换为十六进制或二进制(但如果我设法将其转换为两者之一,我将能够将其转换为另一个)。该字符串来自收银机,因此我对初始编码无能为力。

到目前为止,我已尝试将其转换为 UTF-8,然后转换为 bin,然后转换为十六进制,但最后它是不正确的。字符串为“Ђ ЂЂ„‚”,十六进制为 80 20 80 80 84 82,二进制为 10000000 10100000 10000000 10000000 10000100 10000010

我认为我的第一个问题是 win-1251 到 utf-8 的对话。

$decodedUtf8 = mb_convert_encoding($decoded, "utf-8", "windows-1251");

结果是'Ђ ЂЂ„‚' -> 'Ђ ЂЂ„‚',我对编码没有经验,但这个看起来很可疑。

到目前为止,我的整个代码是:

public function decodeStatus($encodedStr){
        $decoded = base64_decode($encodedStr);
        //$iconverted = iconv('cp1251', 'utf-8', $decoded);

        $decodedUtf8 = mb_convert_encoding($decoded, "utf-8", "windows-1251");
        echo $decodedUtf8;

        $chars = str_split($decodedUtf8);
        foreach ($chars as $char){
            $bits[] = decbin(ord($char));
        }
       return $bits;
    }

最终数组应包含 6 个元素,如下所示:

[
    1000000,
    10100000,
    10000000,
    10000000,
    10000100,
    10000010
]

有没有办法只用 PHP 转换它?你能给我一些指导吗?

4

1 回答 1

0

来源/编码与将(bin)字符串转换为十六进制字符串无关。这是您的字符串的另一种表示法:

$inputString = "\x80\x20\x80\x80\x84\x82";

用于转换为十六进制 bin2hex:

$hexString = bin2hex($inputString);

var_dump($hexString);
//string(12) "802080808482"

编辑:要转换为 Bin,您可以使用没有编码/解码功能的脚本。另一种变体:

$input = "\xd0\x82\xc2\xa0\xd0\x82\xd0\x82\xe2\x80\x9e\xe2\x80\x9a";

var_dump(bin2hex($input)); //string(28) "d082c2a0d082d082e2809ee2809a"

$binArray = [];
for($i=0; $i<strlen($input);$i++){
  $binArray[] = sprintf("%08b",ord($input[$i]));
}
var_dump($binArray);
于 2019-08-26T16:52:28.387 回答