Fixed a very subtle bug in the handling of zero-width columns, related to the fact that a column's index in the list of columns described by the FITS header is different from its index in the recarray holding the table's data (which excludes any zero-width columns).  This was actually 'revealed' by making encode_ascii and decode_ascii a little less careless in how it passes through non-string arrays.
Very rough initial prototype of a Numpy array class that stores string arrays as Python 2 str/Python 3 bytes arrays but automatically decodes/encodes to a specified encoding at the user boundary (such as __getitem__ and __setitem__)
Strip trainling whitespace from strings in the array, for compatibility with Numpy's chararray (this is generally pretty useful anyways)
First attempt at substituting use of encoded_text_array for string arrays
Move encoding 'normalization' to a function; fix a couple issues with Python 2.5 (which doesn't support the str.format method)
Just use np.chararray and np.char.* methods directly; a little less confusing than "import np.char as chararray"
Properly support comparison functions in encoded_text_string, as well as a custom 'encode' method that can return a new array with a new encoding applied (this requires first decoding to unicode then re-encoding the whole array; this is very memory-inefficient but is an uncommon-enough operation that we can let that go for now.  It's also worth noting that when encoding to a mixed-width encoding it's necessary to scan through the entire array to determine the highest codepoint.  This can either done in one pass while copying, but could also hypothetically be done without an extra copy of the full array by making two decode passes...