uso

雑記いろいろ
★書いてある内容に保証は一切ありません。
 ご自身で判断をしてください。

[.net] VB.netの文字コード色々

2010-12-14 15:33:00 | インポート
■ 文字コードの扱い
  
  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バイト除く)、全角記号・・。大丈夫かな・・・



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [.net] VB.net小ネタ 1/2 | トップ | [.net] VB.net小ネタ 2/2 »
最新の画像もっと見る

インポート」カテゴリの最新記事