C++0xでの標準ライブラリを使った文字コード変換

規格はN3225の22.3.3.2, 22.5 あたりを読むといいです。 N3225 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3225.pdf
7
@rshhh

char -> UTF-16 の変換はstd::codecvtでできるっぽい?

2011-02-19 03:13:11
pepshiso @pepshiso

@rshhh implementation defined のはず

2011-02-19 03:14:06
pepshiso @pepshiso

@rshhh 少なくとも C++03 の場合は。

2011-02-19 03:14:34
@rshhh

http://ideone.com/ynXmn こんなんで通るのか・・・?

2011-02-19 04:21:34
@rshhh

@pepshiso implementation defined かー。外部のライブラリを使わないで変換したいんですよね。

2011-02-19 04:34:21
ツイッター @haroperl

basic_ifstreamのコンストラクタには、wchar_tを受け取るものがないのかな。代わりに、openメンバ関数を使えと。

2011-02-21 04:00:32
pepshiso @pepshiso

@haroperi openでもワイド文字受けないですよ

2011-02-21 04:02:40
ツイッター @haroperl

@pepshiso 確かに探してもないみたいですね。これは、ファイル名はchar *で渡せって事なんでしょうか……

2011-02-21 04:07:15
pepshiso @pepshiso

@haroperi または、環境依存のファイルIOを使うかですね。ワイド文字使った時点で移植性が崩壊するのでWindowsにしか対応しないと開き直るとかどうでしょう。

2011-02-21 04:09:22
ツイッター @haroperl

@pepshiso 最終的には環境依存になっちゃうんですね。char *をwifstreamのコンストラクタに渡すことにしました。とりあえず上手くいってます。ありがとうございます。ちなみに環境はMacです。別の環境で運用する予定だから、また文字コードで嵌りそうで怖いですけど。

2011-02-21 04:22:04
pepshiso @pepshiso

ワイド文字のエンコーディング実装依存なので……。

2011-02-21 04:21:36
pepshiso @pepshiso

C++0x の普及に期待するしか。

2011-02-21 04:22:00
@rshhh

@pepshiso あれ?C++0xだとワイド文字をうまい具合に扱えるような標準ライブラリの規格とかあるんでしたっけ。

2011-02-21 04:23:03
pepshiso @pepshiso

@rshhh ワイド文字はそのままですけど char16_t とか char32_t とか、utf-* の文字列リテラルとかが入ります。システムのエンコーディングがバラバラなのは変わらないので、銀の弾丸じゃないんですけど。

2011-02-21 04:26:34
@rshhh

@pepshiso ああ・・・!u16string <-> string の相互変換とかって、どうなってるのかご存じないですか?

2011-02-21 04:39:58
pepshiso @pepshiso

@rshhh うーん、codecvt まわりは詳しくないですが、あまり希望は持ってません。なぜかというと、従来は char のエンコーディングが1種類の実装依存のものであることが、標準のエンコーディング変換関数を使うなら必要なはずです。(続く)

2011-02-21 04:49:58
pepshiso @pepshiso

ん、なんか変なこと言ってるな。

2011-02-21 04:51:53
pepshiso @pepshiso

@rshhh えーっと…… n3225 の 22.3.3.2 を読んで教えてください

2011-02-21 04:53:59
@rshhh

@pepshiso standard code-conversion facet std::codecvt<Elem, char, std::mbstate_t> を満たす codecvtのオブジェクトをwstring_convertに渡してやれば (つづく)

2011-02-21 05:00:43
@rshhh

@pepshiso wstring_convert::to_bytes() でワイド文字に対応したマルチバイトのバイト列のシーケンスに変換できるって書いてありますね

2011-02-21 05:01:41
@rshhh

@pepshiso というか、これはアレだ、std::wstring と std::string (内部ではwchar_t と char )の変換をするための規格じゃないですか? C++0xで入る、char16_t と char との相互変換とはちょっと違う気がする

2011-02-21 05:03:55
pepshiso @pepshiso

いや、22.5にそれらしきものが

2011-02-21 05:05:35
@rshhh

@pepshiso あーいや、忘れてください、22.5に Elem is the wide-character type, such as wchar_t, char16_t, or char32_t. ってのがありました。

2011-02-21 05:06:35
pepshiso @pepshiso

codecvt_utf16 とか codecvt_utf8_utf16 かなあ

2011-02-21 05:07:43
pepshiso @pepshiso

@rshhh あー、そんな感じでしたね。問題はたぶん2つあって(1)文字列リテラルとかのエンコーディングが実装依存(2)charは実装依存のエンコーディングとUTF-8の2つのエンコーディングを持つと期待されることですね

2011-02-21 05:04:05