Unicode文字列が何文字あるかという問題
広告
八王子さん
(No.1)
【質問内容】
設問にある「それ以降のバイトは10で始まる」という点を考慮した答えになっていのでは?
【私の考え】
問題文には以下2つの条件が記載されています。
(1)「先頭バイト」は2進数で0もしくは11
(2)「それ以降」のバイトは2進数で10
つまり、問題文にある最初の16進数2バイト「CF 80」を例にすると、2進数表記にして
「先頭バイト」と「それ以降」
「1100(C) 1111(F)」と「1000(8) 0000(0)」
となり、
(1)の「先頭のバイトが11」の条件は「1100(C)」で当てはまっていることになります。
そして(2)の「それ以降のバイトが10」も「1000(8)」で当てはまっています。
よって「CF 80」は設問の条件を満たしていると分かります。
しかし問題文の文字列中盤にある「33 2E」は
「00110011 00101110」
となり、
1バイト目は0で(1)を満たしますが、それ以降(2バイト目)は10ではないので条件を満たしていません。
なぜ解説では(2)の条件を満たしていないものまでカウントして9文字としているのでしょうか?(2)の条件はこの問題を解くのに使われない条件なのでしょうか?
https://www.ap-siken.com/s/kakomon/24_haru/q4.html
設問にある「それ以降のバイトは10で始まる」という点を考慮した答えになっていのでは?
【私の考え】
問題文には以下2つの条件が記載されています。
(1)「先頭バイト」は2進数で0もしくは11
(2)「それ以降」のバイトは2進数で10
つまり、問題文にある最初の16進数2バイト「CF 80」を例にすると、2進数表記にして
「先頭バイト」と「それ以降」
「1100(C) 1111(F)」と「1000(8) 0000(0)」
となり、
(1)の「先頭のバイトが11」の条件は「1100(C)」で当てはまっていることになります。
そして(2)の「それ以降のバイトが10」も「1000(8)」で当てはまっています。
よって「CF 80」は設問の条件を満たしていると分かります。
しかし問題文の文字列中盤にある「33 2E」は
「00110011 00101110」
となり、
1バイト目は0で(1)を満たしますが、それ以降(2バイト目)は10ではないので条件を満たしていません。
なぜ解説では(2)の条件を満たしていないものまでカウントして9文字としているのでしょうか?(2)の条件はこの問題を解くのに使われない条件なのでしょうか?
https://www.ap-siken.com/s/kakomon/24_haru/q4.html
2024.01.27 08:58
jjon-comさん
★AP プラチナマイスター
(No.2)
ご指摘のとおり,問題文の
は,
とする方が,適切な説明文だと思います。
出題者は,受験者に対して,
・UTF-8という用語を聞いたことがあるレベルでなく,その概要の知識も求めている。
・ASCIIコード文字をUTF-8エンコードしても1文字=1バイトだと知っていて欲しい。
・だから,エンコード後に2バイト目以降が存在しない場合の説明は不要と判断した。
ということなのでしょう。
> それ以降のバイトは10で始まる。
は,
> それ以降のバイト「が存在するならばそれ」は10で始まる。
とする方が,適切な説明文だと思います。
出題者は,受験者に対して,
・UTF-8という用語を聞いたことがあるレベルでなく,その概要の知識も求めている。
・ASCIIコード文字をUTF-8エンコードしても1文字=1バイトだと知っていて欲しい。
・だから,エンコード後に2バイト目以降が存在しない場合の説明は不要と判断した。
ということなのでしょう。
2024.01.27 10:48
八王子さん
(No.3)
あ、なるほど。
「CF 80 ~」などはエンコードした場合2バイト以上になる文字列だった。だから「それ以降のバイト」にある条件に一致する。
「33 2E」などはASCIIコード(英数字)をエンコードしているから1バイトで済んでおり2バイト目以降はそもそも存在しない。
という事だったのですね。言われて納得しました!ありがとうございます!
いや~しかし……確かにUTF8は1~8バイトですが…ちょっと設問の書き方が不親切じゃないですかねぇ……
「CF 80 ~」などはエンコードした場合2バイト以上になる文字列だった。だから「それ以降のバイト」にある条件に一致する。
「33 2E」などはASCIIコード(英数字)をエンコードしているから1バイトで済んでおり2バイト目以降はそもそも存在しない。
という事だったのですね。言われて納得しました!ありがとうございます!
いや~しかし……確かにUTF8は1~8バイトですが…ちょっと設問の書き方が不親切じゃないですかねぇ……
2024.01.27 13:28
納豆のたれさん
(No.4)
IPv4にはクラスという概念がありますよね。
IPv4を2進数表記した時
0で始まる:クラスA
10で始まる:クラスB
110で始まる:クラスC
1110で始まる:クラスD
一方、UTF-8を2進数表記した時
0で始まる:1バイト文字
10で始まる:継続バイト
110で始まる:2バイト文字の先頭バイト
1110で始まる:3バイト文字の先頭バイト
11110で始まる:4バイト文字の先頭バイト
1110は16進数で E なので、
Eで始まるバイトが来たらそこから3バイトで1文字です。
これを知っていると
CF 80 E3 81 AF E7 B4 84 33 2E 31 34 E3 81 A7 E3 81 99
は
CF 80(E3 81 AF)(E7 B4 84)33 2E 31 34(E3 81 A7)(E3 81 99)
CF 80(E3 81 AF)(E7 B4 84)"3.14"(E3 81 A7)(E3 81 99)
にできて少し時短ができるかも
IPv4を2進数表記した時
0で始まる:クラスA
10で始まる:クラスB
110で始まる:クラスC
1110で始まる:クラスD
一方、UTF-8を2進数表記した時
0で始まる:1バイト文字
10で始まる:継続バイト
110で始まる:2バイト文字の先頭バイト
1110で始まる:3バイト文字の先頭バイト
11110で始まる:4バイト文字の先頭バイト
1110は16進数で E なので、
Eで始まるバイトが来たらそこから3バイトで1文字です。
これを知っていると
CF 80 E3 81 AF E7 B4 84 33 2E 31 34 E3 81 A7 E3 81 99
は
CF 80(E3 81 AF)(E7 B4 84)33 2E 31 34(E3 81 A7)(E3 81 99)
CF 80(E3 81 AF)(E7 B4 84)"3.14"(E3 81 A7)(E3 81 99)
にできて少し時短ができるかも
2024.01.27 15:54
八王子さん
(No.5)
納豆のたれさんありがとうございます!
CF 80(E3 81 AF)(E7 B4 84)"3.14"(E3 81 A7)(E3 81 99)
↑この"3.14"はどういう意味ですか?
「33 2E 31 34」→「3.14」に変換された理由がちょっとよく分かりませんでした。
それ以外に関しては目からウロコです!ありがとうございます。
CF 80(E3 81 AF)(E7 B4 84)"3.14"(E3 81 A7)(E3 81 99)
↑この"3.14"はどういう意味ですか?
「33 2E 31 34」→「3.14」に変換された理由がちょっとよく分かりませんでした。
それ以外に関しては目からウロコです!ありがとうございます。
2024.01.27 19:33
納豆のたれさん
(No.6)
ちょっと説明を端折りました。
ASCIIコードで「33 2E 31 34」は文字列に直すと「3.14」だからです。
ちなみに問題の文字列をデコードすると、
πは約3.14です
です。
※最初の文字はギリシャ文字の「パイ」
ASCIIコードで「33 2E 31 34」は文字列に直すと「3.14」だからです。
ちなみに問題の文字列をデコードすると、
πは約3.14です
です。
※最初の文字はギリシャ文字の「パイ」
2024.01.27 19:49
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告