1- # [ WIP ] 6.4 string型②とchar型
1+ # 6.4 string型②とchar型
22
3- string は 、実際には文字の配列であると捉えると、文字列に対する操作を行うことができる。
3+ stringは 、実際には文字の配列であると捉えると、文字列に対する操作を行うことができる。
44
55一度、アルファベットと数字・一部の記号だけ、いわゆる「** 1バイト文字** 」のみで考えよう。ひらがなやカタカナについては後で説明する。
66
@@ -22,24 +22,24 @@ for (int i=0; i<s.size(); i++) {
2222
2323## 6.4.1. バイト・ビット
2424
25- ** ビット** (bit) は、1ビットは ` 0 ` か ` 1 ` かの情報のみを持つ。
25+ ** ビット** (bit) は、1ビットは` 0 ` か ` 1 ` かの情報のみを持つ。
2626
2727** バイト** (Byte) は、パソコンが一般的に処理するデータの単位。基本的に 8bit = 1Byte。
2828よくスマホの通信量とかの「キロバイト」等のバイトはこれを指している。
2929
30- 8bit なので 、1バイトで扱える情報は ` 0 ` から ` 255 ` の256($=2^8$)種類である。
30+ 8bitなので 、1バイトで扱える情報は` 0 ` から ` 255 ` の256($=2^8$)種類である。
3131
3232## 6.4.2. char 型
3333
34- 文字1文字を扱う時は、 ` char ` 型を用いる。
34+ 文字1文字を扱う時は、` char ` 型を用いる。
3535
3636``` cpp:line-numbers
3737string s = "Hello";
3838char c = s[1];
3939cout << c << endl; // output: e
4040```
4141
42- 1文字を扱う時は、` '' ` (** シングル** クォーテーション)で囲う。
42+ 1文字を扱う時は、` '' ` (** シングル** クォーテーション)で囲う。
4343
4444``` cpp:line-numbers
4545string s = "traP";
@@ -50,18 +50,18 @@ cout << s << endl; // output: traQ
5050
5151## 6.4.3. ASCII
5252
53- 各文字には、文字コード(ASCIIコード)と呼ばれる番号が定められていて、内部的に char 型には数値が格納されている。
53+ 各文字には、文字コード(ASCIIコード)と呼ばれる番号が定められていて、内部的に` char ` 型には数値が格納されている。
5454
5555``` cpp:line-numbers
5656char c = 'e';
5757int a = c;
5858cout << a << endl; // output: 101
5959```
6060
61- ASCII コード表 :https://e-words.jp/p/r-ascii.html
61+ ASCIIコード表 :https://e-words.jp/p/r-ascii.html
6262ここで、アルファベットは順番に並んでいるという事実は覚えておくと良い。
6363
64- 逆に、char に数値を代入によって文字を代入することもできる 。
64+ 逆に、charに数値を代入によって文字を代入することもできる 。
6565
6666``` cpp:line-numbers
6767char c = 81;
@@ -70,19 +70,19 @@ cout << c << endl; // output: Q
7070
7171## 6.4.4. 文字の比較
7272
73- 4 .4.3. によれば、1文字1文字は、実際は数値として扱われているのであった。よって、数値と同じように扱えるということは、以下のように比較できるということである。
73+ 6 .4.3.によれば、1文字1文字は、実際は数値として扱われているのであった。よって、数値と同じように扱えるということは、以下のように比較できるということである。
7474
7575``` cpp:line-numbers
7676cout << ('A' < 'B') << endl;
7777```
7878
7979ここで、アルファベットはASCIIコード上で順番に並んでいるということを思い返すと、
80- ` ('A' <= x && x <= 'Z') ` で「文字$x$が大文字アルファベットかどうか」が判定できる。
81- 更にこれと for 文をうまく使えば 、(アルファベットの)辞書順でどちらが先かを実装することができるだろう。
80+ ` ('A' <= x && x <= 'Z') ` で「文字$x$が大文字アルファベットかどうか」が判定できる。
81+ 更にこれとfor文をうまく使えば 、(アルファベットの)辞書順でどちらが先かを実装することができるだろう。
8282
8383::: tip
8484
85- 実際には、文字列の辞書順で先かどうかは、` < ` ` > ` の不等号演算子で簡単に実装できる。
85+ 実際には、文字列の辞書順で先かどうかは、` < ` 、 ` > ` の不等号演算子で簡単に実装できる。
8686
8787``` cpp:line-numbers
8888string s = "Hello";
@@ -95,7 +95,7 @@ cout << (s < t) << endl;
95950
9696```
9797
98- string 型同士で比較するときに 、1文字目を比較→同じなら2文字目を比較→… という処理を行って比較されている。
98+ string型同士で比較するときに 、1文字目を比較→同じなら2文字目を比較→… という処理を行って比較されている。
9999
100100:::
101101
@@ -107,11 +107,10 @@ string 型同士で比較するときに、1文字目を比較→同じなら2
107107
108108ところで、ASCIIコード表には日本語特有の文字(ひらがな・カタカナ・漢字)が存在しないことに気づくだろうか。
109109
110- これは1バイトで扱える情報が 256 通りしかないから 、日本語は1バイトだけでは扱うことができない。
110+ これは1バイトで扱える情報が256通りしかないから 、日本語は1バイトだけでは扱うことができない。
111111それゆえ、日本語(ひらがなカタカナ等)はマルチバイト文字で表現されている(複数バイトで1文字を表す方式)。
112112
113- ここで、` char ` 型は、正確には「1バイトの整数型」である。よって、` char `
114- 型ではひらがな等の字を扱うことができない。実際に試してみると、5文字なのに長さは15と表示されてしまうし、1文字目を出力してみようと思ってもうまく出力されない。例えば「こ」の場合は、3文字出力してようやく「こ」が表示されるのである。
113+ ここで、` char ` 型は、正確には「1バイトの整数型」である。よって、` char ` 型ではひらがな等の字を扱うことができない。実際に試してみると、5文字なのに長さは15と表示されてしまうし、1文字目を出力してみようと思ってもうまく出力されない。例えば「こ」の場合は、3文字出力してようやく「こ」が表示されるのである。
115114
116115``` cpp:line-numbers
117116string dame = "こんにちは";
@@ -128,7 +127,7 @@ cout << dame[0] << dame[1] << dame[2] << endl;
128127```
129128
130129多バイト文字を扱える型も存在するが、非常に扱いが面倒なのでここでは扱わない。
131- C++ 以外の言語でも大体は文字列を扱えるが、マルチバイト文字に対する扱いは言語によってまちまちだったりするので、よく調べること。
130+ C++以外の言語でも大体は文字列を扱えるが、マルチバイト文字に対する扱いは言語によってまちまちだったりするので、よく調べること。
132131
133132::: tip
134133
@@ -138,15 +137,15 @@ C++ 以外の言語でも大体は文字列を扱えるが、マルチバイト
138137
139138** 歴史的な経緯**
140139
141- ASCII では日本語文字を扱えないのは明らかだったので 、1文字で2バイトを使う文字コード体系が考案された。2バイトであれば
142- $2^{16}=65536$ 文字を扱えるので、これだけあれば十分だという事である。
140+ ASCIIでは日本語文字を扱えないのは明らかだったので 、1文字で2バイトを使う文字コード体系が考案された。2バイトであれば
141+ $2^{16}=65536$文字を扱えるので、これだけあれば十分だという事である。
143142しかし、結果としては国内で文字コードが乱立し(Shift-JIS, EUC-JP
144143等…)、様々衝突するようになった上、国内にとどまらず各国で独自の文字コードが作成されてしまい、混乱を極めてしまったのである(ASCII
145144で表せないのは日本語だけではなく、アラビア文字・簡体字・ギリシャ文字など様々…)。
146145
147146最終的には、世界の全文字を扱う文字コードとして Unicode (≒ UTF-8)
148- が策定され、今日ではこれが普及している。しかし完全に普及している訳でもなく、よって、今日見かける文字化けはもっぱら「UTF-8 か
149- UTF-8 以外か 」の文字コードを使って発生しているパターンである。
147+ が策定され、今日ではこれが普及している。しかし完全に普及している訳でもなく、よって、今日見かける文字化けはもっぱら「UTF-8か
148+ UTF-8以外か 」の文字コードを使って発生しているパターンである。
150149
151150** CJK 問題**
152151
@@ -160,7 +159,5 @@ UTF-8 以外か」の文字コードを使って発生しているパターン
160159:::
161160
162161::: tip
163- ` int ` 型は 4バイトの整数型である。扱える情報は $2^{32}$ で、整数は負と正の値を取るから非負整数の部分にに $2^{31}$
164- 個を割り当てる。$2^{31}=2147483648
165- $ なのだが、実はこの値は既にテキストで一度出現している。さてどこだろうか?
162+ ` int ` 型は4バイトの整数型である。扱える情報は$2^{32}$で、整数は負と正の値を取るから非負整数の部分に$2^{31}$個を割り当てる。$2^{31}=2147483648$なのだが、実はこの値は既にテキストで一度出現している。さてどこだろうか?
166163:::
0 commit comments