編集可能

C++文字コードのお話

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

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

2012-08-18 18:17:58
しぐれん(チキン) @Sigureya

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

2012-08-18 18:26:03
しぐれん(チキン) @Sigureya

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

2012-08-18 18:26:35
しぐれん(チキン) @Sigureya

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

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

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

2012-08-18 18:28:20
しぐれん(チキン) @Sigureya

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

2012-08-18 18:30:24
しぐれん(チキン) @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
Ryou Ezoe(江添 亮) @EzoeRyou

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

2012-08-18 18:37:07
しぐれん(チキン) @Sigureya

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

2012-08-18 18:37:35
Ryou Ezoe(江添 亮) @EzoeRyou

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

2012-08-18 18:39:07
Ryou Ezoe(江添 亮) @EzoeRyou

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

2012-08-18 18:40:01
対鉱物用武装 @kikairoya

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

2012-08-18 18:40:29
Ryou Ezoe(江添 亮) @EzoeRyou

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

2012-08-18 18:41:15
しぐれん(チキン) @Sigureya

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

2012-08-18 18:41:40
対鉱物用武装 @kikairoya

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

2012-08-18 18:41:42
Ryou Ezoe(江添 亮) @EzoeRyou

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

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

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

2012-08-18 18:44:28
Ryou Ezoe(江添 亮) @EzoeRyou

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

2012-08-18 18:44:46
対鉱物用武装 @kikairoya

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

2012-08-18 18:44:50
残りを読む(130)

コメント

Egtra (ysk-noh) @egtra 2012年8月18日
まとめを更新しました。
0
m5Knt @m5knt 2012年8月18日
bom付きじゃないソースはコードページ依存だったような
0
ELD-R-ESH-2 @eldesh 2012年8月18日
何言ってるか全然分からん…
0
順三朗 @junzabroP 2012年8月19日
ひとことでまとめると、C/C++の文字列リテラルの文字コードの扱いはクソ。
1
後藤寿庵 @juangotoh 2012年8月19日
ソースに日本語リテラルを書くなとあれほど(いやバリバリ書きますけどね)
0