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

时间:2013-11-22 22:18:50

标签: c++ qt unicode ascii

所有大于127的ASCII码都被Diamond取代?符号。如何显示这些字符。我有一个 unsigned char buffer [1024] ,它包含0到256之间的值。

2 个答案:

答案 0 :(得分:2)

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

我相信QT5可能已经取消了setCodecForCStrings方法。

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

  

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

答案 1 :(得分:0)

这是一个没有尽头的兔子洞。由于定义不正确,Qt不完全支持大于127的打印ascii。当前方法是使用“ fromLocal8bit()”,它将获取一个char数组并将其转换为“正确的” Unicode字符串(Qt唯一支持打印的内容)。

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

令人沮丧的是,有些字体具有全部256个ascii代码点,但是由于它们仅适用于Unicode字符串,因此根本不可能在Qt中显示这些字体。它们不支持少数字形,并且它随着Qt的更新版本而增长。目前,我知道9、10、12、13和173。其中一些原因很明显(通常您不希望打印回车字形,尽管它确实在DOS中存在),但是其他一些则可以在Qt,现在没有。

在我的应用程序中,我求助于创建一种新字体,该字体以较高的unicode码点包含不可打印字形的副本,并在将它们打印在屏幕上之前进行翻译。这很愚蠢,但是Qt在多年前放弃了ascii,所以这是我能找到的最佳选择。