UTF-8 tests passing.
diff --git a/tinyxml2.h b/tinyxml2.h
index 4792b09..a1f7603 100644
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -371,6 +371,12 @@
 	inline static int IsUTF8Continuation( unsigned char p ) { return p & 0x80; }

 	inline static int IsAlphaNum( unsigned char anyByte )	{ return ( anyByte < 128 ) ? isalnum( anyByte ) : 1; }

 	inline static int IsAlpha( unsigned char anyByte )		{ return ( anyByte < 128 ) ? isalpha( anyByte ) : 1; }

+

+	static const char* ReadBOM( const char* p, bool* hasBOM );

+	// p is the starting location,

+	// the UTF-8 value of the entity will be placed in value, and length filled in.

+	static const char* GetCharacterRef( const char* p, char* value, int* length );
+	static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
 };

 

 

@@ -567,9 +573,21 @@
 

 

 enum {

-	ATTRIBUTE_SUCCESS,

+	XML_NO_ERROR = 0,

+

 	NO_ATTRIBUTE,

-	WRONG_ATTRIBUTE_TYPE

+	WRONG_ATTRIBUTE_TYPE,

+

+	ERROR_FILE_NOT_FOUND,

+	ERROR_ELEMENT_MISMATCH,

+	ERROR_PARSING_ELEMENT,

+	ERROR_PARSING_ATTRIBUTE,

+	ERROR_IDENTIFYING_TAG,

+	ERROR_PARSING_TEXT,

+	ERROR_PARSING_CDATA,

+	ERROR_PARSING_COMMENT,

+	ERROR_PARSING_DECLARATION,

+	ERROR_PARSING_UNKNOWN

 };

 

 

@@ -691,9 +709,11 @@
 	virtual const XMLDocument* ToDocument() const	{ return this; }

 

 	int Parse( const char* xml );

-	int Load( const char* filename );

-	int Load( FILE* );

-	void Save( const char* filename );

+	int LoadFile( const char* filename );

+	int LoadFile( FILE* );

+	void SaveFile( const char* filename );

+

+	bool HasBOM() const { return writeBOM; }

 

 	void Print( XMLStreamer* streamer=0 );

 	virtual bool Accept( XMLVisitor* visitor ) const;

@@ -716,24 +736,10 @@
 	*/

 	void DeleteNode( XMLNode* node )	{ node->parent->DeleteChild( node ); }

 

-	enum {

-		NO_ERROR = 0,

-		ERROR_FILE_NOT_FOUND,

-		ERROR_ELEMENT_MISMATCH,

-		ERROR_PARSING_ELEMENT,

-		ERROR_PARSING_ATTRIBUTE,

-		ERROR_IDENTIFYING_TAG,

-		ERROR_PARSING_TEXT,

-		ERROR_PARSING_CDATA,

-		ERROR_PARSING_COMMENT,

-		ERROR_PARSING_DECLARATION,

-		ERROR_PARSING_UNKNOWN

-

-	};

 	void SetError( int error, const char* str1, const char* str2 );

 	

-	bool Error() const { return errorID != NO_ERROR; }

-	int GetErrorID() const { return errorID; }

+	bool Error() const { return errorID != XML_NO_ERROR; }

+	int  ErrorID() const { return errorID; }

 	const char* GetErrorStr1() const { return errorStr1; }

 	const char* GetErrorStr2() const { return errorStr2; }

 	void PrintError() const;

@@ -745,6 +751,7 @@
 	void operator=( const XMLDocument& );	// not supported

 	void InitDocument();

 

+	bool writeBOM;

 	int errorID;

 	const char* errorStr1;

 	const char* errorStr2;

@@ -763,6 +770,7 @@
 	XMLStreamer( FILE* file=0 );

 	~XMLStreamer()	{}

 

+	void PushHeader( bool writeBOM, bool writeDeclaration );

 	void OpenElement( const char* name );

 	void PushAttribute( const char* name, const char* value );

 	void CloseElement();

@@ -772,7 +780,7 @@
 	void PushDeclaration( const char* value );

 	void PushUnknown( const char* value );

 

-	virtual bool VisitEnter( const XMLDocument& /*doc*/ )			{ return true; }

+	virtual bool VisitEnter( const XMLDocument& /*doc*/ );

 	virtual bool VisitExit( const XMLDocument& /*doc*/ )			{ return true; }

 

 	virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute );