ユーザーブロマガは2021年10月7日(予定)をもちましてサービスを終了します

作りかけだけど一応忘備録
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

作りかけだけど一応忘備録

2014-08-26 02:15
    最近私のPSO2支部がブラック企業になりました。

    こんばんは祖肉です。

    今回はただの忘備録だよ!楽しくないよ!

    まるぺけさんのところとかを参考に未だにちまちまと
    プログラムをしている私ですが、
    とりあえずC++標準機能のstd::stringをワイド文字サポートしようと
    自作してみてます。

    とりあえずstringと同じように扱えるようにしたいなーとは思いつつも、
    そうはできそうにない雰囲気。

    SonikStringの構想:
    1. 内部の文字列はUTF-8として持つ(まるぺけさんのところを参考に)
    2. 関数でwchar_tで取得、マルチバイト文字列のchar* で取得までサポート(今のところ)
    3. std::stringに近づけるために、operator = などもサポート。
    4. 比較演算子のサポート
    5. めんどくさいものはサポートしない(自己都合)
    6. 知らない文字コードのことは考慮しない。
    7. このソース内でのマルチバイト文字はshift-jisとする。

    今回一番つまりそうなところ:
    文字列変換
    比較演算子のサポート


    現状:
    文字列変換まで完成。


    自分用のライブラリだから別に手抜きでもいっかなとか思いつつやっている勢い。

    作成の最中、文字列変換ができたので記録しておきます。

    さて、コンピュータ上での文字列の中では、基本的に、3種類くらいに大別されるみたい。
    1. シングルバイト
    2. マルチバイト
    3. Unicode

    シングルバイトは半角カナを除くアルファベットやキーボード上にある記号を表すのに最適
    な文字列表現(と私は捉えているだけで、厳密にはたぶん違う)
    すべての文字列は、1byteで表現されます、

    マルチバイトは日本語などの、全角文字(半角カナは全角文字に含まれるっぽいです)を表現するために作成された文字列表現(と私は捉えてるだけd..ry)
    文字列は1byte~2byteで表現されます。

    Unicodeは全部表現できるようにがんばったけど、結局ややこしくなった。でもちょっとがんばったら大体標準のものができちゃったので、それを使おうみたいな勢いの文字列表現
    (と私は捉えt..ry)
    文字列はUTF-16であれば2byte, 32であれば 4byte
    utf-8 は1~7byteほどで表現されます。(utf-8の場合3byte以上は使わなさそうな感じ)

    で、今回のSonikStringは、Unicodeに分類される
    UTF-8
    UTF-16(32)
    と、
    マルチバイト
    シングルバイト
    に対応します。

    開発環境はEclipse 4.4(LUNA) のMingw x86 で作成します。VC++でも全然できます。
    VC++にしないのは汎用的に作るとなるとWindowな部品を取捨選択しないといけないからで
    別にEclipseにこだわる必要はありません。(あとは金銭的な面とか)

    下準備として Eclipseの C++コンパイラのその他のフラグに下記を追加しておきます。
    --exec-charset=cp932

    これはexeを作った時にそのexeではダブルクォーテーション("")で囲まれた文字列は、
    マルチバイトとして表現しますよ。って意味のフラグっぽい(そう勝手に解釈した)
    これをつけないとgccではすべて(値を見た感じ)UTF-8として扱っているみたいです。

    あと、よくgccでは、wchar_t型は4byteだ!とよくみかけますが、
    Mingw では __WCHAR_TYPE__(wchar_t) は short unsigned int となっていて、
    2byteのようです。( sizeof(wchar_t) でも確認。)
    でも4byteの環境もありそうなので、そこはソース内で吸収します。

    ここまでできたら
    マルチバイトかUTF-8かの判定関数を作成する。
    コンバートする関数を作る
    で変換完成です。

    書くの疲れたので今回はここまでにしよう。

    次回は覚えてたら判定関数の解説をメモります。







    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。