Несмотря на то, что у меня нет zabbix, я пытаюсь просто выполнить cmd-файл, который не выполняет ничего, кроме echo %1
, я также обнаружил, что chcp 65001
не сработал так, как ожидалось.
По-видимому, выполнение chcp 65001
только устанавливает для OutputEncoding консоли значение UTF-8, что недостаточно. Вы также должны изменить собственный PowerShells $OutputEncoding
(который также подразумевает использование chcp 65001).
Чтобы заставить PowerShell использовать UTF-8 при взаимодействии с внешними утилитами, для меня работал следующий код:
$oldOutputEncoding = $OutputEncoding
$oldConsoleEncoding = [Console]::OutputEncoding
# change the output encoding to use UTF-8
$OutputEncoding = New-Object System.Text.Utf8Encoding
[Console]::OutputEncoding = New-Object System.Text.Utf8Encoding
$oldConsoleEncoding
# This is where your zabbix related code goes to finally execute the zabbix_sender.exe
# In my test case I'm just running a cmd file that does nothing more then echo the input parameter back to console.
& "D:\blah.cmd" "русский"
# switch back to the original output encoding whe finished
$OutputEncoding = $oldOutputEncoding
[Console]::OutputEncoding = $oldConsoleEncoding
То же самое можно сделать для [Console]::InputEncoding
, если PowerShell должен получать строки UTF8 из внешних приложения.
Вы можете увидеть текущую кодировку для вывода, просто набрав $OutputEncoding
в PowerShell. На моей машине это то, что я получаю:
IsSingleByte : True
BodyName : iso-8859-1
EncodingName : West-Europees (Windows)
HeaderName : Windows-1252
WebName : Windows-1252
WindowsCodePage : 1252
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 1252
После выполнения $OutputEncoding = New-Object System.Text.Utf8Encoding
это показывает это:
BodyName : utf-8
EncodingName : Unicode (UTF-8)
HeaderName : utf-8
WebName : utf-8
WindowsCodePage : 1200
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
IsSingleByte : False
EncoderFallback : System.Text.EncoderReplacementFallback
DecoderFallback : System.Text.DecoderReplacementFallback
IsReadOnly : True
CodePage : 65001
Надеюсь, это поможет
PyCURL обеспечивает интерфейс для ЗАВИХРЕНИЯ из Python.
http://curl.haxx.se/libcurl/python/
Завихрение сделает все, в чем Вы нуждаетесь. Это может передать двоичные файлы правильно и поддерживает много кодировок. Однако необходимо удостовериться что надлежащая кодировка символов как пользовательский заголовок при РЕГИСТРАЦИИ файлов.
А именно, Вы, возможно, должны сделать, 'загрузка файла' разрабатывает POST:
http://curl.haxx.se/docs/httpscripting.html (Раздел 4.3)
С завихрением (или любой другой клиент HTTP) Вам, вероятно, придется установить довольное кодирование:
Тип контента: текст/HTML; charset=UTF-8
Кроме того, знайте, что заголовки запроса должны быть ASCII, и это включает URL (поэтому удостоверьтесь, что Вы правильно выходите из Вашего возможно unicode URL. Существуют Escape unicode для HTTP-заголовков), Это было недавно зафиксировано в Python:
http://bugs.python.org/issue3300
Я надеюсь, что это помогает, существует больше информации о теме, включая установку Вашего набора символов по умолчанию на Вашем сервере, и т.д.
Лучшая вещь, о которой я могу думать, состоит в том, чтобы закодировать его самостоятельно. Как насчет этой подпрограммы?
from urllib2 import Request, urlopen
from binascii import b2a_base64
def b64open(url, postdata):
req = Request(url, b2a_base64(postdata), headers={'Content-Transfer-Encoding': 'base64'})
return urlopen(req)
conn = b64open("http://www.whatever.com/script.cgi", u"Liberté Égalité Fraternité")
# returns a file-like object
(Хорошо, таким образом, этот код просто отправляет данные POST. Но Вы, по-видимому, хотите многослойно закодированные данные, как будто Вы нажали кнопку "Upload File", правильно? Ну, это - довольно простая комбинация того, что я имею здесь и ответы от вопроса, который Вы связали.)