【发布时间】:2016-11-15 07:13:37
【问题描述】:
我正在尝试使用下面的函数打印一个字节序列,但是我遇到了一些奇怪的事情,例如字符 0xED,它应该是一个带有锐音的拉丁小写字母 i,打印为 �(一个奇怪的里面带问号的字符,好像不能打印一样)。是因为我的代码,还是我打印的控制台?
另外,代码是否正确,或者您会采取哪些不同的措施来改进它?
编辑:输出示例
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();
}
}
【问题讨论】:
-
字符集不匹配。您正在尝试使用字符集 Y 在显示环境中打印字符集 X 中的字符,并且“y”字符集没有该特定字符字形,或者该字符集的字符无效。
-
也许您应该考虑打印数值而不是字符?
-
Qt 假定 UTF-8 用于字节范围的表示。您假设 Latin-1。有你的问题。如果您知道您的输入是 Latin-1,则必须先转码为 UTF-8,然后才能显示。