2

ASCII文字131(ƒ-フック付きラテン小文字f)をメッセージボックスに出力しようとしていますが、奇妙な理由で、空の文字列として表示されます。私は次のVB.NETコードを持っています:

Dim str As String = Convert.ToChar(131)
MessageBox.Show(str, "test", MessageBoxButtons.OK, MessageBoxIcon.Information)
Debug.Print(str)

上記では、メッセージボックスには何も表示されませんが、debug.printステートメントは「イミディエイトウィンドウ」に文字を正しく表示します。他に約70のASCII文字があり、これらはすべてこの方法で正常に機能しますが、空白として表示されるのは一部の文字のみです(131およびENダッシュ150)。

たとえば、次のように機能します。

str = Convert.ToChar(164)
MessageBox.Show(str, "test", MessageBoxButtons.OK, MessageBoxIcon.Information)
Debug.Print(str)

また、UTF8に変換しようとしましたが、最初のコードスニペットと同じ動作が得られます。

Dim utf8Encoding As New System.Text.UTF8Encoding(True)
Dim encodedString() As Byte
str = Convert.ToChar(131)
encodedString = utf8Encoding.GetBytes(str)
Dim str2 As String = utf8Encoding.GetString(encodedString)
MessageBox.Show(str2, "test", MessageBoxButtons.OK, MessageBoxIcon.Information)
Debug.Print(str2)

これはエンコーディングの問題ですか?洞察をありがとう。

編集:明確にするために、私は実際に文字をメッセージボックスに出力しようとはしていません。そのコードは単なるテストでした。文字を文字列としてサードパーティのxmlエディターコントロールで使用する関数に渡そうとしていますが、空白で表示されます。Visual Studioでデバッグしているときでも、その値が「」に等しいことがわかります。

編集2:以下の受け入れられた回答からのいくつかの調査のおかげで、私は間違ったユニコード文字を使用していることを発見しました。このf文字の場合、使用するコードはToChar(402)でした。これは完璧に機能しました。皆さん、ありがとうございました。

4

1 に答える 1

4

他の人が指摘したように、「ƒ」文字は ASCII 文字ではありません。ASCII は厳密には 7 バイト形式であり、「拡張 ASCII」文字は、参照しているエンコーディングによって完全に異なります。たとえば、Windows CodePage 1250には文字 131(0x83) の空白がありますが、CodePage 1252にはそのスロットに「ƒ」文字があります。

以下の例では 1252 を使用していますが、エンコードされた ASCII テキストの大部分を変換する場合は、使用中のエンコードを正しく識別し、正しいコードページを使用して変換する必要があります。

これを処理する最善の方法は、すべてを Unicode に変換し、従来の理由で絶対に必要な場合を除いて拡張 ASCII を避けることだと思います。ただし、「ƒ」文字を取得するには、次のようにします。

Imports System.Text

その後 :

Dim enc1252 As Encoding = Encoding.GetEncoding(1252)
Dim bArr(0) As Byte
bArr(0) = CByte(131)

Dim str2 As String = Encoding.Unicode.GetString( _
                     Encoding.Convert(enc1252, Encoding.Unicode, bArr))

MessageBox.Show(str2, " test", MessageBoxButtons.OK, _
                MessageBoxIcon.Information)

ただし、VisualStudio はネイティブで Unicode を使用するため、「ƒ」文字を表示するだけで、実際にレガシー テキストを変換する必要がない場合は、いつでも次のようにすることができます。

MessageBox.Show("ƒ", " test", MessageBoxButtons.OK, _
                MessageBoxIcon.Information)
于 2013-03-05T18:14:44.830 に答える