admin 管理员组

文章数量: 887934

window系统默认编码格式GBK怎么理解?对我们在window 平台编码有什么影响呢?

在说明这个问题之前,我们先搞清楚 文件编码格式、编程语言中字节数组转字符串默认使用的编码格式、 操作系统默认的编码格式。

1.文件编码格式:指的是我们编写的代码保存的编码格式或者要读取文件的编码格式。

2.操作系统默认的编码格式:window 是GBK, Linux 是UTF-8。window 也是支持utf-8,只是需要特殊指定。还有一点win10  创建的文本文件默认都是UTF-8 编码(win7 GBK),这个和操作系统默认的编码格式 两码事。

3.编程语言的编码格式:比如说C++,java 语言,在我们需要将一个字节数组转成字符串时,默认使用的编码格式,这个编程语言会 以 当前操作系统的编码格式作为 默认的编码格式。这就是我们在window 下编程通常需要指定UTF-8 的原因。

说一个小案例: 使用C++读取一个 "日报.txt" 文件(内容utf-8编码),输出到控制台。

代码如下:

        QFile f("日报.txt");
        if(!f.open(QIODevice::ReadOnly|QIODevice::Text)){
             qDebug()<<"打开文件失败";
             return;
        }
        QTextStream is(&f); 
        //is.setCodec(QTextCodec::codecForName("utf-8"));
        QString txt="",str="";
        while(!is.atEnd()){
            is>>str;
            txt.append(str);
        }
        qDebug()<<txt;
        f.close();

 输出乱码,当修改 日报.txt 编码格式为GBK  , 输出正常:

  或者 明确指定字节数组转字符串使用 utf-8 也能正常输出。 代码为:

        is.setCodec(QTextCodec::codecForName("utf-8"));

总结:

      从上面的案例可以发现C++  byte数组转字符串时使用的就是操作系统编码GBK,而原数据是UTF-8 导致读取的数据乱码。

    当我们读取 文件、数据发生乱码时,要先确认原数据的编码格式,而数据传输IO流肯定是以字节(二进制数据)的形式,不会发生乱码,关键是从字节数组转字符这个过程 使用的编码是否正确。总之原数据是什么编码,读取要使用对应的编码。其实严格来讲上面说的并不是什么转码,只是数据的还原。真正的转码应该是 原始数据GBK编码,你给我转成UTF-8,完成这种功能需要自己根据2个套编码表对照转换。

本文标签: 格式 系统 window gbk