【问题标题】:Printing sequence of bytes打印字节序列
【发布时间】: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,然后才能显示。

标签: c++ qt


【解决方案1】:

特定八位字节(一个字节)是否显示特定字符​​完全取决于您的系统环境的语言环境。

Octet 0xED 确实是 ISO-8859-1(或 ISO-8859-15,也许)语言环境中的字符 í。但是,例如,如果您的系统环境的语言环境是 UTF-8(所有现代操作系统通常都是这种情况),则字符 í 将由多字节序列 0xC3 0xAD 显示。

最可能的答案是您的操作系统(您没有指定)没有使用ISO-8859-n 语言环境,但可能是UTF-8(或其他一些编码)。要么重新配置你的系统环境,要么使用UTF-8(或正确的编码)作为你程序的输出。

【讨论】:

  • 是的,我的控制台使用的是 UTF8,我认为我自己的代码将字符显示为 UTF8 会更有意义。我该怎么做?
  • 好吧,通过将UTF-8 八位字节序列(对应于您要显示的字符)写入std::cout。与显示ISO-8859-1 编码字符的过程完全相同。
  • 对不起,我不关注。我只想在行的右侧打印可打印的字符,例如,wireshark 所做的那样,但是,即使 isPrint() 返回 true,它也是不可打印的。那么我应该怎么做才能使它可打印,或者我做错了什么?
  • 我在我的 OP 中添加了一个输出示例
  • 我不确定你在问什么。为了打印 i-grave 字符,您的代码只需要发出 0xC3 0xAD,而不是 0xED。看起来还算清楚。如果您询问如何从 ISO-8859-n 转换为 UTF-8,请使用 iconv 库。谷歌一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2021-07-05
  • 2021-10-01
相关资源
最近更新 更多