문제

우리는 Team Foundation Server (TFS)에 영어 가외의 특성 (Š)이있는 프로젝트를 가지고 있습니다. 우리가 문제를 발견 한 몇 가지 빌드 관련 사항을 스크립트하려고 할 때 š 명령 줄 도구에 대한 편지. 명령 프롬프트 또는 다른 것이 엉망인 것, 그리고 tf.exe 유틸리티는 지정된 프로젝트를 찾을 수 없습니다.

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

도움이 되었습니까?

해결책

내 배경 : 나는 콘솔에서 수년간 유니 코드 입력/출력을 사용합니다 (그리고 매일 많이하십시오. 또한이 작업을위한 지원 도구를 개발합니다). 다음 사실/한계를 이해하는 한 문제는 거의 없습니다.

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

세부 사항

  • 콘솔에 유니 코드를 읽고 쓰기 위해서는 응용 프로그램 (또는 C 런타임 라이브러리)이 사용하기에 충분히 똑똑해야합니다. File-I/O API이지만 Console-I/O API. (예를 들어, 참조하십시오 파이썬이 어떻게하는지.)
  • 마찬가지로, 유니 코드 명령 줄 인수를 읽으려면 응용 프로그램 (또는 C 런타임 라이브러리)은 해당 API를 사용하기에 충분히 똑똑해야합니다.
  • 콘솔 글꼴 렌더링은 BMP의 유니 코드 문자 만 지원합니다 (즉, 아래 : 아래 : 아래 U+10000). 간단한 텍스트 렌더링 만 지원됩니다 (따라서 유럽 - 및 일부 동아시아어는 언어가 잘 작동해야합니다. [이있다 작은 작은 글씨 여기 동아시아 및 캐릭터 U+0000, U+0001, U+30FB의 경우

실질적인 고려 사항

  • 그만큼 기본값 창에서는 그다지 도움이되지 않습니다. 최상의 경험을 위해 3 가지 구성을 조정해야합니다.

  • 콘솔 애플리케이션에 "붙여 넣기"가있는 하나 더 gotcha (매우 기술적) :

    • 16 진수 입력은 문자를 제공합니다 KeyUpAlt; 모두 캐릭터를 전달하는 다른 방법은 발생합니다 KeyDown; 너무 많은 응용 프로그램이 캐릭터를 볼 준비가되지 않았습니다. KeyUp. (응용 프로그램에만 적용 가능합니다 Console-I/O API.)
    • 결론 : 많은 응용 프로그램이 16 진수 입력 이벤트에 반응하지 않습니다.
    • 또한 "페이스트 형"문자로 발생하는 것은 현재 키보드 레이아웃에 따라 다릅니다. 접두사 키를 사용하지 않고 문자를 입력 할 수있는 경우 (그러나 임의의 복잡한 수정 자 조합, Ctrl-Alt-AltGr-Kana-Shift-Gray*) 그런 다음 에뮬레이션 된 키 프레스에 전달됩니다. 이것은 모든 응용 프로그램이 기대하는 것입니다. 따라서 그러한 문자 만 포함하는 것을 붙잡는 것은 괜찮습니다.
    • 그러나 "기타"문자는 에뮬레이션 육각 입력.

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

또한 Windows의“대안, '유능한'콘솔”이라는 점을 명심해야합니다. 콘솔이 전혀 없습니다. 그들은지지하지 않습니다 Console-I/O API, 따라서이 API에 의존하는 프로그램은 작동하지 않습니다. ( "파일 -I/O API에 콘솔 파일 핸들"만 사용하는 프로그램은 잘 작동합니다.)

그러한 비 균열의 한 가지 예는 Microsoft의 일부입니다. Powershell. 나는 그것을 사용하지 않습니다. 실험하려면 누르고 누르십시오 WinKey, 그런 다음 입력하십시오 powershell.


(반면에, 다음과 같은 프로그램이 있습니다. ConEmu 또는 ANSICON 더 많은 노력을 기울이고 있습니다 : 그들은 가로 채기 위해“시도” Console-I/O "진정한 콘솔 애플리케이션"도 작동하는 API. 이것은 분명히 장난감 예제 프로그램에 적용됩니다. 실제로 이것은 특정 문제를 해결하거나 해결하지 않을 수 있습니다. 실험.)

요약

  • 글꼴, 키보드 레이아웃을 설정하십시오 (선택적으로 육각 입력 허용).

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

upd : 처음에는 버그를 위해 cp65001, 나는 커널과 CRTL 층을 혼합하고 있었다 (Upd² : 및 Windows 사용자 모드 API!). 또한: Win8 은이 버그의 절반을 수정합니다. “더 나은 콘솔”응용 프로그램에 대한 섹션을 명확히하고 Python의 수행 방식에 대한 참조를 추가했습니다.

다른 팁

노력하다:

chcp 65001

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

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

나를 위해 작동하는 솔루션은 다음과 같습니다.

배치 파일에서 charset 페이지를 변경하십시오

내 배치 파일 :

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

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

콘솔에는 문자가 올바르게 표시되지 않지만 이해합니다 ...

비공개 프로그램의 언어를 확인하십시오. Windows 콘솔에서 러시아어에 문제가있는 경우 여기에 러시아어를 설정해야합니다.

Changing language for non-Unicode programs

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

가장 안전한 솔루션은 이것입니다. 레지스트리 키로 이동하십시오. HKEY_CURRENT_USER\Software\Microsoft\Command Processor 문자열 값을 추가하십시오 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"

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

영어 이외의 chracters가 포함 된 명령 프롬프트에 경로를 입력하면 "??????????"로 표시됩니다. 당신이 당신의 명령 (cd "??????????

Windows 10 X64 머신에서, 나는 영어가 아닌 문자를 표시하는 명령 프롬프트를 다음과 같이 표시했습니다.

높은 명령 프롬프트를여십시오 (CMD.exe를 관리자로 실행). 사용 가능한 TrueType 글꼴에 대한 레지스트리 쿼리 : 콘솔에 대한 다음과 같습니다.

    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와 같은 캐릭터를 지원하는 Truetype 글꼴을 추가해야합니다. 우리는 문자열 이름에 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 콘솔과 함께 제공됩니다. 제목 표시 줄을 마우스 오른쪽 버튼으로 클릭하십시오 명령 프롬프트 및 클릭 Defaults 옵션. 이것은 또한 색상에 액세스 할 수 있습니다. 선택하여 특정 방식으로 호출 된 명령 Windows 설정을 변경할 수도 있습니다. Properties 대신에.
  2. 코드 페이지를 설정해야합니다 cp65001, Microsoft가 UTF-7 및 UTF-8 지원을 제공하려는 시도 인 것으로 보입니다. 실행 하여이 작업을 수행하십시오 chcp 65001 명령 프롬프트에서. 일단 설정되면 창이 닫힐 때 까지이 방법으로 남아 있습니다. cmd.exe를 시작할 때마다 이것을 다시 만들어야합니다.

보다 영구적 인 솔루션은 참조하십시오 이 답변 슈퍼 사용자. 요컨대, a REG_SZ (문자열) regedit at을 사용한 항목 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor 그리고 이름을 지정하십시오 AutoRun. 그것의 가치를 변경하십시오 chcp 65001. 명령에서 출력 메시지를보고 싶지 않다면 사용하십시오. @chcp 65001>nul 대신에.

일부 프로그램은이 인코딩과 상호 작용하는 데 어려움을 겪고 있으며 Mingw는 무의미한 오류 메시지로 컴파일하는 동안 실패하는 주목할만한 것입니다. 그럼에도 불구하고 이것은 매우 잘 작동하며 대부분의 프로그램과 함께 버그를 일으키지 않습니다.

정말 간단한 옵션 중 하나는 Windows 배쉬 쉘을 설치하는 것입니다. mingw 그리고 그것을 사용하십시오 :

Enter image description here

Unix 명령 줄 기능을 사용해야하므로 약간의 학습 곡선이 있지만 그 힘을 좋아하고 콘솔 문자를 UTF-8로 설정할 수 있습니다.

Enter image description here

물론 당신은 또한 Grep, Find, Less 등과 같은 모든 일반적인 *nix 케이크를 얻습니다.

비슷한 문제의 경우 (내 문제는 명령 프롬프트에서 MySQL에서 UTF-8 문자를 보여주는 것이 었습니다),

나는 다음과 같이 해결했다 :

  1. 명령 프롬프트 글꼴을 Lucida 콘솔로 변경했습니다. (이 단계는 상황과 관련이 없어야합니다. 실제로 캐릭터가 아닌 화면에서 보는 것과 관련이 있습니다).

  2. CodePage를 Windows-1253으로 변경했습니다. "CHCP 1253"의 명령 프롬프트 에서이 작업을 수행합니다. UTF-8을보고 싶었던 사건에서 효과가있었습니다.

이 방법이 새로운 버전의 Windows 10에서 유용하다고 생각했습니다.

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

제어판 -> 지역 설정 -> 관리 탭 -> 시스템 로케일 변경 ...

Region Settings

이 문제는 상당히 성가시다. 나는 보통 내 파일 이름과 파일 콘텐츠에 중국어가 있습니다. Windows 10을 사용하고 있습니다. 여기에 내 해결책이 있습니다.

표시합니다 파일 이름, 와 같은 dir 또는 ls Windows 10에 Ubuntu Bash를 설치 한 경우

  1. NOT 8 캐릭터를 지원하도록 영역을 설정하십시오.

  2. 그 후, 콘솔의 글꼴은 해당 로케일의 글꼴로 변경되며 콘솔의 인코딩도 변경됩니다.

이전 단계를 수행 한 후 파일 내용 명령 줄 도구를 사용하는 UTF-8 파일의

  1. 페이지를 UTF-8로 변경하십시오 chcp 65001
  2. Lucida 콘솔과 같은 UTF-8을 지원하는 글꼴로 변경
  3. 사용 type 파일 내용을 살펴 보려면 명령 또는 cat Windows 10에 Ubuntu Bash를 설치 한 경우
  4. 콘솔의 인코딩을 UTF-8로 설정 한 후 중국 입력 방법을 사용하여 CMD에 중국어를 입력 할 수 없습니다.

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

.BAT 파일에 대한 빠른 결정 컴퓨터가 경로/파일 이름을 표시하는 경우 DOS-WINDOW로 입력 할 때 올바른 경로/파일 이름을 표시합니다.

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

이렇게하면 .txt 파일 -Temp.txt를 만듭니다. 메모장으로 열고 텍스트를 복사하고 (읽을 수없는 것처럼 보일지 걱정하지 마십시오) .BAT 파일에 붙여 넣습니다. DOS-WINDOW에서 이런 식으로 만든 .BAT를 실행하는 것은 Mе (Cyrillic, Bulgarian)에서 일했습니다.

더 깨끗한 일 : 사용 가능한 Microsoft 일본어 팩 만 설치하십시오. (다른 동양 언어 팩도 효과가 있지만 일본어를 테스트했습니다.)

이렇게하면 더 큰 글리프 세트가있는 글꼴을 제공하고 기본 동작을 만들고 CMD, WordPad 등과 같은 다양한 Windows 도구를 변경합니다.

코드 페이지를 1252로 변경하는 것이 저에게 효과가 있습니다. 나에게 문제는 Symbol Double Doller §가 Windows Server 2008의 DOS에 의해 다른 기호로 변환되는 것입니다.

나는 BCP 성명서 ^§에서 CHCP 1252와 CAP를 사용했습니다.

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

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 Font를 사용하여 부분적 유니 코드 지원이 제공됩니다.

문서화 된대로 Microsoft/Terminal 이슈 387:

현재 유니 코드에는 87,887 개의 표식이 있습니다. 당신도 그들 모두가 필요합니까?
우리는 경계가 필요하며 해당 경계를 넘어서 문자는 글꼴 폴백 / 글꼴 링크 / 뭐든지 처리해야합니다.

Consolas가 다루어야 할 사항 :

  • CLI의 Modern OSS 프로그램에서 사용하는 기호로 사용되는 문자.
  • 이 캐릭터는 Consolas의 디자인 및 메트릭을 따라야하며 기존 Consolas 문자와 적절하게 조정해야합니다.

Consolas를 다루지 말아야 할 사항 :

  • 라틴어, 그리스어 및 키릴을 넘어서, 특히 캐릭터는 복잡한 형성 (아랍어와 같은)의 문자와 구두점입니다.
  • 이 문자는 글꼴 폴백으로 처리해야합니다.

유니 코드 이름 파일을 짧은 (8 DOT 3) 이름으로 참조하여 유니 코드 명명 파일을 삭제하는 비슷한 문제를 해결했습니다.

짧은 이름은 수행하여 볼 수 있습니다 dir /x. 분명히 이것은 이미 알려진 유니 코드 파일 이름으로 만 작동합니다.

UTF-8에 : chcp 65001

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top