QTextCodec::codecForLocale

QTextCodec::codecForLocale

 

    /*
     * QTextCodec::codecForLocale()->name() 默认名为 "System"
     * 在 Windows 系统上将基于本地区域使用对应的编码
     * 中文 Windows 系统一般是 GBK 编码, 中文 Linux 系统一般是 UTF-8 编码
     * 为了更好的跨平台,建议在代码中指明 codecForLocale 的编码
     * QTextCodec::codecForLocale 的作用有两个
     * 1. 指明与外部文件读写的时候使用的默认编码
     * 2. 向命令行输出信息(qDebug)使用的编码
     *
     * const char * 隐式转换为 QString 的过程中, 使用 QTextCodec::codecForCStrings 指定的编码
     * 使用 QObject::tr 将 const char * 隐式转换为 QString 的过程中, 使用 QTextCodec::codecForTr 指定的编码
     * Qt4.x 默认源文件的编码是 Latin-1
     * Qt5.x 默认源文件的编码是 UTF-8
     * Qt5.x 已经删除了 QTextCodec::codecForCStrings 和 QTextCodec::codecForTr 函数
     *
     * // 读取一个UTF-8字符串
     * QString utf8_s = QString::fromUtf8("这是一个UTF-8的字符串");
     * // 将QString转换为GBK格式的QByteArray字符数组
     * // QByteArray::data() 可以返回 const char *
     * QByteArray gbk_s = QTextCodec::codecForName("gbk")->fromUnicode(utf8_s);
     * // 然后再从GBK字符数组转换回QString
     * QString utf8_s2 = QTextCodec::codecForName("gbk")->toUnicode(gbk_s);
     *
     */
    QTextCodec * codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    qDebug() << QString::fromUtf8("设置本地系统编码为: %1").arg(QString::fromLatin1(QTextCodec::codecForLocale()->name()));
    qDebug() << QString::fromUtf8("提示: 在本地系统编码为 UTF-8 时, QString::fromLocal8Bit 等价于 QString::fromUtf8");

 

// 用 IODevice 方式打开文本文件
    QFile aFile(fileName);
    if ( ! aFile.exists() ) { // 文件不存在
        return false;
    }

    if ( ! aFile.open(QIODevice::ReadOnly | QIODevice::Text) ) { // 文件打开失败
        return false;
    }

    ui->textEditDevice->clear();
    aFile.seek(0);
    // 无法正常打开多字节(ANSI)的中文编码(GBK)文件
    // 无法正常打开UTF-16编码的文件
    // 只能正常打开UTF-8编码的文件
    ui->textEditDevice->setPlainText(QString::fromLocal8Bit(aFile.readAll()));
    /*
    ui->textEditDevice->clear();
    aFile.seek(0);
    while ( ! aFile.atEnd() ) {
        QByteArray line = aFile.readLine(); // 自动添加 \n
        QString str = QString::fromLocal8Bit(line); // 从字节数组转换为字符串
        str.truncate(str.length() - 1); // 截断给定索引处的字符串, 去除结尾处的 \n
        ui->textEditDevice->appendPlainText(str);
    }
    */
    aFile.close();

 

// 用 QTextStream 打开文本文件
    QFile aFile(fileName);
    if ( ! aFile.exists() ) { // 文件不存在
        return false;
    }

    if ( ! aFile.open(QIODevice::ReadOnly | QIODevice::Text) ) { // 文件打开失败
        return false;
    }

    QTextStream aStream(&aFile); // 用文本流读取文件内容
    // 自动检测文件的编码是否存在 UTF-8, UTF-16, or UTF-32 Byte Order Mark (BOM) 并根据检测到的信息选择对应的编码
    aStream.setAutoDetectUnicode(true); // 无法正常打开多字节(ANSI)的中文编码(GBK)文件

    ui->textEditStream->clear();
    aFile.seek(0);
    ui->textEditStream->setPlainText(aStream.readAll());
    /*
    ui->textEditStream->clear();
    aFile.seek(0);
    while ( ! aStream.atEnd() ) {
        QString str = aStream.readLine();
        ui->textEditStream->appendPlainText(str);
    }
    */
    aFile.close();

 

============= End

 

 

 

 

 

你可能感兴趣的:(QTextCodec::codecForLocale)