Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

LocaleEmulator를 이용해 유니코드를 지원하지 않는(한글이 깨지는) 프로그램을 실행하는 방법

지난 글에서,

C# - 키움 Open API+ 사용 시 Registry 등록 없이 KHOpenAPI.ocx 사용하는 방법
; https://www.sysnet.pe.kr/2/0/12129

소개한 KOA Studio 등의 프로그램들은 내부적으로 유니코드를 지원하지 않아 다음과 같은 식으로 Region 설정을 한 PC에서는,

개발자 PC 환경 - 유니코드(Unicode)를 위한 설정
; https://www.sysnet.pe.kr/2/0/762

영문 설정의 Windows 10 명령행 창(cmd.exe)의 한글 지원
 - Use Unicode UTF-8 for worldwide language support
; https://www.sysnet.pe.kr/2/0/11559#region_utf8

이렇게 한글이 깨져 나오는 문제가 있습니다.

khopenapi_regfree_3.png

이 문제를 근본적으로 해결하려면 해당 응용 프로그램을 개발한 측에서 유니코드 지원을 하도록 문자 셋을 바꿔 다시 빌드/배포해줘야 합니다.




개발사가 그렇게 해줄 수 없다면, 우회 방법으로 보조 프로그램을 사용할 수 있습니다. 제가 찾아낸 것은 github에 소스 코드까지 공개된 LocaleEmulator인데요.

xupefei / Locale-Emulator
; https://github.com/xupefei/Locale-Emulator

다운로드
; https://github.com/xupefei/Locale-Emulator/releases

설명에서처럼 특정 프로그램을 탐색기에서 마우스 우 클릭해 "Run in ..." 메뉴를 선택해도 되고, 저처럼 ^^ 명령행에서 직접 하는 것도 가능합니다. 예를 들어 KOA Studio의 경우 해당 프로그램이 설치된 폴더에 EXE 파일 이름을 따라 확장자가 "le.config"으로 끝나는 파일을 만들어 주고,

[KOAStudioSA.exe.le.config]

<?xml version="1.0" encoding="utf-8"?>
<LEConfig>
  <Profiles>
    <Profile Name="KOAStudioSA.exe.le.config" Guid="4cdbb63b-c70e-491e-bf34-887f3fde0d49" MainMenu="false">
      <Parameter></Parameter>
      <Location>ko</Location>
      <Timezone>Korea Standard Time</Timezone>
      <RunAsAdmin>false</RunAsAdmin>
      <RedirectRegistry>true</RedirectRegistry>
      <IsAdvancedRedirection>true</IsAdvancedRedirection>
      <RunWithSuspend>false</RunWithSuspend>
    </Profile>
  </Profiles>
</LEConfig>

Locale-Emulator의 실행 파일 중 "LEProc.exe"를 이용해 다음과 같이 실행해 주면 됩니다.

[KOAStudioSA.exe가 관리자 권한을 요구하므로 cmd.exe 창을 관리자 권한으로 실행]

C:\KOAStudioSA> leproc.exe -run KOAStudioSA.exe

오호~~~ 아래와 같이 한글이 깨끗하게 아주 잘~~~ 보입니다. ^^

locale_emul_1.png

여기서 놀라운 것은, "로그인 화면"은 KOAStudioSA.exe 프로세스가 자식 프로세스로 생성한 opstarter.exe에 의해 제공되는 것인데, 그것까지도 부모 프로세스에 설정된 locale이 상속해서 동작했다는 점입니다.




참고로, 소스 코드가 모두 공개되어 있으므로 직접 빌드하셔도 됩니다.

1) c:\temp> git clone https://github.com/xupefei/Locale-Emulator.git

2) c:\temp\Locale-Emulator\LocaleEmulator.sln을 Visual Studio 2019에서 열어 빌드

3) c:\temp> git clone https://github.com/xupefei/Locale-Emulator-Core.git

4) c:\temp\Locale-Emulator-Core 하위의 _Compilers, _Libs, _WDK 폴더에 있는 7z 압축을 해제

5) c:\temp\Locale-Emulator-Core\LocaleEmulator\LocaleEmulator.sln을 Visual Studio 2019에서 열어 다음의 설정으로 빌드
  Windows SDK Version: 8.1
  Platform Toolset: Visual Studio 2019 (v142)

6)  c:\temp\Locale-Emulator-Core\LoaderDll\LoaderDll.sln을 Visual Studio 2019에서 열어 다음의 설정으로 빌드
  Windows SDK: 7.0
  Platform Toolset: Visual Studio 2017 - Windows XP (v141_xp)

7) 5번과 6번에 빌드한 LoaderDll.dll, LocaleEmulator.dll 파일을 2번에서 빌드한 결과물(c:\temp\Locale-Emulator\Build\Debug) 폴더에 복사

재미있는 것은, "Use Unicode UTF-8 for worldwide language support" 옵션이 적용된 컴퓨터에서는 C++ 프로젝트인 LoaderDll.sln, LocaleEmulator.sln을 빌드하는 경우 "fatal error C1001: An internal error has occurred in the compiler." 오류가 발생합니다.

마지막으로, Visual Studio 2015에서 빌드하는 경우 환경에 따라 (아마도 2017까지 설치된 경우) LoaderDll.sln과 LocaleEmulator.sln은 각각 다음과 같은 식의 빌드 오류가 발생할 수 있습니다.

MSB8020 The build tools for v141_xp (Platform Toolset = 'v141_xp') cannot be found. To build using the v141_xp build tools, please install v141_xp build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".

MSB8020 The build tools for v141 (Platform Toolset = 'v141') cannot be found. To build using the v141 build tools, please install v141 build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".

그런데 이게 사실 좀 말이 안 됩니다. v141_xp는 Visual Studio 2017을 위한 XP Toolset이기 때문에 2015에서는 원래 보이질 않습니다. v141도 마찬가지로 2017 용의 Toolset이어서 2015에는 설정이 안 됩니다. 따라서 Visual Studio 2015에서는 그냥 v140_xp, v140으로 각각 맞춰 빌드를 진행하면 됩니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/15/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-06-01 01시09분
[초보개발자] 도움을 주셔서 감사합니다. 덕분에 실행이 잘되네요.
[guest]

1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13718정성태8/27/20247417오류 유형: 921. Visual C++ - error C1083: Cannot open include file: 'float.h': No such file or directory [2]
13717정성태8/26/20247022VS.NET IDE: 192. Visual Studio 2022 - Windows XP / 2003용 C/C++ 프로젝트 빌드
13716정성태8/21/20246757C/C++: 167. Visual C++ - 윈도우 환경에서 _execv 동작 [1]
13715정성태8/19/20247361Linux: 78. 리눅스 C/C++ - 특정 버전의 glibc 빌드 (docker-glibc-builder)
13714정성태8/19/20246743닷넷: 2295. C# 12 - 기본 생성자(Primary constructors) (책 오타 수정) [3]
13713정성태8/16/20247455개발 환경 구성: 721. WSL 2에서의 Hyper-V Socket 연동
13712정성태8/14/20247215개발 환경 구성: 720. Synology NAS - docker 원격 제어를 위한 TCP 바인딩 추가
13711정성태8/13/20248062Linux: 77. C# / Linux - zombie process (defunct process) [1]파일 다운로드1
13710정성태8/8/20247980닷넷: 2294. C# 13 - (6) iterator 또는 비동기 메서드에서 ref와 unsafe 사용을 부분적으로 허용파일 다운로드1
13709정성태8/7/20247751닷넷: 2293. C# - safe/unsafe 문맥에 대한 C# 13의 (하위 호환을 깨는) 변화파일 다운로드1
13708정성태8/7/20247531개발 환경 구성: 719. ffmpeg / YoutubeExplode - mp4 동영상 파일로부터 Audio 파일 추출
13707정성태8/6/20247771닷넷: 2292. C# - 자식 프로세스의 출력이 4,096보다 많은 경우 Process.WaitForExit 호출 시 hang 현상파일 다운로드1
13706정성태8/5/20247881개발 환경 구성: 718. Hyper-V - 리눅스 VM에 새로운 디스크 추가
13705정성태8/4/20248153닷넷: 2291. C# 13 - (5) params 인자 타입으로 컬렉션 허용 [2]파일 다운로드1
13704정성태8/2/20248110닷넷: 2290. C# - 간이 dotnet-dump 프로그램 만들기파일 다운로드1
13703정성태8/1/20247437닷넷: 2289. "dotnet-dump ps" 명령어가 닷넷 프로세스를 찾는 방법
13702정성태7/31/20247840닷넷: 2288. Collection 식을 지원하는 사용자 정의 타입을 CollectionBuilder 특성으로 성능 보완파일 다운로드1
13701정성태7/30/20248109닷넷: 2287. C# 13 - (4) Indexer를 이용한 개체 초기화 구문에서 System.Index 연산자 허용파일 다운로드1
13700정성태7/29/20247714디버깅 기술: 200. DLL Export/Import의 Hint 의미
13699정성태7/27/20248237닷넷: 2286. C# 13 - (3) Monitor를 대체할 Lock 타입파일 다운로드1
13698정성태7/27/20248194닷넷: 2285. C# - async 메서드에서의 System.Threading.Lock 잠금 처리파일 다운로드1
13697정성태7/26/20247920닷넷: 2284. C# - async 메서드에서의 lock/Monitor.Enter/Exit 잠금 처리파일 다운로드1
13696정성태7/26/20247454오류 유형: 920. dotnet publish - error NETSDK1047: Assets file '...\obj\project.assets.json' doesn't have a target for '...'
13695정성태7/25/20247438닷넷: 2283. C# - Lock / Wait 상태에서도 STA COM 메서드 호출 처리파일 다운로드1
13694정성태7/25/20247905닷넷: 2282. C# - ASP.NET Core Web App의 Request 용량 상한값 (Kestrel, IIS)
13693정성태7/24/20247233개발 환경 구성: 717. Visual Studio - C# 프로젝트에서 레지스트리에 등록하지 않은 COM 개체 참조 및 사용 방법파일 다운로드1
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...