bpo-32409: Fix regression in activate.bat on international Windows (GH-10295)

Handle Unicode contents on localised Windows systems when activating a
venv. activate.bat currently breaks on German Windows systems, as chcp.com does
not return a plain number as on English systems, but (arbitrarily) appends a dot at the end
(for example "Aktive Codepage: 850." instead of "Active Codepage: 850"). The
dependency to chcp.com is removed and ctypes is used to get, set and restore the
console output code page. The code page for console input is not changed.

We can't use __VENV_PYTHON__ to find python.exe, since it's UTF-8. cmd.exe decodes
the script using the console output code page.
This commit is contained in:
samstagern 2018-11-07 17:49:14 +01:00 committed by Vinay Sajip
parent 637a33b996
commit c64583b6d3
2 changed files with 7 additions and 6 deletions

View File

@ -1,11 +1,10 @@
@echo off @echo off
rem This file is UTF-8 encoded, so we need to update the current code page while executing it rem This file is UTF-8 encoded, so we need to update the current code page while executing it.
for /f "tokens=2 delims=:" %%a in ('"%SystemRoot%\System32\chcp.com"') do ( for /f %%a in ('%~dp0python.exe -Ic "import ctypes; print(ctypes.windll.kernel32.GetConsoleOutputCP())"') do (set "_OLD_CODEPAGE=%%a")
set "_OLD_CODEPAGE=%%a"
)
if defined _OLD_CODEPAGE ( if defined _OLD_CODEPAGE (
"%SystemRoot%\System32\chcp.com" 65001 > nul %~dp0python.exe -Ic "import ctypes; ctypes.windll.kernel32.SetConsoleOutputCP(65001)"
) )
set "VIRTUAL_ENV=__VENV_DIR__" set "VIRTUAL_ENV=__VENV_DIR__"
@ -40,6 +39,6 @@ set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%"
:END :END
if defined _OLD_CODEPAGE ( if defined _OLD_CODEPAGE (
"%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul %~dp0python.exe -Ic "import ctypes; ctypes.windll.kernel32.SetConsoleOutputCP(%_OLD_CODEPAGE%)"
set "_OLD_CODEPAGE=" set "_OLD_CODEPAGE="
) )

View File

@ -0,0 +1,2 @@
Fixed implementation of :file:`activate.bat` to handle Unicode contents on
localized Windows systems (eg. German). Patch by Martin Bijl.