Qt 5 で全角文字を半角に変換する #01

きっかけ

実は仕事で扱っている、あるテキストデータの日付の項目に「03/27」と全角で書いてあって5回くらいためいきをついた後のつぶやきなのですが、Qt には全角英数を半角化したり、ひらがなをカタカナに変換するような機能はありません。

変換するコードを書いてみる

unicode の FF00~FFEF(.pdf)0000~007F(.pdf) を参考に全角の記号と数字、アルファベット(大文字と小文字)を半角にするコードを書くと以下のようになります。

static QString fullWidth2halfWidth(const QString &str)
{
    QString ret = str;

    for (ushort i = 0xFF01; i < 0xFF5F; ++i) {
        ret = ret.replace(QChar(i), QChar(i - 0xFEE0));
    }

    return ret;
}

全角カタカナ、全角句読点も変換や、逆変換も同じようなコードで対応できるでしょう。

ICU を使おう

Qt 5 での大きな変更のひとつに、ICU の採用があります。ICU とは Unicode と Globalization をサポートするライブラリで、Qt 5 では、言語依存の文字列ソート などで使われいて、今後も 様々な機能を提供する予定 になっています。

ICU の機能の中のひとつに Transform というものがあり、以下のような変換が可能になっています。

  • 大文字化
  • 小文字化
  • 先頭だけ大文字化
  • 全角化
  • 半角化
  • 正規化
  • 16進数化、文字名変換
  • ある言語からある言語への変換

これらの変換は、ICU のデモサイト を開くとブラウザで簡単に試せるようになっています。

というわけで、QString にメソッドをひとつ追加して、こういった変換できるようにしてみました。

使い方

WIP: POC: add QString::transliterate() このパッチを当てて Qt 5 をビルドしなおしてください。

qDebug() << QString::fromUtf8("03/23").transliterate(QStringLiteral("Fullwidth-Halfwidth"));
// "03/23"
qDebug() << QString::fromUtf8("ソーシャル アップデート").transliterate(QStringLiteral("Fullwidth-Halfwidth"));
// "ソーシャル アップデート"
qDebug() << QString::fromUtf8("キャンパス").transliterate(QStringLiteral("Katakana-Latin"));
// "kyanpasu"

API や実装などには改善の余地がたくさんありますが、こういう感じで簡単に使えると本当に便利ですね。

おすすめ