2

文字列変数txtがあります。「°」度記号が含まれています。文字列を ASCII エンコードされた CSV ファイルに保存したいと思います。以下の手順を使用しますが、「°」記号は「?」に変換されます。度記号を適切に保存する方法はありますか?

    Public Sub Write_File(ByVal txt As String, ByVal fName As String)

    Try

       Using OutFile As New StreamWriter(fName, False, Text.Encoding.ASCII)
          OutFile.Write(txt)
       End Using

       Me.Write_Log("Succesfully Exported")

    Catch ex As Exception

       Me.Write_Log("Write Error during export")

    End Try
 End Sub
4

1 に答える 1

3

Encoding.ASCII度記号をまったく含まない標準の 7 ビット ASCII エンコーディング用です。ASCII で度記号を取得するには、多くの 8 ビット ASCII エンコーディングのいずれかを使用する必要があります。英語の場合、ISO 8859-1 コード ページの使用におそらく最も関心があるでしょう。これは、最も標準的なコード ページです。たとえば、 を使用する代わりに、次のEncoding.ASCIIようにすることもできます。

Using OutFile As New StreamWriter(fName, False, Text.Encoding.GetEncoding("iso-8859-1"))
    OutFile.Write(txt)
End Using

使用可能なエンコーディングの完全なリストについては、メソッドを使用するか、 MSDN ドキュメントEncoding.GetEncodingsでサポートされているエンコーディングのリストを参照してください。

もちろん、さまざまな 8 ビット ASCII エンコーディングは相互に互換性がないため、それを使用すると、デフォルトで別のコード ページを使用するシステムで表示すると、度記号はまったく別の記号になります。それこそが、UTF-8 が新しい標準になった理由です。8 ビット ASCII の使用は、多文化シナリオでは実質的に機能しないため、広く推奨されていません。代わりに UTF-8 を使用できる場合は、そうします。ASCII を使用する必要がある場合は、標準の 7 ビット エンコーディングを使用することをお勧めします。8 ビット ASCII エンコーディングを使用する必要がある場合は、その欠点を十分に認識して慎重に行ってください。

もう一つ。目的のターゲットエンコーディングで度記号を文字 167 (0xA7) として言及します。その場合、実際には ISO 8859-1 ではなく IBM437 エンコーディングが必要な場合があります。IBM437 は、MS-DOS でデフォルトで使用されていた古いコード ページです。そのコード ページを本当に使用する必要がある場合は、2 つの理由でさらに問題が発生する可能性があります。MSDN の記事でわかるように、そのコード ページは .NET フレームワークでは十分にサポートされていません。私のテストでは、そのエンコーディングを使用して度記号を含む Unicode 文字列を出力すると、正しく動作しませんでした。Stringしたがって、変数 (Unicode) ではなくバイト配列を使用してデータを表す必要がある場合があります。例えば:

File.WriteAllBytes("Test.txt", {167})

2 番目の問題は、IBM437 が Windows OS のデフォルトのコード ページではない可能性が高いため、バイト値 167 としてファイルに書き込まれた場合でも、Windows アプリケーションで表示すると、実際には度記号のように見えないことです。メモ帳など。

于 2015-01-07T14:24:16.860 に答える