0

研究プロジェクトの一環として、文字列実装の要件の 1 つを経験しています。

標準ライブラリが存在せず、独自の文字列クラスを設計する必要があったと仮定しましょう。どのような機能をサポートし、どのような制限を改善しますか。以下の要因を考えてみましょう。

  1. バイナリデータをエンコードする必要がありますか?
  2. マルチバイト文字エンコーディングは受け入れられますか、それとも Unicode が必要ですか?
  3. 必要な機能の一部を提供するために C スタイルの関数を使用できますか?
  4. どのような挿入および抽出操作が必要ですか?

上記のテキストに関する私の質問

  1. 「バイナリデータをエンコードする必要がありますか?」という著者の意味は何ですか? 例を挙げて説明するように要求し、これをどのように実装できますか。
  2. 著者の意味 y ポイント 2. 例を使用して説明するように要求し、これをどのように実装できますか。

お時間をいただきありがとうございます。

4

2 に答える 2

0
  1. ここでの質問は、「古いデータを文字列に格納できるか、または特定のバイト値を特別な方法でエンコードする必要があるかどうかです。その例は、改行文字を使用する場合の標準 C 言語です。 、より読みやすく明確にするために「エンコード」さ\nれています-もちろん、この例ではソースコードで話しています文字列に格納されたバイナリデータの場合、「奇妙な」ことをどのように処理しますかデータ - たとえば、0 バイトはどうですか? 特別な処理が必要ですか?

  2. a に収まることが保証されている値charは、ASCII 文字とその他のいくつかの文字です (一般的な実装では合計 256 の異なる文字ですがchar、標準では 8 ビットであることが保証されていません)。しかし、中国語や日本語などの非ヨーロッパ言語を取り上げると、それらは単一の言語に収まる数よりもはるかに多くの数で構成されています。char. Unicode では数百万の異なる文字を使用できるため、ヨーロッパ、中国語、日本語、タイ語、アラビア語、マヤ語、および古代の象形文字言語の文字を 1 つの「単位」で表すことができます。これは、より広い文字を使用して行われます。フルサイズの場合、32 ビットが必要です。ここでの欠点は、ほとんどの場合、実際にはそれほど多くの異なる文字を使用しないため、各文字に 32 ビットを使用するのは少し無駄であり、ほぼ常に上位 24 ビットにゼロがあるだけです。

マルチバイト文字エンコーディングは妥協案であり、「一般的な」文字 (ヨーロッパ言語で一般的) は 1 つとして使用されますcharが、あまり一般的でない文字は複数のchar値でエンコードされ、特別な範囲の文字を使用して「より多くのデータがあることを示します。次にchar、単一のユニットに結合します」. char(または、1 つの文字をエンコードするために、毎回2、3、または 4 を使用することを決定できます)。

于 2013-07-23T12:54:29.200 に答える
0

ポイント1に関して、「バイナリデータ」はバイトシーケンスを指し、「バイト」はほとんどの場合8ビットワードを意味します。昔は、ほとんどのシステムは ASCII に基づいていました。ASCII は 7 ビット (または質問者によっては 8 ビット) を必要とします。したがって、バイトと文字を区別する必要はありませんでした。最近では、英語を話さない人にも親しみやすくなったため、(他のコードセットの中でも) Unicode を処理する必要があります。これは、文字列型がバイトと文字がもはや同じものではないという事実に対処する必要があるという問題を引き起こします。

これは、プログラム内で文字列を表現する方法に関するポイント 2 につながります。UTF-8 は可変長エンコーディングを使用します。これには、ASCII エンコーディングが使用するのとまったく同じバイトを使用して ASCII 文字セット全体をエンコードするという顕著な特性があります。ただし、たとえば、文字列の文字数を数えるのが難しくなります。純粋な ASCII の場合、答えは簡単です。文字 = バイトです。しかし、文字列に ASCII 以外の文字が含まれている可能性がある場合、 1がいくつあるかを調べるために、文字列を調べて文字をデコードする必要があります。

これらは、文字列クラスを設計するときに考慮する必要がある種類の問題です。


1各文字の最初のバイトの上位 2 ビットが 10 にならないことが保証されているため、これは思ったほど難しくありません。したがって、 を満たすバイトを単純に数えることができます(c & 0xc0) != 0xc0。とはいえ、文字列バッファの長さを文字数として扱う場合に比べれば、依然としてコストがかかります。

于 2013-07-23T12:59:58.273 に答える