■ 文字コードの扱い
VB.netは文字をUnicodeで扱う。なので、全て2バイト、
「あ」も「0」も「a」も全て2バイト(らしい)。
Accessも新しいバージョンはそう。
そんなことも知らず、全角30文字で半角60の60バイト入力でいいですか~?
と適当に仕様を決めてしまった自分が恨めしい。
仕方ないので、いちいちs_jis二変換してバイト数数えて、バイト単位で切って・・・
■ MidB(対処文字列 , 開始(1~) , 切り取りたいバイト数)関数
VB6ではこれで簡単に文字列をバイト単位で切ることができた。らしい。よく知らないのだが・・・。
参考:http://jeanne.wankuma.com/tips/vb.net/string/leftb.html
:http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample068MidB.htm←こちらを読みながら作成
・・・させてもらったが、最後の2バイト文字判定に?があったので、自分なりに改良。
自分なりに読んで作ったから、ただのコーディングミスだと思うが、原因がわからず危うい。。。
コード
'-----------------------------------------------------
'文字列切り取り(半角・全角混在)
'引 数:str(切り取る文字列)
' :start(開始位置 1~)
' :length(切り取る文字数)
'戻り値:切り取った文字列(String)
'機 能:文字列を1バイト単位で指定して切り取る
'-----------------------------------------------------
Public Function MidByte(ByVal str As String, ByVal intStart As Integer, ByVal intLength As Integer)
Dim intCount As Integer
Dim resCount As Integer
Dim s_jis As System.Text.Encoding
Dim bytStr() As Byte
Dim strAsc As String
'空白文字
If str = "" Then
Return ""
End If
s_jis = System.Text.Encoding.GetEncoding("shift-jis")
'文字のバイト数取得
intCount = s_jis.GetByteCount(str)
'指定文字数が0もしくは、Start以降のバイト数をオーバーする
'場合はStart以降の全バイトが指定されたものとみなす
resCount = intCount - intStart + 1
If intCount = 0 OrElse resCount < intLength Then
intLength = resCount
End If
'バイト変数作成
bytStr = CType(Array.CreateInstance(GetType(Byte), intLength), Byte())
'切り抜き
Array.Copy(s_jis.GetBytes(str), intStart - 1, bytStr, 0, intLength)
'最後の文字が全角バイト文字の後半だった場合、最後の文字を切り捨てる
strAsc = s_jis.GetString(bytStr)
If Asc(Strings.Right(strAsc, 1)) = 0 Then
'VB.NET2002,2003の場合、最後の1バイトが全角の半分の時
Return strAsc.Substring(0, strAsc.Length - 1)
ElseIf intLength = resCount - 1 And Asc(Strings.Right(strAsc, 1)) < 0 Then ←And以下追加★
'VB2005の場合で最後の1バイトが全角の半分の時
Return strAsc.Substring(0, strAsc.Length - 1)
Else
Return strAsc
End If
End Function
確か、s_jisの2バイト文字は、後半の1バイトが必ずマイナスになる・・・という情報があったような???と思い、★を追加。
ひらがな、漢字、カタカナ(1バイト除く)、全角記号・・。大丈夫かな・・・
VB.netは文字をUnicodeで扱う。なので、全て2バイト、
「あ」も「0」も「a」も全て2バイト(らしい)。
Accessも新しいバージョンはそう。
そんなことも知らず、全角30文字で半角60の60バイト入力でいいですか~?
と適当に仕様を決めてしまった自分が恨めしい。
仕方ないので、いちいちs_jis二変換してバイト数数えて、バイト単位で切って・・・
■ MidB(対処文字列 , 開始(1~) , 切り取りたいバイト数)関数
VB6ではこれで簡単に文字列をバイト単位で切ることができた。らしい。よく知らないのだが・・・。
参考:http://jeanne.wankuma.com/tips/vb.net/string/leftb.html
:http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample068MidB.htm←こちらを読みながら作成
・・・させてもらったが、最後の2バイト文字判定に?があったので、自分なりに改良。
自分なりに読んで作ったから、ただのコーディングミスだと思うが、原因がわからず危うい。。。
コード
'-----------------------------------------------------
'文字列切り取り(半角・全角混在)
'引 数:str(切り取る文字列)
' :start(開始位置 1~)
' :length(切り取る文字数)
'戻り値:切り取った文字列(String)
'機 能:文字列を1バイト単位で指定して切り取る
'-----------------------------------------------------
Public Function MidByte(ByVal str As String, ByVal intStart As Integer, ByVal intLength As Integer)
Dim intCount As Integer
Dim resCount As Integer
Dim s_jis As System.Text.Encoding
Dim bytStr() As Byte
Dim strAsc As String
'空白文字
If str = "" Then
Return ""
End If
s_jis = System.Text.Encoding.GetEncoding("shift-jis")
'文字のバイト数取得
intCount = s_jis.GetByteCount(str)
'指定文字数が0もしくは、Start以降のバイト数をオーバーする
'場合はStart以降の全バイトが指定されたものとみなす
resCount = intCount - intStart + 1
If intCount = 0 OrElse resCount < intLength Then
intLength = resCount
End If
'バイト変数作成
bytStr = CType(Array.CreateInstance(GetType(Byte), intLength), Byte())
'切り抜き
Array.Copy(s_jis.GetBytes(str), intStart - 1, bytStr, 0, intLength)
'最後の文字が全角バイト文字の後半だった場合、最後の文字を切り捨てる
strAsc = s_jis.GetString(bytStr)
If Asc(Strings.Right(strAsc, 1)) = 0 Then
'VB.NET2002,2003の場合、最後の1バイトが全角の半分の時
Return strAsc.Substring(0, strAsc.Length - 1)
ElseIf intLength = resCount - 1 And Asc(Strings.Right(strAsc, 1)) < 0 Then ←And以下追加★
'VB2005の場合で最後の1バイトが全角の半分の時
Return strAsc.Substring(0, strAsc.Length - 1)
Else
Return strAsc
End If
End Function
確か、s_jisの2バイト文字は、後半の1バイトが必ずマイナスになる・・・という情報があったような???と思い、★を追加。
ひらがな、漢字、カタカナ(1バイト除く)、全角記号・・。大丈夫かな・・・