input태그 안에 바코드를 기입해야 하는데, 현재 keybord의 한/영키 상태에 따라 값이 다르게 들어가는 오류가 발생했다. 영문키 상태에서는 정상적으로 들어가나 한글키 상태에서는 바코드 스캔 시 '2023CE23' 같은 데이터의 경우 '2023ㅊㄸ23'으로 한글이 포함된 문자로 들어가는 상태. 이를 해결해 보고자 여러 가지 방법을 시도해 보다 새로운 한영키 변환법을 발견했다.
해당 방법은 한글 입력 방지가 아닌, 입력 시 한타 -> 영타로 한영키를 자동으로 변환해 주는 방법이다.
type = 'password'
와 같이 설정할 경우 해당 텍스트 상자에 focus가 간 순간, 한타 -> 영타로 전환된다.
문제는 아래와 같이 입력한 값이 **** 로 보인다는 점.

이를 해결하기 위해 js에서 속성을 변경해 주는 작업을 추가로 진행했다.
input태그의 id로 keydown이벤트를 주어, prop를 변경한다.
$(document).on('keydown', '#mbarcode', function(e){
$(this).prop("type", "text");
}

한타 상태에서 해당 텍스트 상자에 글자를 입력하면, js에서 적용한 keydown이벤트가 발생되어 input 태그의 property를 text로 변경해준다. 오른쪽과 같이 입력한 글자가 별 표시(*)가 아닌 문자 그대로 정상 출력되는 것을 볼 수 있다.
처음 focus를 주었을 때는 영타로 자동 변환되나 그 이후에 사용자가 직접 한/영키를 눌러 한타로 전환하면 한글 입력이 가능하다는 문제점이 존재한다. 이 경우에는 이벤트 종료 시점에 property를 다시 password로 변경해 주면 되며, 이벤트 종료 시점이 명확하지 않은 경우라면 정규식을 사용해 한글 입력 시 사용자에게 한/영키 전환 경고 메세지를 출력하거나, 입력한 문자열을 영문으로 변경해 주는 방법을 고려해 보면 좋을 것 같다.
<input type="text" style="ime-mode:disabled;">
ime-mode는 IME(Input Method Editor)의 상태를 변환하는 속성으로
active인 경우 한글 기본입력
inactive인 경우 영문 기본입력
disable인 경우 영문만 입력 가능(한글 허용x)
이렇게 세 가지 속성값이 존재한다.
한글 입력을 방지하기 위해 disabled로 설정해 보니 여전히 한글 입력이 가능한 상태였다.
알아보니 해당 방법은 Explorer 브라우저에서만 가능한 방법이었고, 브라우저 별 ime-mode를 설정해 보았으나 작동되지 않았다.
<style>
#mbarcode {
-webkit-ime-mode:disabled;
-moz-ime-mode:disabled;
-ms-ime-mode:disabled;
ime-mode:disabled;
}
</style>
결론 : ime-mode는 더 이상 지원하지 않는 기능인듯하다.
1) inko 라이브러리 이용
<script src="https://cdn.jsdelivr.net/npm/inko@1.1.0/inko.min.js"></script>
$('#mbarcode').val(inko.ko2en($(this).val()));
해당 라이브러리는 입력한 한글을 영문으로 자동 변환해 주는 기능을 제공하는데, 사용해 보니 입력한 글자 수보다 더 많은 글자가 들어가거나 대소문자를 제대로 인식하지 못하는 오류가 발생하여 사용하지 못했다.
2) JS 함수 사용
function convertKoreanToEnglish(koreanText) {
const koreanPattern = /[ㄱ-ㅎㅏ-ㅣ가-힣]/g;
return koreanText.replace(koreanPattern, match => {
const code = match.charCodeAt(0) - 44032;
const cho = Math.floor(code / 588);
const jung = Math.floor((code - cho * 588) / 28);
const jong = code % 28;
const choToEnglish = ['g', 'gg', 'n', 'd', 'dd', 'r', 'm', 'b', 'bb', 's', 'ss', '', 'j', 'jj', 'ch', 'k', 't', 'p', 'h'];
const jungToEnglish = ['a', 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'wo', 'we', 'wi', 'yu', 'eu', 'ui', 'i'];
const jongToEnglish = ['', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'l', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'lh', 'm', 'b', 'bs', 's', 'ss', 'ng', 'j', 'c', 'k', 't', 'p', 'h'];
const choResult = choToEnglish[cho] || '';
const jungResult = jungToEnglish[jung] || '';
const jongResult = jongToEnglish[jong] || '';
return choResult + jungResult + jongResult;
});
}
이 코드는 GPT가 만들어준 js 영문 변환 함수인데, 한글-영문이 제대로 변환되지 않았다. 다른 사람들의 코드도 참고해 봤지만, 영어 대/소문자를 구분할 수 없는 데다 코드가 너무 길어진다는 문제가 있어 사용하지 않았다. (오류 - 대문자 D를 입력받아야 하는데 한글 'ㅇ'입력 시 소문자'd'로 입력됨)
위의 해결 방식을 사용하기 싫다면, 한글 자판 입력 시 사용자에게 한/영키 전환 경고 메세지를 출력해 주거나 대/소문자 구분이 필요 없는 경우라면 커스텀 함수를 사용하면 될 것 같다.
한글 구분 정규식
let korCheck = /[ㄱ-ㅎㅏ-ㅣ가-힣]/;
if (korCheck.test($(this).val())) {
alert('한/영키 전환이 필요합니다.');
$('#mbarcode').val('');
}