【问题标题】:How to convert Windows-1251 string to HEX in PHP如何在 PHP 中将 Windows-1251 字符串转换为 HEX
【发布时间】:2019-12-30 19:01:08
【问题描述】:

我有一个 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 转换它?你能给我一些指导吗?

【问题讨论】:

  • $encodedStr 也是 base64 编码的吗?
  • @whydoubt 是的,这样我就可以通过javascript安全地发送字符串了。

标签: php hex windows-1251


【解决方案1】:

来源/编码与将(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);

【讨论】:

  • 我不确定如何将我的字符串转换为“This is another notation for your string”。有帮助吗?如果我尝试直接用bin2hex 转换它,我会得到“d082c2a0d082d082e2809ee2809a”,这不是我需要的。
  • 如果你使用 bin2hex 这个 "d082c2a0d082d082e2809ee2809a" 是 $inputString = "\xd0\x82\xc2\xa0\xd0\x82\xd0\x82\xe2\x80\x9e\xe2\x80\ x9a"; . var_dump(bin2hex($inputString) === "d082c2a0d082d082e2809ee2809a"); //bool(true)
  • 而且“d082c2a0d082d082e2809ee2809a”不是我需要的。因此,我认为 windows-1251 编码存在一些错误。在您的第一个示例中,您以这种格式对 $inputString 进行了硬编码。问题是最初我有这个 - “ЂЂЂ„‚”
  • @jspit 所说的重要部分是“使用没有编码/解码功能的脚本”。 @happybit 在您的代码中,将 $chars = str_split($decodedUtf8); 更改为 $chars = str_split($decoded); 并删除有关 $decodedUtf8 的所有内容。
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2020-11-13
  • 2018-03-20
  • 1970-01-01
  • 2014-07-03
  • 2016-08-28
  • 2011-11-25
相关资源
最近更新 更多