2

VB.NET では、英語とは異なる「非ユニコードの言語」を持つシステムでも、ASC 関数が英語のコードページを使用するように「強制」する方法をシミュレートしたいと考えています。

例えば:

Asc("Œ")

「非ユニコードの言語」が英語に設定されているシステムでは、現在の結果は 140 です。

「非ユニコードの言語」がスロバキア語に設定されているシステムでは、現在の結果は 79 です

ひねりは、私はAscWを使用できません(開示できない理由により)

上記の特定の例では、コードが常に 140 を返すようにする必要があります。


プログラム全体で英語のコード ページを強制的に使用する方法があれば、それも使用できます。

CurrentCulture で遊んでみました:

Threading.Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("en-US")
Threading.Thread.CurrentThread.CurrentUICulture = New Globalization.CultureInfo("en-US")

Asc の直前、または ApplicationEvent の Startup の最初の行としても、運はありません。

ありがとう!

4

2 に答える 2

3

ILSpy を使用すると、Asc が Encoding.Default を使用して OS のデフォルトのエンコーディングを取得し、バイトの取得方法を決定しているように見えます。したがって、自分でロールする必要があります。

    Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(1252)   '1252 is the default codepage on US Windows
    Dim arr() As Byte = enc.GetBytes("Œ")
    MessageBox.Show(arr(0))
于 2012-06-15T14:20:51.907 に答える
1

ASCで使用されるコードページを制御する方法がわからないため、これはあなたの質問に直接答えることはできませんが、ASCIIエンコードとデコードを実行するためにEncodingクラスを使用することをお勧めします。このAscメソッドは、主にVB6コードとの下位互換性のためにあります。たとえば、古いIBM英語コードページ(437)を使用してASCII値を取得するには、次のようにします。

Public Function EnglishAsc(ByVal Text As String) As Byte
    Dim enc As Encoding = Encoding.GetEncoding(437)
    Dim bytes As Byte() = enc.GetBytes(Text)
    If bytes.Length > 0 Then
        Return bytes(0)
    Else
        Return 0
    End If
End Function

Public Function EnglishAsc(ByVal Character As Char) As Byte
    Dim enc As Encoding = Encoding.GetEncoding(437)
    Dim bytes As Byte() = enc.GetBytes(New Char() {Character})
    If bytes.Length > 0 Then
        Return bytes(0)
    Else
        Return 0
    End If
End Function
于 2012-06-15T14:12:46.353 に答える