Programing

Windows 명령 행에서 유니 코드 문자를 사용하는 방법은 무엇입니까?

lottogame 2020. 3. 16. 08:11
반응형

Windows 명령 행에서 유니 코드 문자를 사용하는 방법은 무엇입니까?


영어가 아닌 문자 (š)가있는 Team Foundation Server (TFS) 프로젝트가 있습니다. 빌드 관련 몇 가지 스크립트를 작성하려고 할 때 문제가 발생했습니다. š 문자를 명령 행 도구로 전달할 수 없습니다 . 명령 프롬프트 또는 다른 메시지가 엉망이되어 tf.exe 유틸리티가 지정된 프로젝트를 찾을 수 없습니다.

나는 .bat 파일 (ANSI, UTF-8 BOM이 있거나 없는 UTF-8)에 대해 다른 형식을 시도했지만 JavaScript (스크립트는 본질적으로 유니 코드 임)로 스크립팅했지만 운이 없습니다. 프로그램을 실행하고 유니 코드 명령 줄을 어떻게 전달 합니까?


내 배경 : 몇 년 동안 콘솔에서 유니 코드 입력 / 출력을 사용합니다 (매일 많이 수행합니다. 또한이 작업을위한 지원 도구를 개발합니다). 다음 사실 / 제한을 이해하는 한 거의 문제가 없습니다.

  • CMD"콘솔"은 관련이없는 요소입니다. CMD.exe콘솔 ( "콘솔 응용 프로그램")을 "내부"로 사용할 수있는 프로그램 중 하나 일뿐입니다.
  • AFAIK CMD는 유니 코드를 완벽하게 지원합니다. 코드 페이지가 활성화되어 있으면 모든 유니 코드 문자를 입력 / 출력 할 수 있습니다 .
  • Windows 콘솔에는 많은 유니 코드 지원 기능이 있지만 완벽하지는 않습니다 ( "충분히"충분합니다 (아래 참조)).
  • chcp 65001매우 위험합니다. 프로그램이 Windows API의 결함을 해결하도록 특별히 설계되지 않은 경우 (또는 이러한 해결 방법이있는 C 런타임 라이브러리를 사용하는 경우) 안정적으로 작동하지 않습니다. Win8은 이러한 문제의 ½을 수정 cp65001하지만 나머지는 여전히 Win10에 적용됩니다 .
  • 나는에서 일 cp1252합니다. 내가 이미 말했듯이 : 콘솔에서 유니 코드를 입력 / 출력하기 위해 코드 페이지를 설정할 필요가 없습니다 .

상세

  • 콘솔에서 유니 코드를 읽거나 쓰려면 응용 프로그램 (또는 해당 C 런타임 라이브러리)이 File-I/OAPI가 아니라 Console-I/OAPI 를 사용할 수있을 정도로 똑똑해야합니다 . (예를 들어, 파이썬이하는 방법을보십시오 .)
  • 마찬가지로 유니 코드 명령 줄 인수를 읽으려면 응용 프로그램 (또는 해당 C 런타임 라이브러리)이 해당 API를 사용할 수있을 정도로 똑똑해야합니다.
  • 콘솔 글꼴 렌더링은 BMP에서 유니 코드 문자 만 지원합니다 (즉, 아래 U+10000). 간단한 텍스트 렌더링 만 지원됩니다 (따라서 사전 구성된 양식을 사용하는 한 유럽어 및 일부 동아시아 언어는 제대로 작동해야 함). [ 동아시아 및 문자 U + 0000, U + 0001, U + 30FB 에는 약간의 작은 글씨가 있습니다.]

실제 고려 사항

  • Window 기본값 은별로 도움이되지 않습니다. 최상의 경험을 위해서는 3 가지 구성을 조정해야합니다.

  • 콘솔 응용 프로그램에 "Pasting"을 사용하여 한 번 더 알아볼 수 있습니다 (매우 기술적)

    • 16 진수 입력 KeyUpAlt; 캐릭터를 전달하는 다른 모든 방법은 다음과 같습니다 KeyDown. 너무 많은 응용 프로그램에서 문자를 볼 준비가되지 않았습니다 KeyUp. ( Console-I/OAPI를 사용하는 애플리케이션에만 적용 가능 )
    • 결론 : 많은 응용 프로그램이 HEX 입력 이벤트에 반응하지 않습니다.
    • 또한 "Pasted"문자에서 발생하는 작업은 현재 키보드 레이아웃에 따라 달라집니다. 접두사 키를 사용하지 않고 문자를 입력 할 수있는 경우 (그러나처럼 임의의 복잡한 수정 자의 조합으로 Ctrl-Alt-AltGr-Kana-Shift-Gray*) 에뮬레이트 된 키 누르기로 전달됩니다. 이것은 모든 응용 프로그램이 기대하는 것이므로 그러한 문자 만 포함하는 것은 붙여 넣는 것이 좋습니다.
    • 그러나 "다른"문자는 HEX 입력에뮬레이트하여 전달됩니다 .

    결론 : 키보드 레이아웃이 접두사 키가없는 많은 문자 입력을 지원하지 않는 경우 일부 버그가있는 응용 프로그램Paste콘솔의 UI통해문자를 건너 뛸 수 있습니다Alt-Space E P. ( 이것은 내 키보드 레이아웃을 사용하는 것이 좋습니다 이유입니다!)

또한 Windows 위한 "대체적이며 더 유능한"콘솔 은 콘솔이 아님 을 명심해야합니다 . Console-I/OAPI를 지원하지 않으므로 이러한 API를 사용하여 작동하는 프로그램은 작동하지 않습니다. (하지만 콘솔 파일 핸들에 대한 파일 I / O API 만 사용하는 프로그램은 정상적으로 작동합니다.)

이러한 비 콘솔의 한 예는 MicroSoft의 일부입니다 Powershell. 나는 그것을 사용하지 않는다; 실험하려면을 눌렀다 WinKey떼고을 입력 powershell합니다.


(반면에, ConEmu또는 ANSICON더 많은 것을 시도하는 것과 같은 프로그램 이 있습니다 : 그들은 Console-I/O"진정한 콘솔 응용 프로그램"을 작동시키기 위해 API를 가로 채려고 "시도합니다" . 이것은 실제 장난감 예제 프로그램에서 작동합니다. 특정 문제를 해결하지 못할 수도 있습니다 (실험).

요약

  • 글꼴, 키보드 레이아웃을 설정하고 선택적으로 16 진수 입력을 허용합니다.

  • Console-I/OAPI를 통과 하고 유니 코드 명령 줄 인수를 허용 하는 프로그램 만 사용하십시오 . 예를 들어, cygwin컴파일 된 프로그램은 괜찮습니다. 내가 이미 말했듯 CMD이 괜찮습니다.

UPD : 처음에는의 버그로 cp65001커널과 CRTL 레이어를 혼합했습니다 ( UPD² : 및 Windows 사용자 모드 API!). 또한 : Win8은이 버그의 절반을 수정합니다. “더 나은 콘솔”응용 프로그램에 대한 섹션을 명확하게 설명하고 Python에서 수행하는 방법에 대한 참조를 추가했습니다.


시험:

chcp 65001

코드 페이지를 UTF-8로 변경합니다. 또한 Lucida 콘솔 글꼴을 사용해야합니다.


나는 같은 문제가 있었다 (체코 출신이다). 영어로 된 Windows 설치가 있으며 공유 드라이브의 파일로 작업해야합니다. 파일 경로에는 체코 어 문자가 포함됩니다.

나에게 맞는 솔루션은 다음과 같습니다.

배치 파일에서 문자 세트 페이지를 변경하십시오.

내 배치 파일 :

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

배치 파일은 CP 1250에 저장해야합니다.

콘솔은 문자를 올바르게 표시하지 않지만 이해합니다.


비 유니 코드 프로그램의 언어를 확인하십시오. Windows 콘솔에서 러시아어에 문제가 있으면 여기에서 러시아어를 설정해야합니다.

비 유니 코드 프로그램의 언어 변경


Windows 콘솔의 기본 코드 페이지를 변경하는 것은 매우 어렵습니다. 웹을 검색 할 때 다른 제안을 찾을 수 있지만 일부 제안은 Windows를 완전히 손상시킬 수 있습니다. 즉, PC가 더 이상 부팅되지 않습니다.

가장 안전한 솔루션은 다음과 같습니다. 레지스트리 키로 이동하여 HKEY_CURRENT_USER\Software\Microsoft\Command ProcessorString value Autorun=를 추가하십시오 chcp 65001.

또는 가장 일반적인 코드 페이지에이 작은 배치 스크립트를 사용할 수 있습니다.

@ECHO off

SET ROOT_KEY="HKEY_CURRENT_USER"


FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i

ECHO System default values:

ECHO.
ECHO ...............................................
ECHO Select Codepage 
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.


SET /P  CP="Select a Codepage: "

if %CP%==1 (
    echo Set default Codepage to CP1252
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
    echo Set default Codepage to UTF-8
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
    echo Set default Codepage to CP850
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
    echo Set default Codepage to ISO-8859-1
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
    echo Set default Codepage to ISO-8859-15
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
    echo Set default Codepage to ASCII
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
    echo Reset Codepage to System Default
    reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
    echo Bye
) else (
    echo Invalid choice
    pause
)

사용 @chcp 65001>nul대신에 chcp 65001억압 출력을 "활성 코드 페이지 : 65001는"당신은 당신이 새로운 명령 행 윈도우를 시작할 때마다 얻을 것입니다.

코드 페이지 식별자 에서 얻을 수있는 모든 사용 가능한 번호의 전체 목록

설정은 현재 사용자에게만 적용됩니다. 모든 사용자에 대해 설정할 싶은 경우에, 라인을 대체 SET ROOT_KEY="HKEY_CURRENT_USER"하여SET ROOT_KEY="HKEY_LOCAL_MACHINE"


실제로, 비법은 명령 프롬프트가 영어 이외의 문자를 실제로 이해하고 올바르게 표시 할 수 없다는 것입니다.

영어가 아닌 chracter가 포함 된 명령 프롬프트에 경로를 입력하면 "?? ?????? ?????"로 표시됩니다. 명령을 제출하면 (내 경우에는 "??? ?????? ?????"cd) 모든 것이 예상대로 작동합니다.


Windows 10 x64 컴퓨터에서 다음과 같이 명령 프롬프트에 영어 이외의 문자를 표시했습니다.

관리자 권한 명령 프롬프트를 엽니 다 (CMD.EXE를 관리자 권한으로 실행). 다음을 통해 레지스트리에 콘솔에 사용 가능한 트루 타입 글꼴이 있는지 조회하십시오.

    REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"

다음과 같은 출력이 표시됩니다.

    0    REG_SZ    Lucida Console
    00    REG_SZ    Consolas
    936    REG_SZ    *新宋体
    932    REG_SZ    *MS ゴシック

이제 Courier New와 같이 필요한 문자를 지원하는 트루 타입 글꼴을 추가해야합니다. 문자열 이름에 0을 추가하여이 작업을 수행하므로이 경우 다음 이름은 "000"입니다.

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

이제 UTF-8 지원을 구현합니다 :

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

기본 글꼴을 "Courier New"로 설정하십시오.

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

글꼴 크기를 20으로 설정하십시오.

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

원하는 경우 빠른 편집을 활성화하십시오.

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

Python 2.7에 대한 완전한 답변을 보지 못했지만 두 가지 중요한 단계와 매우 유용한 선택적 단계를 간략하게 설명하겠습니다.

  1. 유니 코드를 지원하는 글꼴이 필요합니다. Windows에는 Lucida Console이 제공되며 명령 프롬프트 의 제목 표시 줄마우스 오른쪽 단추로 클릭하고 Defaults옵션을 클릭하면 선택할 수 있습니다. 또한 색상에 액세스 할 수 있습니다. Properties대신 선택하여 특정 방식으로 호출 된 명령 창의 설정 (예 : Visual Studio 열기)을 변경할 수도 있습니다 .
  2. 코드 페이지를로 설정해야 cp65001합니다.이 명령은 Microsoft에서 명령 프롬프트에 UTF-7 및 UTF-8 지원을 제공하려는 것으로 보입니다. chcp 65001명령 프롬프트에서 실행 하여이를 수행하십시오 . 설정되면 창을 닫을 때까지이 방식으로 유지됩니다. cmd.exe를 시작할 때마다이를 다시 실행해야합니다.

보다 영구적 인 해결책 은 수퍼 유저에 대한이 답변참조하십시오 . 즉, REG_SZregedit at을 사용하여 (문자열) 항목을 작성 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor하고 이름을 지정하십시오 AutoRun. 값을로 변경하십시오 chcp 65001. 명령에서 출력 메시지를 보지 않으려면 @chcp 65001>nul대신 사용하십시오.

일부 프로그램은이 인코딩과 상호 작용하는 데 문제가 있습니다. MinGW는 중요하지 않은 오류 메시지로 컴파일하는 동안 실패하는 주목할만한 프로그램입니다. 그럼에도 불구하고 이것은 매우 잘 작동하며 대부분의 프로그램에서 버그를 일으키지 않습니다.


정말 간단한 옵션 중 하나는 MinGW같은 Windows bash 셸을 설치 하고 다음을 사용하는 것입니다.

여기에 이미지 설명을 입력하십시오

유닉스 커맨드 라인 기능을 사용해야하기 때문에 약간의 학습 곡선이 있지만, 그 기능을 좋아하고 콘솔 문자 세트를 UTF-8로 설정할 수 있습니다.

여기에 이미지 설명을 입력하십시오

물론 grep, find, less 등과 같은 일반적인 * nix 제품을 모두 얻을 수 있습니다.


비슷한 문제 (내 문제는 명령 프롬프트에서 MySQL의 UTF-8 문자를 표시하는 것이 었습니다),

나는 이것을 다음과 같이 해결했다.

  1. 명령 프롬프트의 글꼴을 Lucida Console로 변경했습니다. (이 단계는 상황과 관련이 없어야합니다. 실제 캐릭터가 아니라 화면에 표시된 것과 만 관련이 있어야합니다).

  2. 코드 페이지를 Windows-1253으로 변경했습니다. "chcp 1253"명령 프롬프트에서이 작업을 수행합니다. UTF-8을보고 싶었던 경우에 효과적이었습니다.


이 방법은 새 버전의 Windows 10에서 유용한 것으로 나타났습니다.

이 기능을 켜십시오 : "베타 : 전세계 언어 지원을 위해 유니 코드 UTF-8 사용"

제어판-> 국가 별 설정-> 관리 탭-> 시스템 로케일 변경 ...

지역 설정


이 문제는 상당히 성가신 일입니다. 파일 이름과 파일 내용에 보통 한자가 있습니다. Windows 10을 사용하고 있습니다. 여기 내 솔루션이 있습니다.

디스플레이에 파일 이름 과 같은, dir또는 ls당신이 우분투는 윈도우 10에 비난 설치 한 경우

  1. UTF8 이외의 문자를 지원하도록 영역을 설정하십시오.

  2. 그 후에 콘솔의 글꼴이 해당 로캘의 글꼴로 변경되고 콘솔의 인코딩도 변경됩니다.

이전 단계를 수행 한 후 명령 행 도구를 사용하여 UTF-8 파일 파일 컨텐츠 를 표시하려면

  1. 다음으로 페이지를 utf-8로 변경하십시오. chcp 65001
  2. Lucida Console과 같이 utf-8을 지원하는 글꼴로 변경
  3. type명령을 사용 하여 파일 내용을 들여다 보거나 catWindows 10에 Ubuntu bash를 설치 한 경우
  4. 콘솔 인코딩을 utf-8로 설정 한 후 중국어 입력 방법을 사용하여 cmd에 중국어 문자를 입력 할 수 없습니다.

가장 게으른 해결책 : http://cmder.net/ 과 같은 콘솔 에뮬레이터를 사용 하십시오.


컴퓨터가 DOS 창에 경로 / 파일 이름을 입력 할 때 올바른 경로 / 파일 이름을 표시하는 경우 .bat 파일에 대한 빠른 결정 :

  1. con temp.txt 복사 [Enter를 누르십시오]
  2. 경로 / 파일 이름을 입력하십시오 [Enter를 누르십시오]
  3. 보도 Ctrl 키-Z [Enter 키를 누릅니다]

이렇게하면 .txt 파일 인 temp.txt를 만들 수 있습니다. 메모장에서 열고 텍스트를 읽을 수 있습니다 (읽을 수없는 것으로 걱정하지 마십시오)하고 .bat 파일에 붙여 넣습니다. .bat를 실행하면 DOS 창에서 이런 방식으로 만들어졌습니다 (Cyrillic, Bulgarian).


더 좋은 방법 : 사용 가능한 무료 Microsoft 일본어 팩을 설치하십시오. (다른 동양 언어 팩도 작동하지만 일본어를 테스트했습니다.)

이것은 큰 글리프 세트가있는 글꼴을 제공하고 기본 동작으로 만들고 cmd, 워드 패드 등과 같은 다양한 Windows 도구를 변경합니다.


코드 페이지를 1252로 변경하면 효과가 있습니다. 나에게 문제는 이중 인형 § 기호가 Windows Server 2008의 DOS에 의해 다른 기호로 변환된다는 것입니다.

나는 나의 BCP 선언문에서 CHCP 1252와 캡을 사용했다.


여기에 몇 가지 답변이 있지만 질문을 다루지 않는 것 같습니다. 사용자는 명령 줄에서 유니 코드 입력을 원합니다.

Windows는 2 바이트 문자열로 인코딩하기 위해 UTF-16을 사용하므로 프로그램의 OS에서이를 가져와야합니다. 이를 수행하는 두 가지 방법이 있습니다.

1) Microsoft는 main이 넓은 문자 배열을 취할 수 있도록하는 확장 기능을 가지고 있습니다 : int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) Windows API를 호출하여 명령 행의 유니 코드 버전을 얻으십시오. wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

이 읽기 : http://utf8everywhere.org을 자세한 정보를 원하시면, 다른 운영 체제를 지원하는 경우 특히.


2019 년 6 월부터 Windows 10을 사용하면 코드 페이지를 변경할 필요가 없습니다.

"를 참조 소개 Windows 터미널 (에서" 카일 계피 )과 마이크로 소프트 / 터미널 .
Consolas 글꼴을 사용하면 부분 유니 코드 지원이 제공됩니다.

Microsoft/Terminal387 호에 설명 된대로 :

현재 유니 코드에는 87,887 개의 표의 문자가 있습니다. 그들 모두도 필요합니까?
경계가 필요하고 그 경계를 넘어서는 문자는 폰트 폴백 / 폰트 링크 / 무엇이든 처리해야합니다.

Consolas가 다루어야 할 사항 :

  • CLI의 최신 OSS 프로그램에서 사용되는 기호로 사용 된 문자
  • 이러한 문자는 Consolas의 디자인 및 메트릭을 따라야하며 기존 Consolas 문자와 올바르게 정렬되어야합니다.

Consola가 다루지 않아야 할 사항 :

  • 라틴어, 그리스어 및 키릴 자모를 넘어서는 문자와 문장 부호, 특히 문자는 복잡한 형태 (예 : 아랍어)가 필요합니다.
  • 이러한 문자는 글꼴 대체로 처리해야합니다.

배치 파일에서 짧은 (8 점 3) 이름으로 파일을 참조하여 유니 코드 이름이 지정된 파일을 삭제하는 비슷한 문제가 발생했습니다.

간단한 이름은을 통해 볼 수 있습니다 dir /x. 분명히 이것은 이미 알려진 유니 코드 파일 이름에서만 작동합니다.


UTF-8로 : chcp 65001

기본값으로 돌아 가기 : chcp 437

참고 URL : https://stackoverflow.com/questions/388490/how-to-use-unicode-characters-in-windows-command-line

반응형