파워쉘 keytool 한글 깨짐(물음표 ???) 해결 - 안드로이드 키스토어 생성 시 인코딩 문제
안드로이드 앱을 출시하려면 keytool로 업로드 키스토어(.jks)를 만들어야 한다. 그런데 윈도우 11 파워쉘에서 keytool을 실행하면 안내 문구가 ? ??? ???? ??:처럼 전부 물음표로 깨져 나와서, 지금 무엇을 입력하라는 것인지 알 수 없는 상황이 생긴다. 이 글은 이 한글 깨짐의 원인과 두 가지 해결 방법, 그리고 함께 마주치게 되는 JKS 포맷 경고까지 정리한 것이다.
왜 물음표로 깨지는가
이것은 글꼴 문제가 아니라 인코딩 불일치 문제다. keytool은 자바(JVM) 프로그램이라 윈도우의 한국어 로케일을 따라 안내문을 한글로 출력하는데, JVM이 내보내는 출력 인코딩과 콘솔이 기대하는 인코딩이 서로 맞지 않으면 한글이 전부 ?로 바뀐다. 깨진 문구의 정체는 "키 저장소 비밀번호 입력:" 같은 평범한 한글 안내문이다.
해결 방향은 두 가지다. 한글 출력 자체를 없애거나(영어로 강제), 인코딩을 UTF-8로 통일하거나. 키스토어 생성처럼 한 번 실행하고 마는 작업이라면 영어 강제 쪽이 훨씬 간단하다.
방법 1 (추천): 안내문을 영어로 강제 출력
keytool에 -J 옵션으로 JVM 언어를 영어로 지정하면 된다. 한글 자체가 나오지 않으니 깨질 일도 없다.
& "C:\Program Files\Android\Android Studio\jbr\bin\keytool.exe" -J-Duser.language=en -J-Duser.country=US -genkey -v -keystore $env:USERPROFILE\my-upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
이렇게 실행하면 "Enter keystore password:", "What is your first and last name?"처럼 영어로 또박또박 물어봐서 헷갈릴 일이 없다. 안드로이드 스튜디오에 포함된 JBR의 keytool은 보통 PATH에 등록되어 있지 않으므로, 위처럼 전체 경로에 & 호출 연산자를 붙여 실행해야 한다.
방법 2: 한글 그대로 보고 싶다면 UTF-8로 통일
콘솔, 파워쉘, keytool 출력을 모두 UTF-8로 맞추는 방법이다. 명령 실행 전에 아래 두 줄을 먼저 입력한다.
chcp 65001
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
그다음 keytool에 표준 출력과 표준 에러의 인코딩을 UTF-8로 지정해서 실행한다.
& "C:\Program Files\Android\Android Studio\jbr\bin\keytool.exe" "-J-Dsun.stdout.encoding=UTF-8" "-J-Dsun.stderr.encoding=UTF-8" -genkey -v -keystore $env:USERPROFILE\my-upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
실제로 이 방법을 적용하자 keytool의 한글 안내문이 정상적으로 표시되었다. 다만 설정할 항목이 방법 1보다 많다.
두 방법 비교
| 구분 | 방법 1: 영어 강제 | 방법 2: UTF-8 통일 |
| 추가 옵션 | -J-Duser.language=en -J-Duser.country=US | chcp 65001 + 콘솔 인코딩 + sun.stdout.encoding |
| 안내문 언어 | 영어 | 한글 유지 |
| 손이 가는 정도 | 옵션 두 개만 추가 | 사전 설정 두 줄 + 옵션 두 개 |
| 어울리는 경우 | 한 번 실행하고 마는 작업 | 한글 출력을 계속 봐야 하는 경우 |
함께 마주치는 것들
JKS 포맷 경고는 무시해도 된다
키스토어를 만들면 "JKS는 구형 포맷이니 PKCS12로 마이그레이션하라"는 경고가 나올 수 있다. 이것은 권장 사항일 뿐이며, JKS 그대로 둬도 안드로이드 업로드 키로 문제없이 작동한다. 신경 쓰인다면 경고문에 안내된 변환 명령을 실행하면 되는데, 원본과 대상이 같은 파일이면 제자리 변환이 되고 keytool이 원본을 .old 파일로 백업해 두므로 안전하다.
& "C:\Program Files\Android\Android Studio\jbr\bin\keytool.exe" -importkeystore -srckeystore 키스토어경로.jks -destkeystore 키스토어경로.jks -deststoretype pkcs12
처음부터 경고 없이 만들고 싶다면 생성 시 -storetype PKCS12를 지정하면 된다.
에러 메시지 복사는 클립보드 직행으로
keytool 에러 메시지는 stderr로 출력되기 때문에 | clip만 붙이면 클립보드에 잡히지 않는다. 에러까지 통째로 복사하려면 다음처럼 실행한다.
keytool 명령 2>&1 | clip
빨간 에러 메시지가 그대로 클립보드에 들어가서 메모장이나 검색창에 바로 붙여넣을 수 있다. 터미널에서 마우스 드래그 복사가 불안정한 환경에서 특히 유용하다.
정리
파워쉘에서 keytool 한글이 물음표로 깨지는 것은 JVM 출력 인코딩과 콘솔 인코딩의 불일치가 원인이다. 키스토어를 한 번 만들고 마는 상황이라면 -J-Duser.language=en -J-Duser.country=US로 영어 출력을 강제하는 것이 가장 간단하고 확실하며, 한글을 유지하고 싶다면 chcp 65001과 UTF-8 인코딩 지정으로 통일하면 된다. JKS 경고는 무시해도 되고, 에러 복사는 2>&1 | clip이 가장 빠르다.
이 시리즈의 다른 글: 윈도우 11 터미널 마우스 드래그 복사가 자꾸 풀릴 때 원인과 해결 방법
※ keytool 옵션과 경로는 2026년 기준(Android Studio JBR 동봉 버전)이며 변경될 수 있습니다.
댓글
댓글 쓰기