흔히 ‘풀배열’이라고 하는 키보드 배열은 미국의 키보드 배열 표준으로 101키/104키를 사용하는 배열이 있다. 우리 나라의 키보드 배열은 여기에 ‘한/영’키와 ‘한자’키를 더한 103키/106키가 표준으로 제정되어 있다. 추가된 두 개의 키는 스페이스 바의 오른쪽에 있기 때문에, 한국 표준 배열에서는 스페이스 바가 짧거나, 오른쪽 ctrl, alt 키가 작은 사이즈로 되어 있는 경우가 많다. 이러한 차이 외에도 미국 표준 배열은 일자로된 엔터키를 사용하고, 역슬래쉬 키가 엔터키 위에 있는데 비해, 한국 표준 배열은 역방향의 ㄴ자 모양 엔터키를 사용하고, 역슬래쉬가 백스페이스의 왼쪽에 위치한다.
한/영키와 한자키가 없는 101/103키의 키보드 배열을 사용하여 한국어 버전 윈도를 사용할 수 있게 하기 위해 윈도에서는 키보드 드라이버 수준에서 이 오른쪽 ctrl, alt 키를 한/영키나 한자키로 배치하거나, shift + 스페이스바를 사용하여 한/영 전환을 하게 하는 기능을 제공한다. 한국에서 생산되는 대부분의 노트북 키보드에서는 실제로는 한/영키와 한자키가 없고 ctrl, alt 키로 들어가 있는데 (물론 키 캡에는 ‘한/영’, ‘한자’로 표기한다.) 드라이버에 의해서 그 입력이 한/영, 한자키로 작동하게끔 되어 있다.
각 국가의 언어 및 문자 체계에 맞게 나라마다 키 배열에 대한 표준을 제정하는 것은 당연한 일이나, 한/영키와 한자키의 표준에는 문제가 있다. 그것은 이 두 키가 다른 키와 달리 좀 유별나게 작동한다는 것이다.
키보드의 원리는 우리가 키보드에서 특정한 키를 누르면, 키보드의 기판은 이를 감지하여 눌려진 키에 해당하는 숫자값(코드)을 PC에 전송한다. 이 신호를 스캔코드(scan code)라고 한다. 우리나라 표준 자판 배열에서도 한/영 키와 한자 키를 제외한 다른 키들의 스캔코드는 미국 표준과 동일하다. 그리고 각 키는 기본적으로 두 가지의 상태를 PC에 보고한다. 언제 키를 눌렀고 언제 손을 떼었는지를 알려주는 것이다. 키를 눌렀을 때 발생하는 스캔코드를 make 라고 하고, 키를 뗐을 때 발생하는 스캔코드는 break 라고 한다. 또한 키를 누르고 있으면 키보드는 특정 주기마다 make 신호를 반복적으로 PC로 보내는데, 이를 repeat 라고 한다. 즉 우리가 키를 누르고 있을 때 같은 키가 주르르륵 연속으로 입력되는 것은 PC의 기능이라기보다는 키보드의 기능인 셈이다.
따라서 모든 키는 누를 때 메이크 신호를, 뗄 때 브레이크 신호를 보내게 되는데, 한국의 키보드 표준에는 ‘한/영’키와 ‘한자’키에 대한 브레이크 및 리피트 신호가 정의되어 있지 않다. 따라서 이 두 키는 KeyTweak 이나 SharpKeys와 같은 프로그램을 사용해서 해당 키를 다른 키로 맵핑해서는 안된다. 키가 떨어지는 브레이크 신호나 계속 누르고 있을 때 리피트 신호를 전송하지 않기 때문에 특정 상황에서 예기치 않은 동작을 하거나, 소프트웨어가 키 입력을 정상적으로 처리하지 못하게 된다.
더 큰 문제는 ‘한/영’키와 ‘한자’키의 메이크 스캔코드 문제이다. 컴퓨터가 스캔코드를 특정한 키로 인식하기 위해서는 스캔코드 값과 키를 짝지어 놓은 관계를 미리 정의해 두어야 한다. 이 때 메이크 신호의 스캔 코드값에 특정한 값을 더해서 브레이크 신호로 정의해놓으면, 스캔코드의 맵핑 테이블의 크기를 절반으로 줄일 수 있다. 메이크 신호와 브레이크 신호의 차이는 1,280으로 이를 16진법으로 표현하면 0x80이다. 따라서 컴퓨터는 키보드의 스캔코드가 감지될 때 이 값이 0x80 이하의 값이면 메이크 신호로, 0x81 이상의 값이면 브레이크 신호로 감지한다. 그런데 ‘한/영’키의 스캔코드는 0xF2 로 0x80보다 큰 값이다. 따라서 다른 나라에서 제작된 소프트웨어는 ‘한/영’키의 입력을 제대로 처리할 수 없는 경우가 생긴다. (실제로 예전에 리눅스 커널에서 이러한 문제가 있었다.)
윈도에서는 사용자 로케일이 한국인 경우에 0xF2를 여기서 0x80을 뺀 0x72로 취급하도록 작동하게끔 하고 있다.
한/영 키가 없는 키보드를 구매했다면
팬터그래프나 멤브레인 키보드는 대부분 ‘한/영’ 및 ‘한자’키가 달려있는 형태로 출시되는 것이 많은데, 기계식 키보드의 경우에는 한성이나 앱코, 콕스 등 국내 제조사에서 만든 제품들에도 한영키가 없는 것이 대부분이다. 만약 한/영 키가 있는 106키 키보드를 사용하다가 이러한 키보드로 바꾸게 되면 한/영 전환이 안된다. 혹은 일부 외산 키보드, 블루투스 미니 키보드들도 마찬가지이다.
이 때에는 앞에서 말했듯이 윈도우가 101/104키를 기준으로 특정 키를 한/영, 한자키로 바꿔서 인식하도록 드라이버를 변경해주어야 한다. 이 설정은 윈도에서 “하드웨어 키보드 레이아웃 변경”이라는 이름으로 제공된다.
윈도11 기준으로는 더럽게 찾기 어렵게 돼 있는데,
- 시작 메뉴에서 설정(⚙️)을 선택하여 설정 앱을 연다
- 왼쪽 메뉴에서 “시간 및 언어” 선택
- 오른쪽에서 “언어 및 지역” 선택
- 오른쪽에 보면 “한국어” 항목이 있는데, 해당 항목에서 “···” 을 클릭하고 “언어옵션”을 선택
- 옵션 화면에서 중간쯤에 “키보드” 항목이 있는데, 여기서 “키보드 레이아웃” 버튼을 선택
- “한글 키보드(101키) 종류 1″로 키보드 설정을 변경
- 재부팅
정말 찾기 어렵게 숨겨놔서 한참 해매야했다. 그런데 한국어 키보드의 배열 표준은 정해져 있다는데 왜 이렇게 다양한 키보드 레이아웃이 존재할까?
그것은 한국어 키보드 표준 배열이 제정되기 전에는 컴퓨터 제조사마다 한/영키를 배당해준 위치가 달랐기 때문이다. 그나마 국내에 널리 보급된 형식이 종류 1 타입이다. 종류1 은 오른쪽 alt 를 ‘한/영’키로, 오른쪽 ctrl 키를 ‘한자’키로 인식하게 바꾼다. 종류2는 종류1의 반대로, 오른쪽 ctrl 키를 ‘한/영’키로 인식한다. 이 두 가지 타입을 사용하면 오른쪽 ctrl, alt 키는 인식할 수 없다.
종류3의 배열은 한글과 컴퓨터의 한글 워드프로세서와 같이 shift + space를 사용해서 한/영 전환을 하게끔 한다. 이 배열을 사용하면 오른쪽 ctrl, alt 키를 그대로 사용할 수 있다는 장점은 있다. (하지만 애초에 잘 안쓰는 키 아닌가…)
그 외 다른 키를 한/영키로 쓰고 싶다면
본인만 사용하는 컴퓨터라면 가장 간단한 방법은 레지스트리를 편집하는 것이다. 윈도는 각각의 키 맵핑을 레지스트리에서 관리하기 때문에, 원하는 키의 값을 한/영키로 바꿔주면 그 키를 한/영키로 인식하게 된다. SharpKeys는 이 과정을 쉽게 도와주는 프로그램으로 실제키와 바꾸고 싶은 키를 고르고 (키보드에서 눌러서 지정할 수 있음) 레지스트리에 적용해준다. 원상태로 복구시키는 것도 손쉽게 지원한다.
https://github.com/randyrants/sharpkeys
개인적으로는 CapsLock 키를 사용하지 않기 때문에 이 키를 레지스트리 편집을 통해서 한/영키로 바꿔서 사용하고 있다. 이 때 헷갈리지 말아야 할 것은 오른쪽 alt 키가 한/영키를 대신하고 있다고 해서, CapsLock을 오른쪽 alt키로 매핑해서는 안된다는 것이다. 이렇게 하면 실제 오른쪽 alt 키는 한/영키로, CapsLock키는 오른쪽 alt로 작동하게 된다. 반드시 0x0072
코드값의 키 (SharpKeys 에서는 Unknown으로 표시된다.)로 변경해주어야 ‘한/영’키로 작동하게 된다.
레지스트리를 편집하여 키를 바꾸는 방식은 최소한 해당 PC에 대해서는 영구적이며, 별도의 프로그램을 실행해서 상주시키지 않더라도 사용이 가능하다.
소프트웨어적인 방법으로 키를 변경하는 방법은 오토핫키와 같은 매크로 프로그램을 이용하는 것이다. 보통은 매크로 프로그램은 키보드와 마우스입력을 자동화하는데 사용한다고 생각하고 주로 그렇게 활용을 하고 있지만, 임의의 단축키를 만들어서 다른 기능을 실행하게 하는 것이 본질적인 기능이기 때문에 A라는 키가 입력될 때, B라는 키의 입력을 보내도록 하여 키를 교체하는 효과를 낼 수 있다. 키를 리맵핑하는 스크립트를 계속 실행해야 하는 한계는 있지만, 스크립트만 있으면 키보드에 상관없이 동일한 효과를 적용할 수 있다는 장점도 있다.
참고로 오토핫키에서 ‘한/영’ 키는 “SC1F2” (스캔코드 1F2), ‘한자’ 키는 “SC1F1“으로 불린다. 따라서 CapsLock 키를 한/영키로 대체하는 것은 한줄의 코드로 정의할 수 있다. 특히 단축키를 사용자가 마음대로 생성할 수 있기 때문에, CapsLock 키만 누를 때는 한/영 키로 작동하고 Shift + CapsLock 을 눌렀을 때에는 CapsLock 기능처럼 작동하도록 할 수 있는 등, 특정한 조합으로 사용하였을 때 다른 용도로 작동하는 등의 다양한 기능을 추가할 수 있다.
; CapsLock to 한/영
CapsLock::Send("{SC1F2}")
; Shict + CapsLock to CapsLock
+CapsLock::SetCapsLockState(!GetKeyState("CapsLock", "T"))