Creative Commons License

MyLog

Personal Log
IT Log
Book Log
마음의양식
Note

제 삶의 자취를 남깁니다.

.

IT Log

개발자의 삶을 살아가면서 느끼는 지극히 개인적인 느낌이나 이슈를 남깁니다.

lenB 로 망친 하루...

작성자 : 박종명
최초 작성일 : 2009-10-06 (화요일)
최종 수정일 : 2009-10-06 (화요일)
조회 수 : 4266

주말에 문득 문자 인코딩과 관련하여,
SBCS(Single Byte Character Set), MBCS(Mulit Byte Character Set), WBCS(Wide Byte Character Set)에 대해
고찰(?) 하게 되었습니다

그러던 중,
이전 ASP(Active Server Page) 와 현재 ASP.NET 의 기본 인코딩이 다름을 떠 올렸습니다
기본적으로 ASP는 MBCS 이고 ASP.NET 은 WBCS 이죠(더 정확히 말하면 utf-8은 유니코드 mulit byte 인코딩이죠)
(물론 개발자가 임의 변경 가능하죠)

ASP는 운영체제의 기본 ANSI 인코딩(한글 윈도우, 코드페이지 949) 혹은 euc-kr 이 대부분이며,
ASP.NET 으로 오면서 기본 인코딩이 유니코드인 utf-8 이 대세죠

euc-kr 인코딩은 대표적인 MBCS 인코딩입니다

MBCS 는 ASCII와 같은 SBCS(1byte)로는 한글을 표현할 수 없기 때문에 고안된 것인데,
기존 영문(등) 영역은 ASCII 처럼 1byte를 사용하고 한글이나 한자는 2byte로 표현하는 인코딩 기법이죠
문자 표현 시 1byte 혹은 2byte 가변적으로 사용하는 것이죠

그래서 저는, 다음과 같은 MBCS 기반인 ASP 코드로 바이트 수를 알아 보려고 했습니다
(기본 인코딩을 사용한채 말이죠...)
<%  
  a = "a" 
  response.write a & " = " & len(a) & " | " & lenB(a)
%>

헉, 그러나 결과는 예상과 다르더군요(len: 1, lenB: 2 를 반환)

len 은 문자길이, lenB는 문자를 표현하는 데 사용한 byte 수를 반환하는 asp 내장 함수입니다

len 함수야 문자 길이기 때문에 1이 맞는데,
lenB 함수는 바이트 수이기 때문에 MBCS 기반에서는 영문은 1byte를 사용하기에 1이 반환되어야 하는데
2가 반환되는 것입니다

이런 2byte 가 사용된단 말인가? 분명 MBCS 기반 인코딩에서 영문은 1byte 인데 말이죠
따라서, lenB 는 바이트 수를 반환하는 함수라서, 1이 반환되어야 하는데.. ,... 하면서 억수로 고민했죠

명시적으로 euc-kr 및 코드페이지 949를 아무리 지정해 줘도 결과는 똑같더군요
<%@ codepage="949" language="VBScript" %>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr"> 등등 명시적으로 지정...



이 결과와 함께, 저의 짧은 지식을 한탄하며, 그 원인에 대해 알아 보려 나름 애쓰던 중, 다음의 글을 만났습니다
http://support.microsoft.com/kb/600741/ko

'Visual Basic 4.0 은 3.0 과 다르게 한글 Length Check 시 Len 함수를 사용해서 2라는 결과치를 얻을 수 없다. 내부적으로 Unicode 방식으로 처리를 하기때문에 한글이든 영문이든 Len 함수로는 String 하나에 대해서 String Length 결과를 1로 리턴한다. LenB를 사용하면2 Byte를 얻을 수 있으나 이역시 한글이든 영문이든 Byte Length 길이를 2Byte로 결과를 얻으므로 VB 3.0 에서처럼 한글과 영문의 길이를 틀리게 처리할려면 직접 코드를 체크해서 길이를 아는 방법밖에 없다. 다음은 길이를 체크하는 함수의 Sample 이다. '

그리고 msdn의 다음의 글을 봤습니다

''이전 Visual Basic 버전의 LenB 함수는 문자가 아니라 문자열의 바이트 수를 반환합니다. DBCS(더블바이트 문자 집합) 응용 프로그램에서 문자열을 변환하는 데 주로 사용됩니다. 현재 모든 Visual Basic 문자열은 유니코드이며 LenB는 더 이상 지원되지 않습니다'

이런 된장....

중요한 건, VB, VB Script 에서 더 이상 lenB는 지원되지 않는 다는 것입니다
아.... 이런 lenB 같은 넘을 봤나...

이름
비밀번호
홈페이지
ZS <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요