DeDRM_tools/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/argv_utils.py

89 lines
2.4 KiB
Python
Raw Normal View History

2013-01-19 20:50:57 +06:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
import locale
import codecs
# get sys.argv arguments and encode them into utf-8
2013-02-07 16:28:25 +06:00
def unicode_argv():
2013-01-19 20:50:57 +06:00
if sys.platform.startswith('win'):
2013-02-07 16:28:25 +06:00
# Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode
# strings.
2013-01-19 20:50:57 +06:00
# Versions 2.x of Python don't support Unicode in sys.argv on
# Windows, with the underlying Windows API instead replacing multi-byte
2013-02-07 16:28:25 +06:00
# characters with '?'.
2013-01-19 20:50:57 +06:00
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)
2013-02-07 16:28:25 +06:00
return [argv[i] for i in
2013-01-19 20:50:57 +06:00
xrange(start, argc.value)]
2013-02-07 16:28:25 +06:00
# if we don't have any arguments at all, just pass back script name
2013-01-19 20:50:57 +06:00
# this should never happen
2013-02-07 16:28:25 +06:00
return [u"DeDRM.py"]
2013-01-19 20:50:57 +06:00
else:
argvencoding = sys.stdin.encoding
if argvencoding == None:
2013-02-07 16:28:25 +06:00
argvencoding = "utf-8"
return [arg if (type(arg) == unicode) else unicode(arg,argvencoding) for arg in sys.argv]
2013-01-19 20:50:57 +06:00
def add_cp65001_codec():
try:
codecs.lookup('cp65001')
except LookupError:
codecs.register(
lambda name: name == 'cp65001' and codecs.lookup('utf-8') or None)
return
def set_utf8_default_encoding():
if sys.getdefaultencoding() == 'utf-8':
return
# Regenerate setdefaultencoding.
reload(sys)
sys.setdefaultencoding('utf-8')
for attr in dir(locale):
if attr[0:3] != 'LC_':
continue
aref = getattr(locale, attr)
try:
locale.setlocale(aref, '')
except locale.Error:
continue
try:
lang = locale.getlocale(aref)[0]
except (TypeError, ValueError):
continue
if lang:
try:
locale.setlocale(aref, (lang, 'UTF-8'))
except locale.Error:
os.environ[attr] = lang + '.UTF-8'
try:
locale.setlocale(locale.LC_ALL, '')
except locale.Error:
pass
return