QTextCodec Class
QTextCodec クラスは、テキストエンコーディング間の変換を提供します。詳細...
Header: | #include <QTextCodec> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core5Compat) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
qmake: | QT += core5compat |
注意:このクラスの全ての関数はリエントラントです。
- setCodecForLocale(QTextCodec *c)
- ~QTextCodec()
注意:これらの関数もスレッドセーフです:
- codecForName(const QByteArray &name)
- codecForMib(int mib)
- availableCodecs()
- availableMibs()
- codecForLocale()
パブリック型
パブリック関数
virtual QList<QByteArray> | aliases() const |
bool | canEncode(QChar ch) const |
bool | canEncode(QStringView s) const |
bool | canEncode(const QString &s) const |
QByteArray | fromUnicode(const QString &str) const |
QByteArray | fromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state = nullptr) const |
QByteArray | fromUnicode(QStringView str) const |
QTextDecoder * | makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const |
QTextEncoder * | makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const |
virtual int | mibEnum() const = 0 |
virtual QByteArray | name() const = 0 |
QString | toUnicode(const QByteArray &a) const |
QString | toUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const |
QString | toUnicode(const char *chars) const |
静的パブリックメンバ
QList<QByteArray> | availableCodecs() |
QList<int> | availableMibs() |
QTextCodec * | codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) |
QTextCodec * | codecForHtml(const QByteArray &ba) |
QTextCodec * | codecForLocale() |
QTextCodec * | codecForMib(int mib) |
QTextCodec * | codecForName(const QByteArray &name) |
QTextCodec * | codecForName(const char *name) |
QTextCodec * | codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec) |
QTextCodec * | codecForUtfText(const QByteArray &ba) |
void | setCodecForLocale(QTextCodec *c) |
保護された関数
QTextCodec() | |
virtual | ~QTextCodec() |
virtual QByteArray | convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const = 0 |
virtual QString | convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const = 0 |
詳しい説明
Qt は文字列の保存、描画、操作に Unicode を使用します。多くの場面で、異なるエンコーディングを使用するデータを扱いたいと思うかもしれません。例えば、ほとんどの日本語ドキュメントはまだ Shift-JIS や ISO 2022-JP で保存されていますし、ロシア語ユーザはしばしば KOI8-R や Windows-1251 でドキュメントを保存しています。
QtはQTextCodecクラスのセットを提供し、Unicode以外のフォーマットをUnicodeに変換したり、Unicodeから変換したりするのに役立ちます。また、独自のコーデッククラスを作成することもできます。
サポートされているエンコーディングは
- Big5
- Big5-HKSCS
- CP949
- EUC-JP
- EUC-KR
- GB18030
- HP-ROMAN8
- IBM 850
- IBM 866
- IBM 874
- ISO 2022-JP
- ISO 8859-1から10まで
- ISO 8859-13から16まで
- Isci-Bng、Dev、Gjr、Knd、Mlm、Ori、Pnj、Tlg、Tml
- KOI8-R
- KOI8-U
- マッキントッシュ
- シフトJIS
- TIS-620
- TSCII
- UTF-8
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF-32
- UTF-32BE
- UTF-32LE
- Windows-1250~1258
QtがICUサポートを有効にしてコンパイルされている場合、ICUでサポートされているほとんどのコーデックもアプリケーションで利用できます。
QTextCodecを使用して、ローカルでエンコードされた文字列をUnicodeに変換することができます。ロシア語のKOI8-Rエンコーディングでエンコードされた文字列があり、それをUnicodeに変換したいとします。簡単な方法はこうだ:
QByteArray encodedString = "..."; QTextCodec *codec = QTextCodec::codecForName("KOI8-R"); QString string = codec->toUnicode(encodedString);
この後、string
はユニコードに変換されたテキストを保持します。文字列をUnicodeからローカルのエンコーディングに変換するのも簡単です:
QString string = "..."; QTextCodec *codec = QTextCodec::codecForName("KOI8-R"); QByteArray encodedString = codec->fromUnicode(string);
データをネットワーク経由で受信する場合など、チャンク単位で変換しようとする場合には、若干の注意が必要です。このような場合、マルチバイト文字が2つのチャンクに分割される可能性があります。この場合、せいぜい1文字が失われる程度で、最悪の場合、変換全体が失敗する可能性があります。
このような状況で使用するアプローチは、コーデック用にQTextDecoder オブジェクトを作成し、このQTextDecoder をデコードプロセス全体に使用することです:
QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); QTextDecoder *decoder = codec->makeDecoder(); QString string; while (new_data_available()) { QByteArray chunk = get_new_data(); string += decoder->toUnicode(chunk); } delete decoder;
QTextDecoder オブジェクトはチャンク間の状態を維持するため、マルチバイト文字がチャンク間で分割されても正しく動作します。
独自のコーデック・クラスの作成
QTextCodecのサブクラスを作成することで、新しいテキストエンコーディングのサポートをQtに追加することができます。
純粋な仮想関数はシステムにエンコーダを記述し、コーダはQTextStream でサポートされているさまざまなテキストファイル形式や、X11 ではロケール固有の文字の入出力に必要に応じて使用されます。
Qt に別のエンコーディングのサポートを追加するには、QTextCodec のサブクラスを作成し、以下の表に示す関数を実装してください。
関数名 | 説明 |
---|---|
name() | エンコーディングの正式名称を返します。そのエンコーディングがIANA character-sets encoding file にリストされている場合、その名前はそのエンコーディングの優先 MIME 名でなければなりません。 |
aliases() | エンコーディングの代替名のリストを返します。QTextCodec は、空のリストを返すデフォルトの実装を提供します。例えば、"ISO-8859-1" は "latin1", "CP819", "IBM819", "iso-ir-100" をエイリアスとして持っています。 |
mibEnum() | そのエンコーディングがIANA character-sets encoding ファイルに記載されている場合は、そのエンコーディングの MIB enum を返します。 |
convertToUnicode() | 8 ビット文字列を Unicode に変換します。 |
convertFromUnicode() | () Unicode 文字列を 8 ビット文字列に変換します。 |
QTextStream 、QTextDecoder 、およびQTextEncoderも参照してください 。
メンバ型ドキュメント
[alias]
QTextCodec::ConversionFlags
定数 | 説明 |
---|---|
DefaultConversion | フラグは設定されません。 |
ConvertInvalidToNull | このフラグが設定されている場合、各無効な入力文字はヌル文字として出力されます。 |
IgnoreHeader | Unicodeのバイトオーダマークは無視され、何も生成されません。 |
[alias]
QTextCodec::ConverterState
メンバ関数説明
[protected]
QTextCodec::QTextCodec()
QTextCodec を構築し、最も高い優先順位を与える。QTextCodec は常にヒープ上に(つまりnew
で)構築されなければなりません。Qt が所有権を持ち、アプリケーションの終了時に削除されます。
[virtual noexcept protected]
QTextCodec::~QTextCodec()
QTextCodec一旦作成されたコーデックはQtの責任になります。
警告:警告:この関数はリエントラントではありません。
[virtual]
QList<QByteArray> QTextCodec::aliases() const
サブクラスは、コーデックのエイリアスを返すことができます。
コーデックの標準的なエイリアスはIANA character-sets encoding file にあります。
[static]
QList<QByteArray> QTextCodec::availableCodecs()
利用可能なすべてのコーデックのリストを、名前で返します。その名前のQTextCodec を取得するには、QTextCodec::codecForName() を呼び出してください。
コーデックに別名がある場合、リストには同じコーデックが多数含まれる可能性があります。
注意:この関数はスレッドセーフです。
availableMibs()、name()、aliases()も参照 。
[static]
QList<int> QTextCodec::availableMibs()
利用可能なすべてのコーデックのMIBのリストを返す。MIB のQTextCodec を取得するには、QTextCodec::codecForMib() を呼び出します。
注:この関数はスレッドセーフである。
availableCodecs() およびmibEnum()も参照 。
bool QTextCodec::canEncode(QChar ch) const
Unicode 文字ch がこのコーデックで完全にエンコードできる場合はtrue
を返し、そうでない場合はfalse
を返す。
bool QTextCodec::canEncode(QStringView s) const
これはオーバーロードされた関数です。
Unicode 文字列s がこのコーデックで完全にエンコードできる場合はtrue
を返し、そうでない場合はfalse
を返します。
bool QTextCodec::canEncode(const QString &s) const
これはオーバーロードされた関数です。
s には、エンコード可能かどうかテストされる文字列が含まれます。
[static]
QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec)
BOM(バイトオーダーマーク)とcontent-typeメタヘッダをチェックすることによって、与えられたバイト配列ba 、提供されたHTMLのスニペットのエンコーディングを検出しようとし、ユニコードにhtmlをデコードすることができるQTextCodec インスタンスを返します。提供されたコンテンツからコーデックが検出できない場合は、defaultCodec が返される。
codecForUtfText()も参照のこと 。
[static]
QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba)
これはオーバーロードされた関数です。
BOM (Byte Order Mark) と content-type メタヘッダをチェックすることで、指定されたバイト配列ba に含まれる HTML のスニペットのエンコーディングを検出し、html を unicode にデコードできるQTextCodec インスタンスを返します。コーデックが検出できない場合、このオーバーロードは Latin-1QTextCodec を返す。
[static]
QTextCodec *QTextCodec::codecForLocale()
このロケールに最も適したコーデックへのポインタを返します。
コーデックは、そのバックエンドが使用されている場合はICUから取得しますが、そうでない場合はOS固有のAPIから取得します。後者の場合、コーデックの名前は "System "となる。
注意:この関数はスレッドセーフである。
setCodecForLocale()も参照のこと 。
[static]
QTextCodec *QTextCodec::codecForMib(int mib)
MIBenum mib にマッチするQTextCodec を返す。
注意:この関数はスレッドセーフである。
[static]
QTextCodec *QTextCodec::codecForName(const QByteArray &name)
インストールされているすべてのQTextCodec オブジェクトを検索し、name に最もマッチするものを返す。name という名前に一致するコーデックが見つからない場合は、nullptr
を返します。
注意:この関数はスレッドセーフです。
[static]
QTextCodec *QTextCodec::codecForName(const char *name)
インストールされているすべてのQTextCodec オブジェクトを検索し、name に最もよくマッチするものを返します。name という名前に一致するコーデックが見つからない場合は、nullptr
を返します。
[static]
QTextCodec *QTextCodec::codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec)
提供されたスニペットba のエンコーディングを BOM (Byte Order Mark) を使って検出し、テキストを unicode にデコードできるQTextCodec インスタンスを返します。この関数は、以下のコーデックのいずれかを検出することができます:
- UTF-32 リトルエンディアン
- UTF-32 ビッグエンディアン
- UTF-16 リトルエンディアン
- UTF-16 ビッグエンディアン
- UTF-8
提供されたコンテンツからコーデックが検出できない場合は、defaultCodec が返されます。
codecForHtml()も参照 。
[static]
QTextCodec *QTextCodec::codecForUtfText(const QByteArray &ba)
これはオーバーロードされた関数です。
提供されたスニペットba のエンコーディングを BOM (Byte Order Mark) を使って検出し、テキストを unicode にデコードできるQTextCodec インスタンスを返します。この関数は、以下のコーデックのいずれかを検出することができます:
- UTF-32 リトルエンディアン
- UTF-32 ビッグエンディアン
- UTF-16 リトルエンディアン
- UTF-16 ビッグエンディアン
- UTF-8
提供されたコンテンツからコーデックが検出できない場合、このオーバーロードは Latin-1QTextCodec を返します。
codecForHtml()も参照 。
[pure virtual protected]
QByteArray QTextCodec::convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const
QTextCodec サブクラスはこの関数を再実装しなければなりません。
input 配列から最初のnumber 文字を Unicode からサブクラスのエンコーディングに変換し、結果をQByteArray で返します。
state nullptr
この場合、変換はステートレスであり、デフォルトの変換ルールが使用されるべきである。 が でない場合、コーデックは変換後の状態を に保存し、構造体の と メンバを調整する必要があります。state nullptr
state remainingChars
invalidChars
[pure virtual protected]
QString QTextCodec::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const
QTextCodec サブクラスはこの関数を再実装しなければなりません。
chars の最初のlen 文字をサブクラスのエンコーディングから Unicode に変換し、結果をQString で返します。
state には を指定できます。この場合、変換はステートレスで、デフォルトの変換ルールが使用されるべきです。 が でない場合、コーデックは変換後の状態を に保存し、構造体の と メンバを調整する必要があります。nullptr
state nullptr
state remainingChars
invalidChars
QByteArray QTextCodec::fromUnicode(const QString &str) const
str をUnicodeからこのコーデックのエンコーディングに変換し、その結果をQByteArray で返します。
QByteArray QTextCodec::fromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state = nullptr) const
input 配列からの文字の最初のnumber を、Unicode からこのコーデックのエンコーディングに変換し、結果をQByteArray で返します。
使用されたコンバーターのstate が更新されます。
QByteArray QTextCodec::fromUnicode(QStringView str) const
これはオーバーロードされた関数です。
str を Unicode からこのコーデックのエンコーディングに変換し、結果をQByteArray で返します。
QTextDecoder *QTextCodec::makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
char *
データのチャンクをデコードして Unicode データのチャンクを作成するために、指定されたflags でQTextDecoder を作成します。
返されたオブジェクトを削除するのは呼び出し側の責任です。
QTextEncoder *QTextCodec::makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
flags を指定 し てQTextEncoder を作成 し 、 Unicode デー タ の塊 をchar *
デー タ と し てエン コ ー ド し ます。
返されたオブジェクトの削除は呼び出し側の責任です。
[pure virtual]
int QTextCodec::mibEnum() const
QTextCodec のサブクラスは、この関数を再実装しなければならない。この関数は MIBenum を返します(詳しくはIANA character-sets encoding file を参照してください)。QTextCodec の各サブクラスは、この関数に対して正しい一意の値を返すことが重要です。
[pure virtual]
QByteArray QTextCodec::name() const
QTextCodec サブクラスはこの関数を再実装する必要があります。この関数は、サブクラスがサポートするエンコーディングの名前を返します。
コーデックがIANA character-sets encoding ファイルに文字セットとして登録されている場合、このメソッドはコーデックに好ましい MIME 名を返すべきです。
[static]
void QTextCodec::setCodecForLocale(QTextCodec *c)
コーデックをc に設定する。これはcodecForLocale() で返される。c がnullptr
の場合、コーデックはデフォルトにリセットされます。
これは、ロケールの設定に独自の機構を使いたいアプリケーションには必要かもしれません。
警告:この関数はリエントラントではない。
codecForLocale()も参照のこと 。
QString QTextCodec::toUnicode(const QByteArray &a) const
このコーデックのエンコーディングからa を Unicode に変換し、その結果をQString で返します。
QString QTextCodec::toUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const
このコーデックのエンコーディングからinput の最初のsize 文字を Unicode に変換し、結果をQString で返します。
使用されたコンバーターのstate が更新されます。
QString QTextCodec::toUnicode(const char *chars) const
これはオーバーロードされた関数です。
chars にはソース文字が含まれます。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。