SBCS, MBCS, WBCS

Posted in SW개발 // Posted at 2023. 10. 31. 08:20
728x90
이 글은 제가 과거에 운영했던 사이트인 http://dotnet.mkexdev.net 의 글을 옮겨온 것입니다. 원본 글은 2009년 10월에 작성되었습니다.

그 전에 운영했었던 사이트(mkex.pe.kr)은 흔적도 없이 사라 졌습니다. 그속의 글들도 모두... 그래서 이 사이트도 사라지기 전에 옮기고 싶은 글을 조금씩 이 블로그로 이동시키려 합니다.
(원본글) http://dotnet.mkexdev.net/Article/Content.aspx?parentCategoryID=2&categoryID=9&ID=525

 

문자 인코딩 체계(방식)에 대한 분류입니다.

SBCS(Single Byte Character Set)

1바이트로 문자를 인코딩합니다. ASCII 인코딩이 대표적인 SBCS 입니다
ASCII 개요와 코드표는 다음의 글을 참고해 주세요.
=> ASCII

MBCS(Multi Byte Character Set)

1바이트로는 최대 256 글자만 표현할 수 있기 때문에 영어권 이외의 나라에서는 그 나라 문자를 인코딩 할 수 없기 때문에 바이트를 하나 더 사용합니다. 즉 최대 2바이트로 인코딩 합니다. 2바이트로 문자를 표현하기 때문에 DBCS(Double Byte Character Set)이라고도 합니다.

다만 MBCS 는 무조건 2바이트가 아니라 영어와 같이 1바이트로 표현 가능한 문자는 여전히 1바이트 사용합니다.
즉 문자에 따라 1byte 혹은 2byte 를 사용합니다(MBCS = SBCS + DBCS라 할 수 있습니다)

대표적으로 euc-kr 이나 한글 윈도우 기본 ANSI 인코딩은 코드페이지 949가 MBCS에 해당합니다
euc-kr 전체 코드표는 다음의 링크를 참조해 주세요
=> euc-kr 전체 코드표


WBCS(Wide Character Set)

MBCS 는 각 나라마다 그 정의가 다릅니다
따라서 전 세계 글자를 하나의 코드표로 정의하는게 필요 했는데, 바로 그렇게 탄생한 것이 유니코드(UniCode) 입니다. 유니코드를 WBCS라 합니다

유니코드에 대한 저의 에피소드는 다음글을 참조해 주세요
=> 이런... 계집 녀


아래 그림은 대표적인 인코딩에 따른 문자 길이와 바이트 수, 그리고 코드페이지를 보여줍니다
(닷넷으로 작성된 프로그램 입니다)



소스참고---------------------------------------------------------------------------
        private void btnDefault_Click(object sender, EventArgs e)
        {
            this.txtDefaultLenght.Text = str.Length.ToString();
            this.txtDefaultByte.Text = Encoding.Default.GetByteCount(str.ToCharArray()).ToString(); 
            //this.txtDefaultByte.Text = Encoding.GetEncoding("ks_c_5601-1987").CodePage.ToString();
            this.txtDefaultCodePage.Text = Encoding.Default.CodePage.ToString();
        }

        private void btnUnicode_Click(object sender, EventArgs e)
        {
            this.txtUnicodeLength.Text = str.Length.ToString();           
            this.txtUnicodeByte.Text = Encoding.Unicode.GetByteCount(str.ToCharArray()).ToString();
            //this.txtUnicodeCodePage.Text = Encoding.GetEncoding("utf-16").CodePage.ToString();
            this.txtUnicodeCodePage.Text = Encoding.Unicode.CodePage.ToString();
        }

        private void btnUTF8_Click(object sender, EventArgs e)
        {
            this.txtUTF8Length.Text = str.Length.ToString();
            this.txtUTF8Byte.Text = Encoding.UTF8.GetByteCount(str.ToCharArray()).ToString();
            //this.txtUTF8CodePage.Text = Encoding.GetEncoding("utf-8").CodePage.ToString();
            this.txtUTF8CodePage.Text = Encoding.UTF8.CodePage.ToString();
        }

        private void btnEucKr_Click(object sender, EventArgs e)
        {
            this.txtEucLength.Text = str.Length.ToString();
            this.txtEucByte.Text = Encoding.GetEncoding("euc-kr").GetByteCount(str.ToCharArray()).ToString();
            this.txtEucCodePage.Text = Encoding.GetEncoding("euc-kr").CodePage.ToString();
        }

----------------------------------------------------------------------------------

참고>

* chcp
현재 운영체제의 기본 ANSI 코드 페이지를 확인하려면 Command 창에서 다음 명령어를 확인하세요
chcp : 현재 활성 코드 페이지 확인
chcp xxx : 코드 페이지 변경


* charmap
그리고 현재 운영체제의 유니코드 문자표를 확인하려면 Command 창에서 charmap 명령어로 확인하세요

이런... 계집 녀(女)

Posted in SW개발 // Posted at 2023. 10. 31. 08:15
728x90
이 글은 제가 과거에 운영했던 사이트인 http://dotnet.mkexdev.net 의 글을 옮겨온 것입니다. 원본 글은 2008년 10월에 작성되었습니다.

그 전에 운영했었던 사이트(mkex.pe.kr)은 흔적도 없이 사라 졌습니다. 그속의 글들도 모두... 그래서 이 사이트도 사라지기 전에 옮기고 싶은 글을 조금씩 이 블로그로 이동시키려 합니다.
(원본글) http://dotnet.mkexdev.net/Article/Content.aspx?parentCategoryID=3&categoryID=26&ID=400

제목보고 놀라셨나요? ㅎㅎ
상소리(?) 같아서 기분이 상하신 분은 양해 바랍니다.

프로젝트 진행 중 '계집 녀(女)'라는 한자와 관련해서 경험한 재미있는 에피소드가 있어 이를 소개하려 합니다.

저는 게임회사를 다니고 있습니다.
저희 팀에서는 데이타베이스도 관리하고 있기 때문에 회원 DB를 직접 관리합니다.

어느날,
게임개발팀 팀장으로부터 닉네임이 중복된다는 제보(?)를 받게 됩니다.
우리 게임은 정책적으로 닉네임은 완전 고유해야 하거든요, 그리고 이를 시스템에 적용한 상태이구요

웹 사이트에서 회원 가입 시 중복 체크를 하고 있습니다.
물론 DB에서도 유니크 제약조건이 걸려 있어서, 같은 닉네임이 입력될 여지는 전혀 없는 것이지요.

그런데, 제보받은 두 명의 회원 닉네임을 보니, 정말 같아 보였습니다.
저희는 닉네임에 한자도 입력 가능하기 때문에, 두 회원의 닉네임은 한자였습니다.
그리고 그 한자 중간에는 '계집 녀(女)'가 들어 있었지요. 다음과 같이요...

회원 1 의 닉네임 : XXXXXX
회원 2 의 닉네임 : XXXXXX

이런, 어떻게 같은 닉네임이 DB에 입력되었을까???

닉네임 문자를 가만히 들여다 보니, 女 자가 살짝, 아주 살짝 달라보입니다.
女 / 女 <- 달라 보이나요?

메모장에서 확대를 해 봤습니다. 그랬더니, 오히려 더 같은 글자로 보이네요.




확대하기 이전 두 글자는 살짝 차이가 보이는데, 확대를 하니 오히려 완전 같은 글자처럼 보이는 군요.

여튼, 두 글자가 다른 글자일 수도 있겠구나.. 하며 문자코드를 봤습니다.
참고로, 저희 웹 사이트와 DB는 국제 표준 유니코드를 사용합니다.

두 한자의 유니코드를 보니, 이런!!!

코드가 서로 다르군요. 즉 유니코드 테이블에서는 두 글자가 서로 다른 글자로 엄연히 자리하고 있던 것입니다.

'녀'가 '여'로 발음되는 것은 두음법칙에 의해서 인데,  이러한 규칙이 국제표준코드 정의에도 그대로 적용되어 있다니. 놀랍습니다. ㅎㅎ;

결과적으로 사람이 보기에, 그리고 의미상으로는 같은 두 한자가, 시스템은 다른 글자로 인식하기 때문에
중복없이 DB에 저장된 것입니다.


한자 사전을 찾아 봤습니다. 두 글자가 떡 하니(?) 나오네요 --;



참고로 유니코드 표에서 두 글자의 16진수 10진수 코드는 다음과 같습니다.
          16진수    10진수
女(여) : F981     63873

女(녀) : 5973     22899


두음법칙이 적용되는 한자는 모두??

그렇습니다. 두음법칙이 적용되는 한자는 모두, 이러한 현상이 발생합니다.

'어질 량(良) / 어질 양(良)' 도 두음법칙에 의해 서로 다르게 발음되며, 이에 대한 유니코드도 다릅니다.
그리고 '년(年)과 연(年)' 도 있지요.

또 뭐가 있을까요? 다음을 참고하세요..

제10항: 한자음 ‘녀, 뇨, 뉴, 니’가 단어 첫머리에 올 적에는 두음 법칙에 따라 ‘여,  요, 유, 이’로 적는다. 
제11항: 한자음 ‘랴, 려, 례, 료, 류, 리’가 단어의 첫머리에 올 적에는 두음 법칙에 따 라 ‘야, 여, 요, 유, 이’로 적는다. 
다만, 모음이나 ‘ㄴ’받침 뒤에 이어지는 ‘렬, 률’은 ‘열, 율’로 적는다.

혹시, 당신의 응용프로그램에서도 고유한 성질의 필드에 한자를 입력받고 있으신가요?

그렇다면, 이러한 중복아닌 중복마저도 허용치 않으려면 이런 현상을 미리 고려하셔야 겠네요
아니라면, 그냥 재미삼아.. 이럴 수도 있겠구나.. 하면 되겠지요 ~~