C++文字コードのお話

C++使うときに文字コードをどうするのかという話から、文字列周辺のクラスのお話に。
36
Maxしぐれん @Sigureya

なぜか文字コードの設定がマルチバイト文字になっていて面倒なことになっていた。 const char*がsjisになっていたっぽい。

2012-08-18 18:17:58
Maxしぐれん @Sigureya

MSVCはビルド設定をUNICODEにしてもconst char*のリテラル文字列はsjisにしてくる。 ひどい、これはひどい。

2012-08-18 18:26:03
Maxしぐれん @Sigureya

てっきりUTF-8にしてくれるかと思ったけど、sjis。 これは完璧に予想外。

2012-08-18 18:26:35
Maxしぐれん @Sigureya

以前MSVCがUnicode対応残念とは聞いたけど、ここまでひどいとは予想していなかった。

2012-08-18 18:27:49
重巡洋艦 キノガッサ @TKinugasa

@Sigureya TCHAR(とそれ絡みのAPI)をWCHARにマッピングしてくれるだけですね。確か。

2012-08-18 18:28:20
Maxしぐれん @Sigureya

@TKinugasa TCHARがらみだけとは悲しいです。

2012-08-18 18:30:24
Maxしぐれん @Sigureya

つまるところstd::stringはstd::basic_string<sjis_char_t>だったと。 charの文字コードがどうなるかはある程度環境依存だった気がするけど。

2012-08-18 18:31:53
若年寄(もう若くない) @kikairoya

@Sigureya 文字列リテラルの符号化方法は実装依存だし、UNICODEはプリプロセッサマクロでしかない。Unicode文字列リテラルが欲しければワイド文字列を使わないといけないし、CP932に無い文字を書きたいならソースファイル自体をUTF-16で書かないといけない

2012-08-18 18:32:27
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

その動作自体は規格準拠なのでそれでVC++責めても仕方ない。 RT @Sigureya: 以前MSVCがUnicode対応残念とは聞いたけど、ここまでひどいとは予想していなかった。

2012-08-18 18:35:15
若年寄(もう若くない) @kikairoya

というかMSVCがUnicode対応残念ってどの世界のMSVCの話だ

2012-08-18 18:35:43
江添亮 @EzoeRyou

@Sigureya C++11にはUTF-8文字列リテラルがあります。u8"..."ただし、charの配列なので通常の文字列リテラルと型で区別はできません。

2012-08-18 18:37:07
Maxしぐれん @Sigureya

文字コードは奥が深い←無理解に対する言い訳。

2012-08-18 18:37:35
江添亮 @EzoeRyou

@kikairoya この世界のMSVCです。MSVC11でもC++11のUSCリテラルには対応していないと聞いています。他の二大主要C++コンパイラーは対応しているのに。

2012-08-18 18:39:07
江添亮 @EzoeRyou

@bolero_MURAKAMI 私もその件で掛け合ったのですが、基本的に、charとは、文字というよりも、バイト単位のバイナリデータをいれるものであるという認識があるらしいのです。

2012-08-18 18:40:01
江添亮 @EzoeRyou

@bolero_MURAKAMI まあ、糞なことに変わりはない。

2012-08-18 18:40:18
若年寄(もう若くない) @kikairoya

@EzoeRyou 他の二大主要コンパイラーはCP932で書かれたソースファイル中の文字列リテラルを自動的にUnicodeに変換する機能はありません

2012-08-18 18:40:29
江添亮 @EzoeRyou

通常の文字リテラルとUTF-8文字リテラルと、及びその文字列リテラルは、型で区別できるべきだった。

2012-08-18 18:41:15
Maxしぐれん @Sigureya

@EzoeRyou どちらもcharですか… typedefで表明するぐらいしかないようですね。

2012-08-18 18:41:40
若年寄(もう若くない) @kikairoya

char8_tとか別に無くても、それが本当に必要なら「エンコーディング情報を持った文字・文字列型」を定義すべきだし、char16_tとかも実際要らん

2012-08-18 18:41:42
江添亮 @EzoeRyou

@kikairoya ソースファイルの文字コードは規定されていません。現時点で、UCSのエンコードではない文字コードは、互換性のためだけに使うべきで、今から書くソースコードをCP932にするというのは、そもそも間違っています。

2012-08-18 18:43:09
じょい @joy1192

文字コードなー…。C++で文字コード扱うの難しすぎると思うんだが、どっかに上手くラップしたライブラリとかあるんかな。

2012-08-18 18:44:28
江添亮 @EzoeRyou

@kikairoya そんなコア言語側にも組み込まれた賢い型は、よほどの事情がない限りC++では採用されないでしょう。

2012-08-18 18:44:46
若年寄(もう若くない) @kikairoya

はーこれだから現実も話の流れも見てない奴は

2012-08-18 18:44:50
1 ・・ 7 次へ