お世話になります。
文字コードについて調べている中で疑問に思ったことがあるので質問させていただきます。
文字コードには、符号化文字集合と文字符号化方式の構成要素がありますが、
なぜ文字集合で定めた値を直接使用せずに、さらに符号化方式で定めた値に変換して文字を表示するのでしょうか?
文字集合で定めたコードポイントを、そのまま扱って(符号化方式でエンコードしない)文字を表示する方が
分かりやすく効率が良いと思いました。
参照サイト:https://blog.shibayu36.org/entry/2015/09/14/102100
以上、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
シフト JIS の表問題をご存じですか?
シフト JIS で「表」という文字は 95 5C という二バイトになります。ところが、5C 一つだけだと、バックスラッシュを表します。そこで、文字列を頭から読んでいってバックスラッシュでエスケープするような方法の場合、ここにバックスラッシュがあると誤認してしまいます。
たとえばソースコードに "表"
と書いた場合、二番目のダブルクォーテーションマークが「表」の二バイト目の 5C によってエスケープされてしまって、引用符が閉じていないというエラーになります。
これを回避するためには、二バイト目の 5C がバックスラッシュではないと認識するために、コンパイラがシフト JIS に対応しなければいけません。シフト JIS は日本語専用の符号化方式なので、海外では無視されることも多く、海外のソフトを使うときには "表" のように文字によってエスケープを入れたり、あるいはそのソフトを使うのをあきらめたりしなければいけませんでした。
Unicode の符号化文字集合にも同じ問題が起こりえます。今まで特別な意味を持っていたコードが文字の一部として入り込んでくることにより、文字解析のアルゴリズムが煩雑になり、パフォーマンスが落ちたりバグの温床となったりします。
そこで符号化を工夫することにより、この問題を回避します。5C が問題なのであれば、5C をバックスラッシュ以外のところに出さなければいいのです。そうすれば、文字列を表すバイトコードを最初から順に見ていったとき、最初に出てきた 5C がバックスラッシュであることが保証されます。
例えば UTF-8 の場合は、そのような工夫をして、既存のテキストと互換性を保ちながらパフォーマンスを上げています。
ところが UTF-8 は、一文字のバイト数が不定です。例えばアルファベットは一バイトですが、「表」は三バイトになります。バイト数が不定ということは、文字列の中の十番目の文字が文字列の何バイト目にあるのかは、必ず最初から見ていかなければわからないということになります。
そこで Windows は UTF-16 を採用しました。この符号化方式であれば、一文字は必ず二バイトになっていたので、内部表現として扱いやすかったのです。現在では、文字の種類が増えてそれでは符号化しきれなくなり、必ず二バイトとは限らなくなったので、そのアドバンテージは無くなり、使う機会は減りつつあります。
他に四バイトなら全部入るだろうということで UTF-32 もありますが、アルファベットのみのテキストファイルが大きくなりすぎるのと、互換性が無くなるので、広く使われているとは言い難いところです。
このように、様々な考え方から、符号化が検討されています。
投稿2019/08/12 07:07
編集2019/08/12 07:21総合スコア28673
0
参照サイト
https://blog.shibayu36.org/entry/2015/09/14/102100
見てみました。
割とよく書かれているのではないかと思います。
(ネタ本、あまり好きじゃ無かったりするのですが)
文字集合で定めたコードポイントを、そのまま扱って(符号化方式でエンコードしない)文字を表示する方が分かりやすく効率が良いと思いました。
簡単には、文字集合で定めたコードポイントそのままでは、使えない場合があるという事です。符号化と言っても今、多くの人は、PC内部のコードと思う人も多いでしょうが、当初は通信を行うための符号化ですね。
通信経路によって、全てのコードが使えるとは限らないので、符号化となります。今の多くは 8bit = 1byteとして通信していますが、7bit=1byteも有ったりします。(そのため、通信系では、8bit = 1octet とする事も) その一方、今のPCの内部処理は、64bitだったり、、と。
それで、通信経路とかに依存しない コードポイント(文字集合)を決め、実際の使用は、符号化して使うという事になります。そして、符号化は、通信経路に最適にすべき、、でしょうが、過去との互換性などが絡み、、となります。
こんな感じでしょうか。
投稿2019/08/13 02:28
総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
文字集合で定めたコードポイントを、そのまま扱って(符号化方式でエンコードしない)文字を表示する方が
分かりやすく効率が良いと思いました。
それがされていないのは、1つには不可能だからです(後述)。別の解として、Unicodeを使い、UTF-32というのが1つの解ですが、何をするにも4バイト必要で、効率が悪いので今のところほとんど使われていません。
Unicodeでない符号化文字集合は、他の符号化文字集合と符号の重複があります。
例えば、JIS-X0208(いわゆる全角のJIS第一水準と第二水準)のあ
は、16進で24 22
ですが、これはJIS-X0201(半角英数仮名)での$"
という2文字と全く同じです。つまり、24 22
というデータがあった場合に、JIS-X0208のあ
なのか、JIS-X0201の$"
なのかはこの2バイトだけを見ても決められないと言うことです。
JIS規格内だけでこれなので、他国の符号化文字集合とも当然重複があります。これをなんとかするのが、ISO-2022というISO規格で、世界各国の複数の符号化文字集合を切り替えながら使う方式を定めています。
これにしたがって、JIS-X0208とJIS-X0201を1ないし2バイトで表現する方式がEUC-JPです。また、JIS-X0208とJIS-X0201(仮名以外)とUS-ASCIIの3種類をエスケープシーケンスで切り替えながら表現する方式がISO-2022-JPです。
(シフトJISはISO-2022を無視して作られた方式です)
「こういう切り替えとか面倒くさいよね、2バイトの符号化文字集合を新規で作って上手に割り当てれば全世界の文字を表せるのでは?で、そのまま(あなたのいうように)符号化文字集合をコードとして使おう」という考えで出来たのがUnicodeの元です。途中で「2バイトではやっぱり足りない」と分かって4バイトになっています。(最初から4バイトなら日中韓の漢字統合は不要だったんじゃ無いかと思いますが)
そうは言っても、US-ASCIIと互換性がないと普及しにくいということで作られたのがUnicodeのUTF-8表現です。これが出来たので、多分UTF-32は普及しないと思います。
投稿2019/08/12 09:32
総合スコア86260
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/12 12:45
2019/08/12 13:08
2019/08/13 01:22
2019/08/13 01:51
2019/08/13 02:11
2019/08/13 02:22
2019/08/13 02:41
2019/08/13 02:51
2019/08/13 03:39
2019/08/13 08:19
2019/08/13 10:26

0
一言でいうと、「話が逆」ですかね…。
素朴に文字コードを1個作った場合、「文字集合で定めたコードポイントを、そのまま扱って(符号化方式でエンコードしない)文字を表示する」ようなものができます。
で、その場合、文字集合・符号化方式という概念は生まれません。必要ないので。
でも世の中は複雑なので、様々な文字コードが作られます。
ここで、
- 新たに全く別の(例えば日本語に対して韓国語とかの)文字コードを作りたくなったとき、既存の文字コードの仕組みを変えずに流用すると楽です。
- 既存の文字コードが何か都合が悪くて(例えばステートフルだと面倒とか、バイト数と文字幅が揃ってたほうがいいとか)新しいものを作るとき、収録する文字のレパートリーは変える必要がありません。
そうしていくつもの文字コードが作られるとき、変わらない部分と変わる部分があることに気づきます。
1で変わらない部分が「符号化方式」、2で変わらない部分が「文字集合」です。
この概念があることで、「符号化方式EUCで、文字集合の違いでEUC-JPとEUC-KRがある」とか「文字集合JISに対して符号化方式の違いでISO-2022-JP・EUC-JP・Shift_JISがある」とか言えるようになります。
投稿2019/08/12 14:00
総合スコア3047
0
色々理由はありそうですが、utf-8などの文字符号化方式で優れているな、と思ったことがあって、
それは「文字の境界がすぐにわかる」ということです。 (参考)
これがないと、文字列データは先頭から厳密に文字区切りを意識しながら処理しないといけなくなります。
コードポイントそのままだと、区切りがすぐにはわからないのでこの状態になってしまい、色々な文字列処理とかでは結構不便になると思います。
※ 例えば、文字列の部分一致をしたいときに、単にバイト列の比較ではできない、ことになる
投稿2019/08/12 06:45
総合スコア948
0
まずはその参考サイトに挙げられているネタ元の書籍を読みましょう
又聞きレベルで質問されても、根本の理解には及ばないというのが見えてしまいます
まず、ユニコードという文字コード体型を理解することから始めましょう。
このユニコードでは1文字は何バイトで表現されるのかをまず調べてみることです。がんばってみてください。
投稿2019/08/12 06:41
総合スコア88168
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/12 12:45
2019/08/12 12:58
2019/08/13 01:48
2019/08/13 01:57
2019/08/13 02:03
2019/08/13 02:13
2019/08/13 02:14
2019/08/13 02:15
2019/08/13 02:36
2019/08/13 14:19