32
char32_tXpressiveH.23/11/05 Egtra Boost.勉強会#6 札幌

char32_tとXpressiveと

  • Upload
    egtra

  • View
    1.652

  • Download
    3

Embed Size (px)

DESCRIPTION

Boost.勉強会#6 札幌で発表したときのものです。

Citation preview

Page 1: char32_tとXpressiveと

char32_tとXpressiveと

H.23/11/05

Egtra

Boost.勉強会#6 札幌

Page 2: char32_tとXpressiveと

char32_tとXpressiveと

• Egtra

– @egtra

– http://dev.activebasic.com/egtra/

Page 3: char32_tとXpressiveと

char32_t……

• とchar16_t

– C++11の新しいデータ型

– typedefではない

– UTF‐32とUTF‐16

– 4バイトと2バイト

Page 4: char32_tとXpressiveと

char32_tとchar16_t

• 新しいデータ型

– void f(char c);

– void f(wchar_t c);

– void f(char16_t c);

– void f(char32_t c);

Page 5: char32_tとXpressiveと

char32_tとchar16_t

• リテラル

– char c = 'a';

– wchar_t c = L'a';

– char16_t c = u'a';

– char32_t c = U'a';

Page 6: char32_tとXpressiveと

char32_tとchar16_t

• リテラル

– char s1[] = "hoge";

– wchar_t s2[] = L"hoge";

– char16_t s3[] = u"hoge";

– char32_t s4[] = U"hoge";

– char s5[] = u8"hoge";

Page 7: char32_tとXpressiveと

char32_tとchar16_t

• リテラル

– char const* s1 = "foo";

– wchar_t const* s2 = L"foo";

– char16_t const* s3 = u"foo";

– char32_t const* s4 = U"foo";

– char const* s5 = u8"foo";

Page 8: char32_tとXpressiveと

char32_tとchar16_t

• std::basic_string<>

– std::string

– std::wstring

– std::u16string

– std::u32string

Page 9: char32_tとXpressiveと

char32_tとchar16_t

• どこで使える?

– GCC 4.4/4.5

– Clang 2.9

– Visual C++ 2010?

Page 10: char32_tとXpressiveと

char32_tとchar16_t

• Visual C++ 2010

– typedef!!!

– v11(次バージョン)でも変わらず

– u""やU""やu8""も非対応

Page 11: char32_tとXpressiveと

char32_tとchar16_t

• 以上

– 君も今日からchar16/32_t使い

– UTF‐16/32なデータのところにchar16/32_t使おう!

Page 12: char32_tとXpressiveと

char32_tとchar16_t

• 以上

– 君も今日からchar16/32_t使い

– 私は使っていません

•Visual C++ 2010なので……

Page 13: char32_tとXpressiveと

char32_tとchar16_t

• 以上と思った?

– 足りないものだらけですね

Page 14: char32_tとXpressiveと

char32_tとchar16_t (続)

• 入出力

– u16streamとかu32streamとか ありません

– 適当にtypedefしましょう

Page 15: char32_tとXpressiveと

char32_tとchar16_t (続)

• <codecvt>

– codecvt_utf8

•UTF‐8とUTF‐32

– codecvt_utf16

•UTF‐16とUTF‐32

– codecvt_utf8_utf16

Page 16: char32_tとXpressiveと

char32_tとchar16_t (続)

• UTF‐8のファイルをchar32_tとして読む

typedef basic_ifstream<char32_t>

u32ifstream;

u32ifstream ifs("hoge.txt");

locale loc(locale(),

new codecvt_utf8<char32_t>());

ifs.imbue(loc);

Page 17: char32_tとXpressiveと

char32_tとchar16_t (続)

• UTF‐8のファイルをchar32_tとして読む

typedef basic_ifstream<char32_t>

u32ifstream;

u32ifstream ifs("hoge.txt");

– 実はこれでいける(はず)

Page 18: char32_tとXpressiveと

char32_tとchar16_t (続)

• なぜ? std::locale::classic()

– 下を持っている

•codecvt<char, wchar_t>

•codecvt<char, char16_t>

•codecvt<char, char32_t>

Page 19: char32_tとXpressiveと

char32_tとchar16_t (続)

• 特殊化 codecvt<char, char16_t> codecvt<char, char32_t>

– UTF‐8とUTF‐16/32との変換

– これで揃った?

Page 20: char32_tとXpressiveと

char32_tとchar16_t (続)

• codecvtで可能な変換

– char(マルチバイト) ⇄ wchar_t (C++98/03)

– char (UTF‐8) ⇄ UTF‐16

– char (UTF‐8) ⇄ UTF‐32

– UTF‐16 ⇄ UTF‐32

Page 21: char32_tとXpressiveと

char32_tとchar16_t (続)

• マルチバイトとUTFの変換は?

–ない!

– iconvなどを使いましょう

Page 22: char32_tとXpressiveと

char32_tとchar16_t (続)

• wchar_tは?

– UTF‐16/32とは限らない

•例: ja_JP.eucJPな*BSD

Page 23: char32_tとXpressiveと

char32_tとchar16_t (続)

• マルチバイトとUTFの変換は?

– 解その2: Boost.Locale?

•今回は説明しません

Page 24: char32_tとXpressiveと

char32_tとchar16_t (続)

• std::basic_regex<>

– charとwchar_t版しかありません

•なのでBoost.Regex(ICU版)を使いましょう

Page 25: char32_tとXpressiveと

char32_tとchar16_t (続)

• 以上

Page 26: char32_tとXpressiveと

おまけ

• Boost.XpressiveでUTF‐32の 文字列を使いたい

– やっつけで対応させた

Page 27: char32_tとXpressiveと

おまけ

• traitsクラスを作る

– やっつけなので null_regex_traits<char32_t> から派生

struct u32_traits : …… {

Page 28: char32_tとXpressiveと

おまけ

• traitsクラスを作る

struct locale_type {};

Page 29: char32_tとXpressiveと

おまけ

• traitsクラスを作る

enum char_class {

InvalidClass = 0,

Lu = 1,

Ll = 1 << 1,

……

Page 30: char32_tとXpressiveと

おまけ

• traitsクラスを作る

NewLine = 1 << ……,

};

typedef boost::uint_value_t<

NewLine>::least_t

char_class_type;

Page 31: char32_tとXpressiveと

おまけ

• traitsクラスを作る

private:

static std::unordered_map<

char_type, char_class_type>

LoadCategoryMap();

– isctype内で使用

Page 32: char32_tとXpressiveと

おまけ

• traitsクラスを作る namespace Property {

boost::proto::terminal<

boost::xpressive::detail::

posix_charset_placeholder>::type

const L = {{"L", false}};

……