• 6205阅读
  • 6回复

[提问]linux下qt读取linux本地utf8编码文件和读取windows记事本文件乱码问题 [复制链接]

上一主题 下一主题
离线maidisula
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-09
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
我的程序是在Linux系统下开发,在嵌入式linux系统运行,要读一个文件,并显示其中的文字
代码


在主函数里是这样设置的:

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));    
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));


获取文件并显示的函数:



bool MenuManager::getAdText(QString fileName)
{
    bool ret = false;
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text) == true)
    {
               QTextCodec *m_codec = QTextCodec::codecForName("GB18030");
#if 1
        QTextStream in(&file);
        in.setCodec(m_codec);        //进行从GB18030到utf8的转换
        m_adText = in.readLine();
#else
        QTextStream in(&file);       //不进行转换,直接显示
        m_adText = in.readLine();
#endif
        ret = true;
    }
    else
    {
        ret = false;
    }


    file.close();


    qDebug()<<"MenuManager::getAdText adtext==="<<m_adText;
    return ret;
}
现在的问题是:
1.如果我读取的是linux本地utf8文件的话,那么不转换的话可以直接显示中文,进行转换的话显示的就是乱码
2..如果我读取的是windows记事本文件的话,那么不转换显示的是乱码,进行转换的话可以正常显示中文


那么问题就是我不知道程序要读取的文件时utf8编码的还是gbk编码的,因为从服务器传来的文件我也不知道是什么编码的
所以请问大家,有什么方法可以自适应文件编码吗?
                        qt有判断文件是什么编码的方法吗?或者不是qt自带的也行。
                        如果有的utf8文件没有前三个字节的标示又该怎样判断吗?


非常感谢大家。



离线dbzhang800

只看该作者 1楼 发表于: 2012-08-09
严格来说,这个东西没有办法做到,现在没有,以后也不会用。

单靠一个纯文本文件是不可能准确判断出其编码的
离线maidisula

只看该作者 2楼 发表于: 2012-08-09
非常感谢dbzhang800老师的回复
那么如果我不追求准确的判断,用
http://www.qtcn.org/bbs/read-htm-tid-12711.html
提到的3中方法可以吗?

那种方法更好呢?


还有上边函数里的 QTextCodec *m_codec = QTextCodec::codecForName("GB18030");语句
因为QTextCodec 的指针式不能delete的,那么我反复调用这个函数会不会有内存泄露呢


非常感谢



离线maidisula

只看该作者 3楼 发表于: 2012-08-10
这样使用会内存泄漏吗?
离线maidisula

只看该作者 4楼 发表于: 2012-08-13
这样反复初始化会内存泄漏吗?
离线dbzhang800

只看该作者 5楼 发表于: 2012-08-13
引用第4楼maidisula于2012-08-13 10:43发表的  :
这样反复初始化会内存泄漏吗?

不会,详见
http://blog.csdn.net/dbzhang800/article/details/6615612
离线maidisula

只看该作者 6楼 发表于: 2012-08-14
回 5楼(dbzhang800) 的帖子
感谢dbzhang800老师的回复
那么什么情况下才会触发QTextCodec的析构函数呢?

是在调用QTextCodec *m_codec = QTextCodec::codecForName("GB18030");函数的结尾吗?
就像局部对象一样,函数结束就自动调用析构函数了。

还是一直调用内存会增加,但是qt会在某个时候把它析构。

感谢
快速回复
限100 字节
 
上一个 下一个