• 10794阅读
  • 12回复

[讨论]急!!!求一个方法实现判定打开文件的编码方式 [复制链接]

上一主题 下一主题
离线isaacedvr
 
只看楼主 倒序阅读 楼主  发表于: 2012-05-27
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("test.txt");
    if (file.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        QTextStream stream(&file);
        stream.setAutoDetectUnicode(1);
        stream.setGenerateByteOrderMark(1);
        stream.setCodec("gbk");
        //问题是在这能不能判定文件txt的编码格式求指教啊
//        stream.setCodec("utf8");
//        const QString &text = stream.readAll();
//        stream.seek(0);
//        stream.setCodec(QTextCodec::codecForName("gbk"));
//        stream.setGenerateByteOrderMark(true);
//        stream << text;
//        stream.seek(0);
        qDebug() << stream.readAll();
    }
    return 0;
}

在线只为求答案~~~~, 路过的Qt朋友们帮我看下,急用啊 愁死人啊,客户要求在导入windows 或linux 文件都可以实现正确读取,我们知道在windows里是 gbk ,而 linux 里是  utf8啊  这不是坑爹吗? 遇到同样的问题的qt 朋友顶下。单独的windows 和 linux 都实现了 我就想是有没有一个方法判定下编码。。。。用if 语句实现, 但是没能实现。


离线xiongyu

只看该作者 1楼 发表于: 2012-05-27
这个与QT无关吧。
一个文件的最前面三个字节,可以判断出该的编码类型:
    ANSI:        无格式定义;(第一个字节开始就是文件内容)
    Unicode:       前两个字节为FFFE;
    Unicode big endian: 前两字节为FEFF; 
    UTF-8:        前两字节为EFBB,第三字节为BF
为自己而已努力吧... 我的博客 http://xycode.org
离线iptton

只看该作者 2楼 发表于: 2012-05-28
UTF-8前面的BOM不一定存在,具体可以搜索一下BOM,简单点说BOM只是windows自家的约定 http://blog.csdn.net/thimin/article/details/1724393
[url] http://www.alloyteam.com/2012/05/web-front-end-tool-rythem-1/ [url]
离线dbzhang800

只看该作者 3楼 发表于: 2012-05-28
先把问题描述清楚再说吧。

1. 你标题和例子中试图说的问题。答案很简单:没有其他附加信息,你无法仅靠一个文本文件中获取起准确的编码信息。

2. 你大字强调的哪一段,倒是非常非常的简单。单独的window和linux都实现了,按你的描述,那不就是已经实现了么?
离线xuweistudy
只看该作者 4楼 发表于: 2012-05-28
很常见的一个问题:你把windows下的某些文件,拷贝到linux环境下,这个显示是否正确跟什么有关系呢?和文件文本编码以及阅读器(如vim)的显示编码都有关系的!只有2者编码匹配了,才能正确显示!如果你文件是以utf-8编码存储,在linux下vim显示编码方式也要支持中文显示,不然中文会是乱字符!
离线isaacedvr
只看该作者 5楼 发表于: 2012-05-29
回 1楼(xiongyu) 的帖子
恩 ,这个我知道。这样处理有点复杂,我想是能不能直接有个函数处理下就方便多了,希望以后的Qt版本能够处理下,因为这对于移植来说是遇到很正常的问题啊。哎。。。,没办法就按照您说的处理一下试一试,看看结果再问问你们。
离线dbzhang800

只看该作者 6楼 发表于: 2012-05-30
Re:回 1楼(xiongyu) 的帖子
引用第5楼isaacedvr于2012-05-29 22:59发表的 回 1楼(xiongyu) 的帖子 :
恩 ,这个我知道。这样处理有点复杂,我想是能不能直接有个函数处理下就方便多了,希望以后的Qt版本能够处理下,因为这对于移植来说是遇到很正常的问题啊。哎。。。,没办法就按照您说的处理一下试一试,看看结果再问问你们。

先把问题描述清楚再说吧。


1楼提到的本就是Qt默认支持的,即使自己手动处理也很简单。但是这些东西依然是无法解决 文本文件的编码的,而且应该和你问的问题也没有多大关系。
离线isaacedvr
只看该作者 7楼 发表于: 2012-05-30
问题是在用户导入文件时,我怎么检测到导入的文件是编码(ANSI   Unicode  Unicode big endian UTF-8)中的哪一个?最关键的问题是:用户导入文件时不知道是在那个平台(windows或linux),所以现在写程序时,没法判定是那个平台的编码的编码,所以造成这个问题,我没法处理啊。要是用户约定好:在那个平台下导入文件,问题就迎刃而解了。
离线dbzhang800

只看该作者 8楼 发表于: 2012-05-30
引用第7楼isaacedvr于2012-05-30 15:24发表的  :
问题是在用户导入文件时,我怎么检测到导入的文件是编码(ANSI   Unicode  Unicode big endian UTF-8)中的哪一个?最关键的问题是:用户导入文件时不知道是在那个平台(windows或linux),所以现在写程序时,没法判定是那个平台的编码的编码,所以造成这个问题,我没法处理啊。要是用户约定好:在那个平台下导入文件,问题就迎刃而解了。

平台肯定不是问题,你的程序是在哪个平台下运行,这是编译时就确定的,应该没有什么含糊的。

不过话说回来,一直没弄明白你想表述的问题。文本文件的编码和是windows还是linux关系也不大。

离线isaacedvr
只看该作者 9楼 发表于: 2012-06-04
终于,解决啦!我是用Qt的调试 ,跟踪内存的变化,最后发现的。可是我不知道为啥?问题是:windows新建的
*.txt ,在Linux和和 tiny6410用 Qtextstream 流读取时,每次读一个汉字,并且将其转化为utf8编码 代码:QByteArray str = text.toUtf8(); 发现str是3个字节 。而且 str[0] == (char)0xef && str[1] == (char)0xbf && str[2] == (char)0xbd
我就是用这个差异来判定用户导入的文件是在哪个平台(windows 或者 linux)的文件 ,进而问题解决了。希望上一楼的Qt朋友看到这个帖子能明白我前面说的意思,确实我的表达能力不是很高,有待提高。很感谢各位Qt朋友的帮助,完成了项目的主体。求高人点拨:为啥QByteArray str 里的 str[0] == (char)0xef && str[1] == (char)0xbf && str[2] == (char)0xbd总是这个?

下面是截图,希望帮你理解


离线maidisula

只看该作者 10楼 发表于: 2012-08-09
那如果utf8文件没有标示该怎样判断呢?
离线z_lwei
只看该作者 11楼 发表于: 2012-09-13
不知道问题解决没?
我是这么想的 读取文件字节流 有UTF编码为string 再用string的字节流于原始字节流比较
离线hying

只看该作者 12楼 发表于: 2012-09-14
在没有ROM的情况下,编码是可以猜的,既然说猜,那就是不一定正确的,文件越大,猜中的可能越大,这个我以前写过,网上应该也能找到代码。
快速回复
限100 字节
 
上一个 下一个