utf8字节码和人类可阅读文本转换

2025-06-10 20:03:00
丁国栋
原创 16

utf8字节码和人类可阅读文本转换

通过git ls-tree HEAD命令列出树对象的内容(当前目录下的文件)时,如果目录或文件是中文的,那么git可能会出现乱码的情况。要解决这个问题可以使用“git config --global core.quotepath false”,不对0x80以上的字符进行quote,可以解决git status/commit时中文文件名乱码的问题。

分析这些疑似乱码的字符串,例如"\344\272\244\344\273\230\346\226\207\346\241\243",它对应四个汉字,每个汉字有三个字节组成,每个字节是一个八进制转义字符。

这个字符串实际上是用八进制转义序列表示的中文字符。它对应四个汉字:"交付文档"。

PHP实现解析和编码

  1. 将八进制转义字符串解析为汉字
<?php
// 八进制转义字符串
$octalString = "\344\272\244\344\273\230\346\226\207\346\241\243";
// 直接输出即可看到汉字
echo $octalString; // 输出: 交付文档
// 或者使用json_encode查看Unicode表示
echo json_encode($octalString); // 输出: "\u4ea4\u4ed8\u6587\u6863"
// 或者使用json_decode获取中文字符
echo json_decode(json_encode("\344\272\244\344\273\230\346\226\207\346\241\243"));
?>
  1. 将汉字编码为八进制转义字符串
<?php
function chineseToOctalEscape($str) {
    $result = '';
    $length = mb_strlen($str, 'UTF-8');
    for ($i = 0; $i < $length; $i++) {
        $char = mb_substr($str, $i, 1, 'UTF-8');
        $code = uniord($char);
        // 将Unicode码点转换为UTF-8字节序列
        if ($code <= 0x7F) {
            $bytes = [$code];
        } elseif ($code <= 0x7FF) {
            $bytes = [
                0xC0 | ($code >> 6),
                0x80 | ($code & 0x3F)
            ];
        } elseif ($code <= 0xFFFF) {
            $bytes = [
                0xE0 | ($code >> 12),
                0x80 | (($code >> 6) & 0x3F),
                0x80 | ($code & 0x3F)
            ];
        } else {
            $bytes = [
                0xF0 | ($code >> 18),
                0x80 | (($code >> 12) & 0x3F),
                0x80 | (($code >> 6) & 0x3F),
                0x80 | ($code & 0x3F)
            ];
        }
        // 将字节转换为八进制转义序列
        foreach ($bytes as $byte) {
            $result .= '\\' . decoct($byte);
        }
    }
    return $result;
}
// 辅助函数:获取字符的Unicode码点
function uniord($u) {
    $k = mb_convert_encoding($u, 'UCS-2BE', 'UTF-8');
    $k1 = ord(substr($k, 0, 1));
    $k2 = ord(substr($k, 1, 1));
    return $k2 + ($k1 << 8);
}
// 测试
$chinese = "交付文档";
$octalString = chineseToOctalEscape($chinese);
echo $octalString; // 输出: \344\272\244\344\273\230\346\226\207\346\241\243
echo PHP_EOL;
echo $octalString === "\344\272\244\344\273\230\346\226\207\346\241\243" ? '匹配' : '不匹配'; // 输出: 匹配
?>
  1. 更简单的方法(使用内置函数) 如果你只是想获取字符串的内部表示,可以使用以下方法:
<?php
function stringToOctalEscape($str) {
    $result = '';
    $len = strlen($str);
    for ($i = 0; $i < $len; $i++) {
        $char = $str[$i];
        $ord = ord($char);
        // 只对非ASCII字符或特殊字符进行转义
        if ($ord < 32 || $ord > 126) {
            $result .= '\\' . decoct($ord);
        } else {
            $result .= $char;
        }
    }
    return $result;
}
$chinese = "交付文档";
echo stringToOctalEscape($chinese); // 输出: \344\272\244\344\273\230\346\226\207\346\241\243
?>
发表评论
博客分类