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