お久しぶりです。
ご無沙汰しておりました私です。
つい先ほど、遂にその瞬間が訪れました。
私の脳みそが文字コードというものが何なのか理解したのです。
今までの経験からの断片的な情報が理解の邪魔をしていたようです。
メモ帳の文字コード設定欄にある"Unicode"項目とVisualStudioの設定項目の表記は死罪に値します。
とりあえず神解説サイトのリンクを貼っておきます。
さて、理解したというところまでは良いのですが、問題は山積みです。
VisualStudioで「Unicode文字セットを使用する」を選択した場合、まずUnicodeが使用されることは明白で、どうやらutf-16が使用されるらしいというのはわかりましたが、「マルチバイト文字セットを使用する」を選択した場合、マルチバイトなのは確定ですが、Unicodeなのか?それ以外なのか?VisualStudioの言語設定によって違うのか?(例えば日本語版VisualStudioならShift−JISでドイツ語版VisualStudioならドイツ語用の文字コードなのか?)そもそも設定する必要がないのか?(ソースコードのファイルに書かれてる文字列データをそのまま使うからファイルの保存方法次第?実行時に外部ファイルを読み込んで処理するとき外部ファイルの文字エンコーディングはコンパイル時に不明だから設定しても意味がない?)よくわかりません。
とりあえず、VisualStudioさんは設定項目名を今すぐ「ワイド文字」と「マルチバイト文字」に変更すべきです。
今日、やっと文字コードを理解した
Re: 今日、やっと文字コードを理解した
WindowsがUTF16をUnicodeと表記するのは有名なクソ仕様ですね。
Visualc++は2013までUnicodeに厳密には対応していませんし。2015で対応するようですがね。
Visualc++は2013までUnicodeに厳密には対応していませんし。2015で対応するようですがね。
Re: 今日、やっと文字コードを理解した
u系のプリフィックスは使えないし、char16_tとかはただのtypedefだし、u系stringはtypedefのtypedefだしで、悲惨ですよ。constexprとUnicode関係の対応はひどい。
2015では一応Unicodeは全対応するみたいですね。
2015では一応Unicodeは全対応するみたいですね。
Re: 今日、やっと文字コードを理解した
メモ帳の表示について書くなら,時間軸は押さえた方がよいかと。
Unicodeが2.0になって16bitの文字集合でなくなりUTF-16が出来たのが1996年。
元々Unicodeを文字集合として使っていたWindows NTの,4.0が出たのが同じ1996年。既に3.1, 3.5, 3.51といったバージョンが出荷されていました。
UTF-16が出来る前に16bitのUnicodeスカラ値をそのまま使う符号化方式の名前は(現在も)なく,代わりにUnicodeという名前を使ったのだと思います。
そして,今現在に於いてもUTF-16よりもUnicodeの方が通りがよいこと,あとは後方互換性もあって,Unicodeという表示のままになっているのだと思います。
Unicodeが2.0になって16bitの文字集合でなくなりUTF-16が出来たのが1996年。
元々Unicodeを文字集合として使っていたWindows NTの,4.0が出たのが同じ1996年。既に3.1, 3.5, 3.51といったバージョンが出荷されていました。
UTF-16が出来る前に16bitのUnicodeスカラ値をそのまま使う符号化方式の名前は(現在も)なく,代わりにUnicodeという名前を使ったのだと思います。
そして,今現在に於いてもUTF-16よりもUnicodeの方が通りがよいこと,あとは後方互換性もあって,Unicodeという表示のままになっているのだと思います。
Re: 今日、やっと文字コードを理解した
「ユニコード文字列を使用する」にすると「wchar_t」が、「マルチバイト文字列を使用する」と「char」が使われてます。
そのためにVisual Studio では マルチバイト/ユニコード対応できるように「TCHAR」が用意されています。
そのためにVisual Studio では マルチバイト/ユニコード対応できるように「TCHAR」が用意されています。
Re: 今日、やっと文字コードを理解した
Win32 APIのWとAの切り替えも含むから「セット」で良いのではないかなあ。
むしろ文字列側ではなくAPIに向けた設定だと思うのですがどうでしょう。
嫌なら自前で使い分けることもできるわけですし。
ANSI=CP932ってことは、ANSIって日本語版ウィンドウズにしかないのか。
中国語とかむかしはどうやって表示していたのだろう。
むしろ文字列側ではなくAPIに向けた設定だと思うのですがどうでしょう。
嫌なら自前で使い分けることもできるわけですし。
ANSI=CP932ってことは、ANSIって日本語版ウィンドウズにしかないのか。
中国語とかむかしはどうやって表示していたのだろう。
Re: 今日、やっと文字コードを理解した
いや,違います。ISLe さんが書きました:ANSI=CP932ってことは、ANSIって日本語版ウィンドウズにしかないのか。
中国語とかむかしはどうやって表示していたのだろう。
ANSIは,ANSIコードページの利用を意味します。
日本語版WindowsであればシステムデフォルトはCP932ですし,英語版であればCP1252になります。
英語圏では本当にANSIだったものの,他の言語圏ではANSIではないにも関わらず,用語を変更しなかったためにできた混乱の種だとは思います。
ちなみに,ANSIコードページの対義語はOEMコードページで,日本語環境では関係しないですが,英語環境ではCP437などが代表的なコードページになります。