@make_certifier()<EOL>def certify_string(<EOL>value, min_length=None, max_length=None, nonprintable=True, required=True,<EOL>):
certify_params(<EOL>(_certify_int_param, '<STR_LIT:max_length>', max_length, dict(negative=False, required=False)),<EOL>(_certify_int_param, '<STR_LIT>', min_length, dict(negative=False, required=False)),<EOL>(certify_int, '<STR_LIT>', nonprintable),<EOL>)<EOL>if certify_required(<EOL>value=value,<EOL>required=required,<EOL>):<EOL><INDENT>return<EOL><DEDENT>if not isinstance(value, six.string_types):<EOL><INDENT>raise CertifierTypeError(<EOL>message="<STR_LIT>".format(<EOL>cls=value.__class__.__name__),<EOL>value=value,<EOL>required=required,<EOL>)<EOL><DEDENT>if min_length is not None and len(value) < min_length:<EOL><INDENT>raise CertifierValueError(<EOL>message="<STR_LIT>".format(<EOL>length=len(value), min=min_length),<EOL>value=value,<EOL>required=required,<EOL>)<EOL><DEDENT>if max_length is not None and len(value) > max_length:<EOL><INDENT>raise CertifierValueError(<EOL>message="<STR_LIT>".format(<EOL>length=len(value), max=max_length),<EOL>value=value,<EOL>required=required,<EOL>)<EOL><DEDENT>_certify_printable(<EOL>value=value,<EOL>nonprintable=nonprintable,<EOL>required=required,<EOL>)<EOL>
Certifier for human readable string values.

:param unicode value:
    The string to be certified.
:param int min_length:
    The minimum length of the string.
:param int max_length:
    The maximum acceptable length for the string. By default, the length is not checked.
:param nonprintable:
    Whether the string can contain non-printable characters. Non-printable characters are
    allowed by default.
:param bool required:
    Whether the value can be `None`. Defaults to True.
:raises CertifierTypeError:
    The type is invalid
:raises CertifierValueError:
    The value is invalid