1

次のようなものを含む可能性のある文字列が VB.net にあります。

これは 0x000020AC シンボルです

これは、この記事http://www.fileformat.info/info/unicode/char/20ac/index.htmによると、ユーロ記号の UTF-32 エンコーディングです。

これを次のように変換したい

これは€記号です

VB.net で UnicodeEncoding() クラスを使用してみました (レガシー アプリケーションを変更しているため、Framework 2.0)

このクラスを使用してエンコードしてからデコードすると、元の文字列が返されます。

私は、UnicodeEncoding が既にエンコードされた部分を認識し、エンコードしないことを期待していました。しかし、そうではないようです。

混合エンコードされた文字列を通常の文字列に変換する方法について、少し迷っています。

背景: Excel スプレッドシートを CSV として保存すると、ASCII 範囲外のものはすべて ? に変換されます。したがって、クライアントにユーロ記号などのいくつかの文字を検索/置換させて、0x000020AC などのエンコードされた文字列にすることができれば、というのが私の考えです。次に、SQL データベースに挿入する前に、これらのエンコードされた部分を実際のシンボルに変換したいと考えていました。

私は次のような機能を試しました

Public Function Decode(ByVal s As String) As String
    Dim uni As New UnicodeEncoding()
    Dim encodedBytes As Byte() = uni.GetBytes(s)
    Dim output As String = ""

    output = uni.GetString(encodedBytes)

    Return output
End Function

これは、 http: //msdn.microsoft.com/en-us/library/system.text.unicodeencoding.aspx の MSDN の例に基づいています。

これが VB.net でどのように機能するかを完全に誤解している可能性があります。C# では、"\u20AC" などのエスケープ文字を簡単に使用できます。しかし、VB.net にはそのようなものは存在しません。

4

2 に答える 2

1

Heinzi からのアドバイスに基づいて、次のコードを使用して Regex.Replace メソッドを実装しました。これは私の例ではうまくいくようです。

Public Function Decode(ByVal s As String) As String
 Dim output As String = ""
 Dim sRegex As String = "0x[0-9a-zA-Z]{8}"

 Dim r As Regex = New Regex(sRegex)

 Dim myEvaluator As MatchEvaluator = New MatchEvaluator(AddressOf HexToString)

 output = r.Replace(s, myEvaluator)

 Return output
End Function

Public Function HexToString(ByVal hexString As Match) As String
 Dim uni As New UnicodeEncoding(True, True)
 Dim input As String = hexString.ToString
 input = input.Substring(2)
 input = input.TrimStart("0"c)

 Dim output As String

 Dim length As Integer = input.Length
 Dim upperBound As Integer = length \ 2
 If length Mod 2 = 0 Then
  upperBound -= 1
 Else
  input = "0" & input
 End If
 Dim bytes(upperBound) As Byte
 For i As Integer = 0 To upperBound
  bytes(i) = Convert.ToByte(input.Substring(i * 2, 2), 16)
 Next

 output = uni.GetString(bytes)

 Return output
End Function
于 2012-08-02T13:25:56.730 に答える
0

やってみました:

Public Function Decode(Byval Coded as string) as string
     Return StrConv(Coded, vbUnicode)
End Function

また、関数が無効です。sを引数として取り、大量の処理を行ってから、その中で処理されたものの代わりに、その中に入れられたsを出力します。

于 2012-08-02T11:32:23.063 に答える