삶의 도움이 되도록 씨부리는거/VB

인코딩 방법을 변경하여 lenb를 대신할 문자열 bytes 획득

狂者力 狂獸 2009. 9. 7. 14:47

VB에서는 lenb라는 함수를 이용하여 문자열의 길이를 bytes로 얻을 수 있었다.
그러나 .net으로 넘어오면서 모든 문자열을 unicode로 처리하게 되어 2bytes로 인지하게 되었고 따라서, lenb의 지원이 중단되었다.

이에 2bytes문자와 1byte의 문자를 구별하여 그 길이를 위해 여기저기 뒤져보고 이것저것 해보기도 하였지만, 나의 우매한 지식으로는 도저히 알아낼 수가 없었다.
딴에는 문자열을 bytes로 변환하면 그 값이 나오지 않을까 싶었는데, 아닌가보다. 기본적인 데이터에 대한 이해가 없는 상태에서는 쉽지 않았다.

그러다 devpia에서 우연히 아래의 게시물을 발견하여 그 해법을 찾았다.
(http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=44&MAEULNo=18&no=22085&ref=22085)

안녕하세요.

.net은 기본적으로 모든 문자가 2byte입니다. unicode가 기본이기 때문이지요.

그래서, encoding을 한글로 변경후에 GetByteCount하면 영문과 한글의 byte수가 다르게 나옵니다.

 

        Dim aaa As String = "aaa"

        Dim bbb As String = "질문"

        Dim ccc As String = "aa질문"

 

        MessageBox.Show(System.Text.Encoding.GetEncoding("euc-kr").GetByteCount(aaa))

        MessageBox.Show(System.Text.Encoding.GetEncoding("euc-kr").GetByteCount(bbb))

        MessageBox.Show(System.Text.Encoding.GetEncoding("euc-kr").GetByteCount(ccc))

 

이렇게 하면 aaa는 3, bbb는 4, ccc는 6이 돼겠죠.

그럼.

기본적으로... 유니코드로 되어 있는 문자열을 euc-kr로 다시 인코딩하여 그 크기를 구하는 것이다.
내가 사용하고자 했던 것은 긴 문자열이 아닌 관계로 실시간으로 바꾸어도 큰 문제가 없을 것으로 판단되었다.
따라서 textchanged 이벤트에서 바로바로 변경 bytes 크기를 알아내도록 하였고, 셀렉션이 있을 경우에는 그 크기를 알기 위해 mouseup / keyup 이벤트에도 다음 구문을 추가하였다.

If tbBizContent.SelectionLength > 0 Then
    BizBytes.Text = "길이 : " & System.Text.Encoding.GetEncoding("euc-kr").GetByteCount(tbBizContent.SelectedText)
Else
    BizBytes.Text = "길이 : " & System.Text.Encoding.GetEncoding("euc-kr").GetByteCount(tbBizContent.Text)
End If


별거 아니지만 무척 만족스럽다.
반응형