我正在尝试使用下面的函数打印一个字节序列,但是我遇到了一些奇怪的东西,比如字符0xED,这应该是一个带有急性的拉丁文小写字母,打印为 (一个奇怪的里面有问号的字符,好像无法打印一样)。是由于我的代码,还是我打印出来的控制台?
此外,代码是否正确,或者您将采取哪些不同的方法来改进它?
编辑:输出示例
1F 8B 08 00 00 00 00 00 97 86 22 0D 89 72 EC 04 ........ .."..r�.
由于
void printBytes(std::string string) {
QDebug qD = qDebug().nospace();
qD << "Printing string of size " << string.size() << "\n";
char buffer [3];
int j = 0;
std::string printable = "";
for (uint32_t i = 0; i != string.size(); ++i) {
snprintf(buffer, sizeof(buffer), "%02X", (unsigned char) string.at(i));
qD << buffer;
printable += QChar(string.at(i)).isPrint() ? string.at(i) : '.';
printable += j == 7 ? " " : "";
if (j == 15) {
qD << "\t" << printable.c_str() << "\n";
printable = "";
j = 0;
} else {
qD << (j == 7 ? " " : " ");
j++;
}
}
if (j != 0) {
qD << std::string((16-j) * 3, ' ').c_str() << "\t" << printable.c_str();
}
}
答案 0 :(得分:2)
特定八位字节(一个字节)是否显示特定字符完全取决于您的系统环境的区域设置。
Octet 0xED
确实是ISO-8859-1(或许是ISO-8859-15)语言环境中的字符。但是,例如,如果您的系统环境的语言环境是UTF-8(通常是所有现代操作系统的情况),则字符í将由多字节序列0xC3 0xAD
显示。
最可能的答案是您的操作系统(您未指定)不使用ISO-8859-n
语言环境,但可能是UTF-8
(或其他一些编码)。要么重新配置系统环境,要么为程序的输出使用UTF-8
(或正确的编码)。