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实现解析和编码
- 将八进制转义字符串解析为汉字
<?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"));
?>
- 将汉字编码为八进制转义字符串
<?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" ? '匹配' : '不匹配'; // 输出: 匹配
?>
- 更简单的方法(使用内置函数) 如果你只是想获取字符串的内部表示,可以使用以下方法:
<?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
?>
发表评论