■No34079に返信(satoさんの記事) > Dim str1 As String=「あるDLL("漢字")」 > Dim bytesData As Byte() = System.Text.Encoding.UTF8.GetBytes(str1) > Dim str2 As String = System.Text.Encoding.UTF8.GetString(bytesData)
Imports System.Text Imports System.IO Module Module1 Sub Main() ' ここはテスト用のコードなので無視して OK Dim chars(5) As Char chars(0) = ChrW(&H00E6) 'U+00E6: Latin Small Letter Ae chars(1) = ChrW(&H00BC) 'U+00BC: Vulgar Fraction One Quarter chars(2) = ChrW(&H00A2) 'U+00A2: Cent Sign chars(3) = ChrW(&H00E5) 'U+00E5: Latin Small Letter A with Ring Above chars(4) = ChrW(&H00AD) 'U+00AD: Soft Hyphen (SHY) chars(5) = ChrW(&H0097) 'U+0097: <End of Guarded Area> (EPA)
Dim str0 As String = New String(chars) MsgBox(str0, vbInformation)
'Dim str1 As String=「あるDLL("漢字")」の代用 Dim str1 As String = Encoding.Unicode.GetString(New Byte() {&HE6, &H0, &HBC, &H0, &HA2, &H0, &HE5, &H0, &HAD, &H0, &H97, &H0})
'ファイルとして吐き出してみる Using writer As New StreamWriter("D:\utf-8.txt") writer.Write(str1) writer.Close() End Using Using writer As New StreamWriter("D:\utf-16.txt", False, New UnicodeEncoding(False, False)) writer.Write(str1) writer.Close() End Using Using writer As New StreamWriter("D:\utf-16BE.txt", False, New UnicodeEncoding(True, False)) writer.Write(str1) writer.Close() End Using
'★ 本題:これでどうでしょう ★ Dim str2 As String = Encoding.UTF8.GetString(str1.Select(Function(c) CByte(AscW(c))).ToArray()) MsgBox(str2, vbInformation) '「漢字」 End Sub End Module
■No34081に返信(satoさんの記事) > Using writer As StreamWriter = New StreamWriter("ファイル名.txt") > writer.Write(str1) 上記の構文では、変数 str1 は As String または As Char() であり、 かつ、StreamWriter は BOM 無しの UTF-8 エンコードであることを意味しますね。
だとしたら > 00 e6 00 bc 00 a2 00 e5 00 ad となるということです。 これはありえないはず。(末尾の 00 97 が欠落している点を抜きにしても)
Imports System.Text Module Module1 Sub Main() Dim rawBinary1 As Byte() = {&H0, &HE6, &H0, &HBC, &H0, &HA2, &H0, &HE5, &H0, &HAD, &H0, &H97} Dim rawBinary2 As Byte() = {&HE6, &H0, &HBC, &H0, &HA2, &H0, &HE5, &H0, &HAD, &H0, &H97, &H0}
Dim enc1 = Encoding.GetEncoding("UTF-8", New EncoderExceptionFallback(), New DecoderExceptionFallback()) Dim enc2 = Encoding.GetEncoding("UTF-16LE", New EncoderExceptionFallback(), New DecoderExceptionFallback()) Dim enc3 = Encoding.GetEncoding("UTF-16BE", New EncoderExceptionFallback(), New DecoderExceptionFallback())
For Each enc In {enc1, enc2, enc3} Console.WriteLine(enc.BodyName) For Each binary In {rawBinary1, rawBinary2} Try Console.WriteLine(enc.GetString(binary)) Catch ex As DecoderFallbackException '★ UTF-8 として解釈すると、E6 の部分でデコードに失敗してしまう ★ Console.Error.WriteLine(ex.Message) End Try Next Console.WriteLine("-------------") Next Console.ReadKey() End Sub End Module
「あるDLL」(の関数)で返される文字列の文字コードを解析しますと、00e6 00bc 00a2 00e5 00ad 0097というコードで、文字列が「00e6 00bc・・・」というものではないです。 この文字列を Using writer As StreamWriter = New StreamWriter("ファイル名.txt") writer.Write(str1) writer.Close() End Using で保存し、バイナリエディタで「ファイル名.txt」を開くと、00 e6 00 bc 00 a2 00 e5 00 ad となるということです。