2015-03-13 107 views
0

项目好,我们有一个代码:Qt的utf8编码失败在Windows,但在Linux上工作

return QString("%1\u00B0%2' %3"). 
    arg(std::abs(data.longitude)/60). 
    arg(std::abs(data.longitude) % 60). 
    arg(data.longitude > 0 ? 'E' : 'W'); 

此字符串输出对象在QTableView中的细胞。问题在于它只能在Linux机器上正确打印度数符号,但是在打印方形的窗口上打印度数符号。如何解决它?

Qt 4.8,Windows XP。 Linux(任何发行版)。

UPD:

我们已经尝试任何事情,但QString::fromLatin1()只帮助了一点:在Windows现在打印正确程度的标志,而在Linux上,我们有额外的符号:

因此,目前我们有这样的“解决方案”:

return QString("%1%2%3' %4"). 
    arg(std::abs(data.longitude)/60). 
#if defined(Q_OS_WIN) 
    arg(QString::fromLatin1("\u00B0")). 
#else 
    arg("\u00B0"). 
#endif 
    arg(std::abs(data.longitude) % 60). 
    arg(data.longitude > 0 ? 'E' : 'W'); 

这是非常丑陋的,但它的工作原理。我很欣赏任何其他修复。

+0

由于字符串字面值是UTF8,所以应该使用'fromUtf8'。你为什么不呢? – 2015-03-13 14:32:55

回答

1

这或多或少是一个快乐的重合,unicode(在unix上赢得32位的16bit)代表latin1的有效0xb0。我会从它的wchar_t表示推断字符串像

return QString::fromWString(L"%1\u00B0%2' %3"). 
    arg(std::abs(data.longitude)/60). 
    arg(std::abs(data.longitude) % 60). 
    arg(data.longitude > 0 ? 'E' : 'W'); 

这应该在两个平台上工作,让您自由编码不具有​​在latin1的8位编码字符。

+0

这不是巧合 - Unicode的第256个代码点是根据设计从latin1直接映射的。 – 2015-03-14 03:31:18

+0

@MarkRansom可能是我表达得不好。它可能是由Unicode协会设计的,但如果我写了类似“\ u00B0”的东西,编译器会将其解释为我的平台上的utf-8序列0xc2 0xb0,该序列仍保存有效的0xb0 latin1代码。但是,如果我执行“\ u00c0”(带有latin1和unicode中的Grave的A),则utf-8序列为0xc3 0x80,0xc0字节消失。在其他平台上,这可能最终成为JIS,SJIS序列或其他。 – Oncaphillis 2015-03-14 08:35:42

相关问题