@@ -50,37 +50,66 @@ private static Encoding JIS0208Encoding
5050 _ => UndefinedCodeBytes
5151 } ;
5252
53- public static Encoding GetEncoding ( CharacterCode code ) => code switch
53+ public static Encoding GetEncoding ( CharacterCode code , ByteOrder order ) => code switch
5454 {
5555 CharacterCode . ASCII => Encoding . ASCII ,
5656 CharacterCode . JIS => JIS0208Encoding ,
57- CharacterCode . Unicode => Encoding . Unicode ,
57+ CharacterCode . Unicode => order is ByteOrder . BigEndian ? Encoding . BigEndianUnicode : Encoding . Unicode ,
5858 CharacterCode . Undefined => Encoding . UTF8 ,
5959 _ => Encoding . UTF8
6060 } ;
6161
62- public static bool TryParse ( ReadOnlySpan < byte > buffer , out EncodedString encodedString )
62+ public static bool TryParse ( ReadOnlySpan < byte > buffer , ByteOrder order , out EncodedString encodedString )
6363 {
6464 if ( TryDetect ( buffer , out CharacterCode code ) )
6565 {
66- string text = GetEncoding ( code ) . GetString ( buffer [ CharacterCodeBytesLength ..] ) ;
67- encodedString = new EncodedString ( code , text ) ;
68- return true ;
66+ ReadOnlySpan < byte > textBuffer = buffer [ CharacterCodeBytesLength ..] ;
67+ if ( code == CharacterCode . Unicode && textBuffer . Length >= 2 )
68+ {
69+ // Check BOM
70+ if ( textBuffer [ 0 ] == 0xFF && textBuffer [ 1 ] == 0xFE )
71+ {
72+ // Little-endian BOM
73+ string text = Encoding . Unicode . GetString ( textBuffer [ 2 ..] ) ;
74+ encodedString = new EncodedString ( code , text ) ;
75+ return true ;
76+ }
77+ else if ( textBuffer [ 0 ] == 0xFE && textBuffer [ 1 ] == 0xFF )
78+ {
79+ // Big-endian BOM
80+ string text = Encoding . BigEndianUnicode . GetString ( textBuffer [ 2 ..] ) ;
81+ encodedString = new EncodedString ( code , text ) ;
82+ return true ;
83+ }
84+ else
85+ {
86+ // No BOM, use EXIF byte order
87+ string text = GetEncoding ( code , order ) . GetString ( textBuffer ) ;
88+ encodedString = new EncodedString ( code , text ) ;
89+ return true ;
90+ }
91+ }
92+ else
93+ {
94+ string text = GetEncoding ( code , order ) . GetString ( textBuffer ) ;
95+ encodedString = new EncodedString ( code , text ) ;
96+ return true ;
97+ }
6998 }
7099
71100 encodedString = default ;
72101 return false ;
73102 }
74103
75104 public static uint GetDataLength ( EncodedString encodedString ) =>
76- ( uint ) GetEncoding ( encodedString . Code ) . GetByteCount ( encodedString . Text ) + CharacterCodeBytesLength ;
105+ ( uint ) GetEncoding ( encodedString . Code , ByteOrder . LittleEndian ) . GetByteCount ( encodedString . Text ) + CharacterCodeBytesLength ;
77106
78107 public static int Write ( EncodedString encodedString , Span < byte > destination )
79108 {
80109 GetCodeBytes ( encodedString . Code ) . CopyTo ( destination ) ;
81110
82111 string text = encodedString . Text ;
83- int count = Write ( GetEncoding ( encodedString . Code ) , text , destination [ CharacterCodeBytesLength ..] ) ;
112+ int count = Write ( GetEncoding ( encodedString . Code , ByteOrder . LittleEndian ) , text , destination [ CharacterCodeBytesLength ..] ) ;
84113
85114 return CharacterCodeBytesLength + count ;
86115 }
0 commit comments