BTW: this might be a case where Ubuntu works and Mac doesn't.  Python 2.x comes in two flavors: narrow and wide.  Narrow uses UTF-16 internally, and will have problems with non-BMP characters.  Wide uses UTF-32 internally and has no trouble with these characters.  My Mac has a narrow build, my Ubuntu has a wide.

You can tell the difference by examining sys.maxunicode.  65535 means narrow, 1114111 means wide.