2016-08-29 2 views
0

これは基本的な質問ですが、私は何を検索するのかわからないので、私はそれについて何も見つかりません - それぞれの試みは無関係な結果を思い付いています。ASCII配列は文字列形式に変換せずに配列として操作できますか?

文字列をASCIIに変換するのに、Text.Encoding.ASCII.GetBytesを使用すると、各バイトは正確に1文字を表しますか?次のコードは、すべての状況(例以外のすべてのStrings)について、正確に意図されたとおりに動作しますか?

Dim t1() As Byte = Text.Encoding.ASCII.GetBytes("Hello ") 
Dim t2() As Byte = Text.Encoding.ASCII.GetBytes("World") 

Dim msg As String = Text.Encoding.ASCII.GetString(t1.Concat(t2).ToArray) 

ここでmsg"Hello World"である必要があります。

私が受け取ったデータをStringsに変換して、再度送信する前にそれを操作する必要がないようにしたいと考えています。

ASCII以外のもの(たとえばUTF-8など)を使用するとどうなりますか?

答えて

2

文字列をASCIIに変換するためにText.Encoding.ASCII.GetBytesを使用する場合、各バイトは正確に1文字を表しますか?

はい。 ASCIIは7ビットエンコーディングですが、マルチバイト文字はサポートしていません。 U-007Fを超えるUnicodeコードポイントはASCIIの?文字に変換されます。

例えば、代わりにUTF-7を使用する場合は、個々のUnicodeコードポイントを複数のASCII文字のシーケンスにエンコードすることができます。

次のコードは、すべての状況(例以外のすべての文字列)で意図したとおりに機能しますか?あなたの特定の例では

、はい(あなたはLINQのConcat() methodを使用して提供される - 配列を一緒にCONCATするother waysがあります)。データの損失はありません。

しかし、他の例では、非ASCII文字をASCIIに変換するとデータ損失が発生するか、それ以外の場合はGetBytes()GetString()の間で不一致のエンコードが行われることがわかります。

バイト配列を確実に操作できます。それらを一緒にマージした場合、配列が同じエンコーディングになっていることを確認してください。

+1

代替文字によるサイレントデータ損失の例外を希望する場合(デフォルトは?)ASCIIがサポートしていない文字をエンコードするときは、[独自のエンコーダを作成する]ことができます(https://msdn.microsoft.com/en-us/library/ms404377(v = vs.110).aspx#例外)標準ASCIIエンコーダに基づいています。 –

1

.NET文字列は、Unicodeコードポイント(intChar.ConvertToUtf32)をコードする1つ又は2つがUTF-16コード単位(char)の配列を計数します。いくつかのコードポイントは、 "結合文字"であり、先行する "基本文字"に適用されるときに書記素を形成します(フォントによってグリフにレンダリングされます)。

Unicodeから別の文字セットのエンコーディングまでのエンコーダーは、文字列を保持しようとする必要があります。 .NETでは、書体は「テキスト要素」と呼ばれます。

はい、グラフェンの一部を別のバイトシーケンスに変換してエンコーダを破っていない限り、エンコードされたバイトシーケンスを組み合わせることができます。エンコードする前に文字列を2つに分割する場合は、TextElementEnumeratorおよびStringInfoクラスを参照してください。

関連する問題