code: def valid_string(val):
      
      for char in val:
          try:
              char = ord(char)
          except TypeError:
              raise NotValid("string")
          if char == 0x09 or char == 0x0A or char == 0x0D:
              continue
          elif 0x20 <= char <= 0xD7FF:
              continue
          elif 0xE000 <= char <= 0xFFFD:
              continue
          elif 0x10000 <= char <= 0x10FFFF:
              continue
          else:
              raise NotValid("string")
      return True
docs: Expects unicode
      Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] |
                      [#x10000-#x10FFFF]