code: def is_valid_nc3_name(s):
      
      if not isinstance(s, str):
          return False
      if not isinstance(s, str):
          s = s.decode('utf-8')
      num_bytes = len(s.encode('utf-8'))
      return ((unicodedata.normalize('NFC', s) == s) and
              (s not in _reserved_names) and
              (num_bytes >= 0) and
              ('/' not in s) and
              (s[-1] != ' ') and
              (_isalnumMUTF8(s[0]) or (s[0] == '_')) and
              all((_isalnumMUTF8(c) or c in _specialchars for c in s)))
docs: Test whether an object can be validly converted to a netCDF-3
      dimension, variable or attribute name
  
      Earlier versions of the netCDF C-library reference implementation
      enforced a more restricted set of characters in creating new names,
      but permitted reading names containing arbitrary bytes. This
      specification extends the permitted characters in names to include
      multi-byte UTF-8 encoded Unicode and additional printing characters
      from the US-ASCII alphabet. The first character of a name must be
      alphanumeric, a multi-byte UTF-8 character, or '_' (reserved for
      special names with meaning to implementations, such as the
      "_FillValue" attribute). Subsequent characters may also include
      printing special characters, except for '/' which is not allowed in
      names. Names that have trailing space characters are also not
      permitted.