# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/
# In Python 2 all cefpython strings are byte strings, but in Python 3
# all cefpython strings are unicode. Unicode issues were discussed
# in Issue #60: https://github.com/cztomczak/cefpython/issues/60
# Unicode issues were discussed on cython-users, see posts by Stefan
# Behnel: https://groups.google.com/d/topic/cython-users/VICzhVn-zPw/discussion
# See the "basestring" comment in cefpython.pyx.
# Note that bytes != str != unicode != basestring in Cython
# Any bytes/unicode encoding and decoding in cefpython should
# be performed only using functions from this file - let's
# keep it in one place for future fixes - see Issue 60 ("Strings
# should be unicode by default, if bytes is required make it
# explicit").
include "cefpython.pyx"
# TODO: make this configurable through ApplicationSettings.
UNICODE_ENCODE_ERRORS = "replace"
BYTES_DECODE_ERRORS = "replace"
cdef py_string AnyToPyString(object value):
cdef object valueType = type(value)
if valueType == str or valueType == bytes:
return value
elif PY_MAJOR_VERSION charString
else:
return ((charString).decode(
g_applicationSettings["string_encoding"],
errors=BYTES_DECODE_ERRORS))
# Not used anywhere so commented out.
# ---
# cdef py_string CppToPyString(
# cpp_string cppString):
# if PY_MAJOR_VERSION cppString
# else:
# return ((cppString).decode(
# g_applicationSettings["string_encoding"],
# errors=BYTES_DECODE_ERRORS))
# ---
# No need for this function as you can do it in one line.
# Stays here just for the info on how to do it.
# ---
# cdef cpp_string PyToCppString(py_string pyString) except *:
# cdef cpp_string cppString = pyString
# return cppString
# ---
cdef py_string CefToPyString(
ConstCefString& cefString):
cdef cpp_string cppString
if cefString.empty():
return ""
IF UNAME_SYSNAME == "Windows":
cdef wchar_t* wcharstr = cefString.c_str()
return WidecharToPyString(wcharstr)
ELSE:
cppString = cefString.ToString()
if PY_MAJOR_VERSION cppString
else:
return ((cppString).decode(
g_applicationSettings["string_encoding"],
errors=BYTES_DECODE_ERRORS))
cdef void PyToCefString(
py_string pyString,
CefString& cefString
) except *:
if PY_MAJOR_VERSION (pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
else:
# The unicode type is not defined in Python 3.
if type(pyString) == str:
pyString = (pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
cdef cpp_string cppString = pyString
# Using cefString.FromASCII() will result in DCHECK failures
# when a non-ascii character is encountered.
cefString.FromString(cppString)
cdef CefString PyToCefStringValue(
py_string pyString
) except *:
cdef CefString cefString
PyToCefString(pyString, cefString)
return cefString
cdef void PyToCefStringPointer(
py_string pyString,
CefString* cefString
) except *:
if PY_MAJOR_VERSION (pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
else:
# The unicode type is not defined in Python 3.
if type(pyString) == str:
pyString = (pyString.encode(
g_applicationSettings["string_encoding"],
errors=UNICODE_ENCODE_ERRORS))
cdef cpp_string cppString = pyString
# When used cefString.FromASCII(), a DCHECK failed
# when passed a unicode string.
cefString.FromString(cppString)
cdef py_string VoidPtrToString(const void* data, size_t dataLength):
if PY_MAJOR_VERSION ((data)[:dataLength])
else:
return (((data)[:dataLength]).decode(
g_applicationSettings["string_encoding"],
errors=BYTES_DECODE_ERRORS))