|
2019/03/11(Mon) 13:38:50 編集(投稿者)
■No90418 (るぴん さん) に返信 > このshift jisでは開けない文字だけを別の文字に置き換えるプログラムを
'Imports System.Text ' ''' <summary> ''' Shift_JIS で表現できない文字を置き換える。 ''' </summary> Public Function ToSjis(text As String, Optional replaceChar As Char = "◆"c) As String Dim sjis = Encoding.GetEncoding(932, New EncoderReplacementFallback(replaceChar), New DecoderExceptionFallback()) Return sjis.GetString(sjis.GetBytes(text)) End Function
ただし置き換えにより、複数のファイルが同名になることがありえるので、 ファイル名の競合対策は必要になるでしょう。
--- 追記 ---
すべて同じ文字に置き換えてしまうと、元の内容が分からなくなるので、 置き換える前の文字列を後で追跡できるよう、置き換え元の文字を "{U+0000}" 形式の文字列にしてみました。
Public Function GetSjisText(text As String) As String Dim sjis = Encoding.GetEncoding(932, New EncoderExceptionFallback(), New DecoderExceptionFallback()) Dim result = text Do Try result = sjis.GetString(sjis.GetBytes(result)) Catch ex As EncoderFallbackException If ex.Index = -1 Then Exit Try Else Dim p = ex.Index + If(ex.IsUnknownSurrogate(), 2, 1) Dim s1 = result.Substring(0, ex.Index) Dim s2 = If(result.Length <= p, "", result.Substring(p)) result = s1 If ex.IsUnknownSurrogate() Then result &= "{U+" & AscW(ex.CharUnknownHigh).ToString("X4") & "}" result &= "{U+" & AscW(ex.CharUnknownLow).ToString("X4") & "}" Else result &= "{U+" & AscW(ex.CharUnknown).ToString("X4") & "}" End If result &= s2 End If Continue Do End Try Exit Do Loop Return result End Function
|