如何在QTextEdit中显示扩展的ascii字符

how to display extended ascii character in QTextEdit

本文关键字:扩展 ascii 字符 显示 QTextEdit      更新时间:2023-10-16

所有大于127的ASCII代码都被Diamond替换?象征如何显示这些字符。我有一个无符号字符缓冲区[1024],它包含从0到256的值。

使用QString类的fromAscii()方法。默认情况下,这将把128以上的Ascii字符视为Latin-1字符。要更改此行为,请使用QTextCodec::setCodecForCStrings方法为您的使用设置正确的编解码器。

我相信QT5可能已经去掉了setCodecForCStrings方法。

编辑:Adnan提供了setCodecForCStrings方法的QT5替代方案,为完整性添加了答案。

setCodecForCStrings的Qt5替代方案是QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

这是一个没有尽头的兔子洞。Qt不完全支持打印ascii>127,因为它没有很好地定义。当前的方法是使用"fromLocal8bit()",它将获取一个char数组并将其转换为"正确"的Unicode字符串(Qt唯一支持打印的东西)。

QTextCodec::setCodecForLocale可用于标识要从中转换的字符集。支持许多编解码器,但由于某种原因,IBM437(美国IBM PC使用了几十年的字符集)不受支持,而欧洲等国家使用的其他几种编解码器也不受支持。也许IBM437中的某些字符从未在Unicode中分配过适当的代码点,所以转换它是不可能的?

令人沮丧的是,有些字体包含所有256个ascii代码点,但根本不可能在Qt中显示这些字体,因为它们只适用于Unicode字符串。有一些字形他们不支持,而且它似乎随着Qt的更新版本而增长。目前我知道9、10、12、13和173。其中一些原因是显而易见的(通常你不想打印回车符,尽管它确实存在于DOS中),但其他一些过去在Qt中工作,现在不行了。

在我的应用程序中,我采用了创建一种新字体的方法,该字体在更高的unicode代码点中复制了不可打印的字形,并在将其打印到屏幕上之前对其进行翻译。这很傻,但Qt多年前就放弃了ascii,所以这是我能找到的最好的选择。