QString を char* に型変換するには、まず QString::toLatin1()、QString::toUtf8() や QString::toLocal8Bit() などで QByteArray 型に変換します。
次に data() または constData() を呼出して、QByteArray オブジェクトに保存されている char* 型または const char* データへのポインタを取出します。
逆に、char* を QString に型変換するには、QLatin1String 型または const char* 型の実引数を取る QString コンストラクターを使うか、QString のスタティックメンバー関数 fromLatin1()、fromLocal8Bit() や fromUtf8() などの関数を使います。const char* 型の実引数を取る QString コンストラクターは、fromUtf8() 関数を使って変換するので、UTF-8 でエンコードされている場合に使えます。
main.cpp:
#include <QCoreApplication>
#include <QLocale>
#include <QDebug>
#include <iostream>
int main(int argc, char** argv)
{
QCoreApplication app(argc, argv);
const QString nativeCountryName = QLocale::system().nativeCountryName();
QLocale::system() でシステムロケールを取得し、nativeCountryName() を呼び出すと日本語環境では国名を日本語で返します。
QByteArray ba = nativeCountryName.toLocal8Bit();
const char* cp = ba.constData();
std::cout << "toLocal8Bit: " << cp << std::endl;
QString string = QString::fromLocal8Bit(cp);
qDebug() << "fromLocal8Bit:" << string;
QString::toLocal8Bit() 関数は、言語環境のエンコードでバイト列を格納した QByteArray オブジェクトを返します。
QByteArray::constData() は、内部のバイト列のアドレスを const char* 型で返します。
QByteArray::constData() を呼ぶ前に QByteArray 型の変数に一旦保存する必用があることに注意しましょう。
つまり、以下のようにすると cp を参照しようしたときには、データを保存している QByteArray オブジェクトが存在しなくなってしまっているので、アプリケーションがクラッシュするからです。
const char* cp = nativeCountryName.toLocal8Bit().toLatin1().data();
逆に、言語環境のエンコードのバイト列 const char* を QString に型変換するには、QString::fromLocal8Bit() を使います。
ba = nativeCountryName.toUtf8();
cp = ba.constData();
std::cout << "toUtf8: " << cp << std::endl;
string = QString::fromUtf8(cp);
qDebug() << "fromUtf8:" << string;
QString::toUtf8() 関数は、UTF-8 でエンコードされたバイト列を格納した QByteArray オブジェクトを返します。
逆に、UTF-8 でエンコードされたバイト列を QString に型変換するには、QString::fromUtf8() を使います。
const QString countryName("Japan");
ba = countryName.toLatin1();
cp = ba.constData();
std::cout << "toLatin1: " << cp << std::endl;
string = QString::fromLatin1(cp);
qDebug() << "fromLatin1:" << string;
}
QString::toLatin1() 関数は、Latin-1 でエンコードされたバイト列を格納した QByteArray オブジェクトを返します。
逆に、Latin-1 でエンコードされたバイト列を QString に型変換するには、QString::fromLatin1() を使います。
toLocal8Bit: 日本
fromLocal8Bit: "日本"
toUtf8: 日本
fromUtf8: "日本"
toLatin1: Japan
fromLatin1: "Japan"
Unix や Linux などの UTF-8 環境での実行結果です。
toLocal8Bit: 日本
fromLocal8Bit: "日本"
toUtf8: 譌・譛ャ
fromUtf8: "日本"
toLatin1: Japan
fromLatin1: "Japan"
Windows の SJIS 環境での実行結果です。toUtf8 が文字化けしているのは SJIS 環境で UTF-8 文字列を表示しようとしたためです。
サンプルコード
@@.zip
参考資料
@@