Считайте символы Unicode из параметров командной строки в Python 2.x в Windows

Вы отдаете компонент в Route реквизит Component. Он называется component с нижним регистром c.

<Route exact path="/CuteGoatWebsite/Home/React" component={Home} />
29
задан Community 23 May 2017 в 12:10
поделиться

4 ответа

Вот решение, которое я ищу, вызывая функцию Windows GetCommandLineArgvW :
Получить sys.argv с символами Unicode под Windows (из ActiveState)

Но я внес несколько изменений, чтобы упростить его использование и лучше справляться с некоторыми видами использования. Вот что я использую:

win32_unicode_argv.py

"""
win32_unicode_argv.py

Importing this will replace sys.argv with a full Unicode form.
Windows only.

From this site, with adaptations:
      http://code.activestate.com/recipes/572200/

Usage: simply import this module into a script. sys.argv is changed to
be a list of Unicode strings.
"""


import sys

def win32_unicode_argv():
    """Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode
    strings.

    Versions 2.x of Python don't support Unicode in sys.argv on
    Windows, with the underlying Windows API instead replacing multi-byte
    characters with '?'.
    """

    from ctypes import POINTER, byref, cdll, c_int, windll
    from ctypes.wintypes import LPCWSTR, LPWSTR

    GetCommandLineW = cdll.kernel32.GetCommandLineW
    GetCommandLineW.argtypes = []
    GetCommandLineW.restype = LPCWSTR

    CommandLineToArgvW = windll.shell32.CommandLineToArgvW
    CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)]
    CommandLineToArgvW.restype = POINTER(LPWSTR)

    cmd = GetCommandLineW()
    argc = c_int(0)
    argv = CommandLineToArgvW(cmd, byref(argc))
    if argc.value > 0:
        # Remove Python executable and commands if present
        start = argc.value - len(sys.argv)
        return [argv[i] for i in
                xrange(start, argc.value)]

sys.argv = win32_unicode_argv()

Теперь я использую его просто для выполнения:

import sys
import win32_unicode_argv

и с тех пор sys.argv представляет собой список строк Unicode , Модуль Python optparse с радостью проанализирует его, и это здорово.

29
ответ дан 28 November 2019 в 01:46
поделиться

Работа с кодировками очень сбивает с толку.

Я полагаю , что если вы вводите данные через командную строку, они будут кодировать данные так, какова бы ни была кодировка вашей системы, а не юникод , (Даже копирование / вставка должно делать это)

Таким образом, декодирование в Unicode с использованием системной кодировки должно быть правильным:

import sys

first_arg = sys.argv[1]
print first_arg
print type(first_arg)

first_arg_unicode = first_arg.decode(sys.getfilesystemencoding())
print first_arg_unicode
print type(first_arg_unicode)

f = codecs.open(first_arg_unicode, 'r', 'utf-8')
unicode_text = f.read()
print type(unicode_text)
print unicode_text.encode(sys.getfilesystemencoding())

выполнение следующего будет выводить: Подсказка> python myargv.py «PC ソ フ ト 申請書 08.09.24.txt»

PC・ソフト申請書08.09.24.txt
<type 'str'>
<type 'unicode'>
PC・ソフト申請書08.09.24.txt
<type 'unicode'>
?日本語

Где «PC ・ ソ フ ト 08.09.24.txt» содержал текст «日本語». (Я закодировал файл как utf8 с помощью блокнота Windows, я немного озадачен, почему в начале при печати стоит '?'. Что-то связано с тем, как блокнот сохраняет utf8?)

Метод «декодирования» строк или встроенная функция unicode () может использоваться для преобразования кодировки в unicode.

unicode_str = utf8_str.decode('utf8')
unicode_str = unicode(utf8_str, 'utf8')

Кроме того, если вы имеете дело с закодированными файлами, вы можете использовать функцию codecs.open () вместо встроенной функции open (). Он позволяет вам определить кодировку файла, а затем будет использовать данную кодировку для прозрачного декодирования содержимого в Unicode.

Поэтому, когда вы вызываете content = codecs.open ("myfile.txt", "r "," utf8 "). read () контент будет в юникоде.

codecs.open: http://docs.python.org/library/codecs.html?#codecs.open

If I'm miss-understanding something please let me know.

If you haven't already I recommend reading Joel's article on unicode and encoding: http://www.joelonsoftware.com/articles/Unicode.html

12
ответ дан 28 November 2019 в 01:46
поделиться

Попробуйте следующее:

import sys
print repr(sys.argv[1].decode('UTF-8'))

Возможно, вам придется заменить CP437 или CP1252 на UTF-8 . Вы должны иметь возможность вывести правильное имя кодировки из раздела реестра HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Nls \ CodePage \ OEMCP

2
ответ дан 28 November 2019 в 01:46
поделиться

Командная строка может быть в кодировке Windows. Попробуйте расшифровать аргументы в объекты unicode :

args = [unicode(x, "iso-8859-9") for x in sys.argv]
0
ответ дан 28 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: