2
0
Эх сурвалжийг харах

Text.Encoding. Initial Import.

Adds support for additional encodings for BRL.UTF8Stream.
Brucey 2 жил өмнө
parent
commit
5a57b28ff6
37 өөрчлөгдсөн 796 нэмэгдсэн , 0 устгасан
  1. 264 0
      encoding.mod/codepage.bmx
  2. 53 0
      encoding.mod/encoding.bmx
  3. 289 0
      encoding.mod/iso.bmx
  4. 114 0
      encoding.mod/tests/test.bmx
  5. 1 0
      encoding.mod/tests/test_data/iso_8859_15_encoded.txt
  6. 1 0
      encoding.mod/tests/test_data/iso_8859_15_utf8.txt
  7. 1 0
      encoding.mod/tests/test_data/iso_8859_1_encoded.txt
  8. 1 0
      encoding.mod/tests/test_data/iso_8859_1_utf8.txt
  9. 1 0
      encoding.mod/tests/test_data/iso_8859_2_encoded.txt
  10. 1 0
      encoding.mod/tests/test_data/iso_8859_2_utf8.txt
  11. 1 0
      encoding.mod/tests/test_data/iso_8859_5_encoded.txt
  12. 1 0
      encoding.mod/tests/test_data/iso_8859_5_utf8.txt
  13. 1 0
      encoding.mod/tests/test_data/iso_8859_6_encoded.txt
  14. 1 0
      encoding.mod/tests/test_data/iso_8859_6_utf8.txt
  15. 1 0
      encoding.mod/tests/test_data/iso_8859_7_encoded.txt
  16. 1 0
      encoding.mod/tests/test_data/iso_8859_7_utf8.txt
  17. 1 0
      encoding.mod/tests/test_data/iso_8859_8_encoded.txt
  18. 1 0
      encoding.mod/tests/test_data/iso_8859_8_utf8.txt
  19. 1 0
      encoding.mod/tests/test_data/iso_8859_9_encoded.txt
  20. 1 0
      encoding.mod/tests/test_data/iso_8859_9_utf8.txt
  21. 1 0
      encoding.mod/tests/test_data/windows_1250_encoded.txt
  22. 1 0
      encoding.mod/tests/test_data/windows_1250_utf8.txt
  23. 1 0
      encoding.mod/tests/test_data/windows_1251_encoded.txt
  24. 1 0
      encoding.mod/tests/test_data/windows_1251_utf8.txt
  25. 1 0
      encoding.mod/tests/test_data/windows_1252_encoded.txt
  26. 1 0
      encoding.mod/tests/test_data/windows_1252_utf8.txt
  27. 1 0
      encoding.mod/tests/test_data/windows_1253_encoded.txt
  28. 1 0
      encoding.mod/tests/test_data/windows_1253_utf8.txt
  29. 1 0
      encoding.mod/tests/test_data/windows_1254_encoded.txt
  30. 1 0
      encoding.mod/tests/test_data/windows_1254_utf8.txt
  31. 1 0
      encoding.mod/tests/test_data/windows_1255_encoded.txt
  32. 1 0
      encoding.mod/tests/test_data/windows_1255_utf8.txt
  33. 1 0
      encoding.mod/tests/test_data/windows_1256_encoded.txt
  34. 1 0
      encoding.mod/tests/test_data/windows_1256_utf8.txt
  35. 1 0
      encoding.mod/tests/test_data/windows_1257_encoded.txt
  36. 1 0
      encoding.mod/tests/test_data/windows_1257_utf8.txt
  37. 44 0
      encoding.mod/tests/test_data_generator.py

+ 264 - 0
encoding.mod/codepage.bmx

@@ -0,0 +1,264 @@
+SuperStrict
+
+Import BRL.UTF8Stream
+
+Type TEncodingStrategyLoaderWindows1250 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1250
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1250EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1250EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+	Method LoadTable(table:Short Ptr)
+		Global encodingTable:Short[]
+		If Not encodingTable Then
+			encodingTable = [..
+				$20AC:Short, $FFFD:Short, $201A:Short, $FFFD:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $FFFD:Short, $2030:Short, $0160:Short, $2039:Short, $015A:Short, $0164:Short, $017D:Short, $0179:Short,..
+				$FFFD:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $FFFD:Short, $2122:Short, $0161:Short, $203A:Short, $015B:Short, $0165:Short, $017E:Short, $017A:Short,..
+				$00A0:Short, $02C7:Short, $02D8:Short, $0141:Short, $00A4:Short, $0104:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $015E:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $017B:Short,..
+				$00B0:Short, $00B1:Short, $02DB:Short, $0142:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00B8:Short, $0105:Short, $015F:Short, $00BB:Short, $013D:Short, $02DD:Short, $013E:Short, $017C:Short,..
+				$0154:Short, $00C1:Short, $00C2:Short, $0102:Short, $00C4:Short, $0139:Short, $0106:Short, $00C7:Short, $010C:Short, $00C9:Short, $0118:Short, $00CB:Short, $011A:Short, $00CD:Short, $00CE:Short, $010E:Short,..
+				$0110:Short, $0143:Short, $0147:Short, $00D3:Short, $00D4:Short, $0150:Short, $00D6:Short, $00D7:Short, $0158:Short, $016E:Short, $00DA:Short, $0170:Short, $00DC:Short, $00DD:Short, $0162:Short, $00DF:Short,..
+				$0155:Short, $00E1:Short, $00E2:Short, $0103:Short, $00E4:Short, $013A:Short, $0107:Short, $00E7:Short, $010D:Short, $00E9:Short, $0119:Short, $00EB:Short, $011B:Short, $00ED:Short, $00EE:Short, $010F:Short,..
+				$0111:Short, $0144:Short, $0148:Short, $00F3:Short, $00F4:Short, $0151:Short, $00F6:Short, $00F7:Short, $0159:Short, $016F:Short, $00FA:Short, $0171:Short, $00FC:Short, $00FD:Short, $0163:Short, $02D9:Short]
+		End If
+
+		For Local i:Int = 0 To 127
+			table[i] = encodingTable[i]
+		Next
+	End Method
+End Type
+
+Type TEncodingStrategyLoaderWindows1251 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1251
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1251EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1251EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0402:Short, $0403:Short, $201A:Short, $0453:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $20AC:Short, $2030:Short, $0409:Short, $2039:Short, $040A:Short, $040C:Short, $040B:Short, $040F:Short,..
+				$0452:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $FFFD:Short, $2122:Short, $0459:Short, $203A:Short, $045A:Short, $045C:Short, $045B:Short, $045F:Short,..
+				$00A0:Short, $040E:Short, $045E:Short, $0408:Short, $00A4:Short, $0490:Short, $00A6:Short, $00A7:Short, $0401:Short, $00A9:Short, $0404:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $0407:Short,..
+				$00B0:Short, $00B1:Short, $0406:Short, $0456:Short, $0491:Short, $00B5:Short, $00B6:Short, $00B7:Short, $0451:Short, $2116:Short, $0454:Short, $00BB:Short, $0458:Short, $0405:Short, $0455:Short, $0457:Short,..
+				$0410:Short, $0411:Short, $0412:Short, $0413:Short, $0414:Short, $0415:Short, $0416:Short, $0417:Short, $0418:Short, $0419:Short, $041A:Short, $041B:Short, $041C:Short, $041D:Short, $041E:Short, $041F:Short,..
+				$0420:Short, $0421:Short, $0422:Short, $0423:Short, $0424:Short, $0425:Short, $0426:Short, $0427:Short, $0428:Short, $0429:Short, $042A:Short, $042B:Short, $042C:Short, $042D:Short, $042E:Short, $042F:Short,..
+				$0430:Short, $0431:Short, $0432:Short, $0433:Short, $0434:Short, $0435:Short, $0436:Short, $0437:Short, $0438:Short, $0439:Short, $043A:Short, $043B:Short, $043C:Short, $043D:Short, $043E:Short, $043F:Short,..
+				$0440:Short, $0441:Short, $0442:Short, $0443:Short, $0444:Short, $0445:Short, $0446:Short, $0447:Short, $0448:Short, $0449:Short, $044A:Short, $044B:Short, $044C:Short, $044D:Short, $044E:Short, $044F:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderWindows1253 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1253
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1253EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1253EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$20AC:Short, $FFFD:Short, $201A:Short, $0192:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $FFFD:Short, $2030:Short, $FFFD:Short, $2039:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$FFFD:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $FFFD:Short, $2122:Short, $FFFD:Short, $203A:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$00A0:Short, $0385:Short, $0386:Short, $00A3:Short, $00A4:Short, $00A5:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $FFFD:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $2015:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $0384:Short, $00B5:Short, $00B6:Short, $00B7:Short, $0388:Short, $0389:Short, $038A:Short, $00BB:Short, $038C:Short, $00BD:Short, $038E:Short, $038F:Short,..
+				$0390:Short, $0391:Short, $0392:Short, $0393:Short, $0394:Short, $0395:Short, $0396:Short, $0397:Short, $0398:Short, $0399:Short, $039A:Short, $039B:Short, $039C:Short, $039D:Short, $039E:Short, $039F:Short,..
+				$03A0:Short, $03A1:Short, $FFFD:Short, $03A3:Short, $03A4:Short, $03A5:Short, $03A6:Short, $03A7:Short, $03A8:Short, $03A9:Short, $03AA:Short, $03AB:Short, $03AC:Short, $03AD:Short, $03AE:Short, $03AF:Short,..
+				$03B0:Short, $03B1:Short, $03B2:Short, $03B3:Short, $03B4:Short, $03B5:Short, $03B6:Short, $03B7:Short, $03B8:Short, $03B9:Short, $03BA:Short, $03BB:Short, $03BC:Short, $03BD:Short, $03BE:Short, $03BF:Short,..
+				$03C0:Short, $03C1:Short, $03C2:Short, $03C3:Short, $03C4:Short, $03C5:Short, $03C6:Short, $03C7:Short, $03C8:Short, $03C9:Short, $03CA:Short, $03CB:Short, $03CC:Short, $03CD:Short, $03CE:Short, $FFFD:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderWindows1254 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1254
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1254EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1254EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$20AC:Short, $FFFD:Short, $201A:Short, $0192:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $02C6:Short, $2030:Short, $0160:Short, $2039:Short, $0152:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$FFFD:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $02DC:Short, $2122:Short, $0161:Short, $203A:Short, $0153:Short, $FFFD:Short, $FFFD:Short, $0178:Short,..
+				$00A0:Short, $00A1:Short, $00A2:Short, $00A3:Short, $00A4:Short, $00A5:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $00AA:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00AF:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00B8:Short, $00B9:Short, $00BA:Short, $00BB:Short, $00BC:Short, $00BD:Short, $00BE:Short, $00BF:Short,..
+				$00C0:Short, $00C1:Short, $00C2:Short, $00C3:Short, $00C4:Short, $00C5:Short, $00C6:Short, $00C7:Short, $00C8:Short, $00C9:Short, $00CA:Short, $00CB:Short, $00CC:Short, $00CD:Short, $00CE:Short, $00CF:Short,..
+				$011E:Short, $00D1:Short, $00D2:Short, $00D3:Short, $00D4:Short, $00D5:Short, $00D6:Short, $00D7:Short, $00D8:Short, $00D9:Short, $00DA:Short, $00DB:Short, $00DC:Short, $0130:Short, $015E:Short, $00DF:Short,..
+				$00E0:Short, $00E1:Short, $00E2:Short, $00E3:Short, $00E4:Short, $00E5:Short, $00E6:Short, $00E7:Short, $00E8:Short, $00E9:Short, $00EA:Short, $00EB:Short, $00EC:Short, $00ED:Short, $00EE:Short, $00EF:Short,..
+				$011F:Short, $00F1:Short, $00F2:Short, $00F3:Short, $00F4:Short, $00F5:Short, $00F6:Short, $00F7:Short, $00F8:Short, $00F9:Short, $00FA:Short, $00FB:Short, $00FC:Short, $0131:Short, $015F:Short, $00FF:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderWindows1255 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1255
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1255EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1255EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$20AC:Short, $FFFD:Short, $201A:Short, $0192:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $02C6:Short, $2030:Short, $FFFD:Short, $2039:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$FFFD:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $02DC:Short, $2122:Short, $FFFD:Short, $203A:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$00A0:Short, $00A1:Short, $00A2:Short, $00A3:Short, $20AA:Short, $00A5:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $00D7:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00AF:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00B8:Short, $00B9:Short, $00F7:Short, $00BB:Short, $00BC:Short, $00BD:Short, $00BE:Short, $00BF:Short,..
+				$05B0:Short, $05B1:Short, $05B2:Short, $05B3:Short, $05B4:Short, $05B5:Short, $05B6:Short, $05B7:Short, $05B8:Short, $05B9:Short, $FFFD:Short, $05BB:Short, $05BC:Short, $05BD:Short, $05BE:Short, $05BF:Short,..
+				$05C0:Short, $05C1:Short, $05C2:Short, $05C3:Short, $05F0:Short, $05F1:Short, $05F2:Short, $05F3:Short, $05F4:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$05D0:Short, $05D1:Short, $05D2:Short, $05D3:Short, $05D4:Short, $05D5:Short, $05D6:Short, $05D7:Short, $05D8:Short, $05D9:Short, $05DA:Short, $05DB:Short, $05DC:Short, $05DD:Short, $05DE:Short, $05DF:Short,..
+				$05E0:Short, $05E1:Short, $05E2:Short, $05E3:Short, $05E4:Short, $05E5:Short, $05E6:Short, $05E7:Short, $05E8:Short, $05E9:Short, $05EA:Short, $FFFD:Short, $FFFD:Short, $200E:Short, $200F:Short, $FFFD:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderWindows1256 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1256
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1256EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1256EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$20AC:Short, $067E:Short, $201A:Short, $0192:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $02C6:Short, $2030:Short, $0679:Short, $2039:Short, $0152:Short, $0686:Short, $0698:Short, $0688:Short,..
+				$06AF:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $06A9:Short, $2122:Short, $0691:Short, $203A:Short, $0153:Short, $200C:Short, $200D:Short, $06BA:Short,..
+				$00A0:Short, $060C:Short, $00A2:Short, $00A3:Short, $00A4:Short, $00A5:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $06BE:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00AF:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00B8:Short, $00B9:Short, $061B:Short, $00BB:Short, $00BC:Short, $00BD:Short, $00BE:Short, $061F:Short,..
+				$06C1:Short, $0621:Short, $0622:Short, $0623:Short, $0624:Short, $0625:Short, $0626:Short, $0627:Short, $0628:Short, $0629:Short, $062A:Short, $062B:Short, $062C:Short, $062D:Short, $062E:Short, $062F:Short,..
+				$0630:Short, $0631:Short, $0632:Short, $0633:Short, $0634:Short, $0635:Short, $0636:Short, $00D7:Short, $0637:Short, $0638:Short, $0639:Short, $063A:Short, $0640:Short, $0641:Short, $0642:Short, $0643:Short,..
+				$00E0:Short, $0644:Short, $00E2:Short, $0645:Short, $0646:Short, $0647:Short, $0648:Short, $00E7:Short, $00E8:Short, $00E9:Short, $00EA:Short, $00EB:Short, $0649:Short, $064A:Short, $00EE:Short, $00EF:Short,..
+				$064B:Short, $064C:Short, $064D:Short, $064E:Short, $00F4:Short, $064F:Short, $0650:Short, $00F7:Short, $0651:Short, $00F9:Short, $0652:Short, $00FB:Short, $00FC:Short, $200E:Short, $200F:Short, $06D2:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderWindows1257 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.WINDOWS_1257
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TWindows1257EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TWindows1257EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$20AC:Short, $FFFD:Short, $201A:Short, $FFFD:Short, $201E:Short, $2026:Short, $2020:Short, $2021:Short, $FFFD:Short, $2030:Short, $FFFD:Short, $2039:Short, $FFFD:Short, $00A8:Short, $02C7:Short, $00B8:Short,..
+				$FFFD:Short, $2018:Short, $2019:Short, $201C:Short, $201D:Short, $2022:Short, $2013:Short, $2014:Short, $FFFD:Short, $2122:Short, $FFFD:Short, $203A:Short, $FFFD:Short, $00AF:Short, $02DB:Short, $FFFD:Short,..
+				$00A0:Short, $FFFD:Short, $00A2:Short, $00A3:Short, $00A4:Short, $FFFD:Short, $00A6:Short, $00A7:Short, $00D8:Short, $00A9:Short, $0156:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00C6:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00F8:Short, $00B9:Short, $0157:Short, $00BB:Short, $00BC:Short, $00BD:Short, $00BE:Short, $00E6:Short,..
+				$0104:Short, $012E:Short, $0100:Short, $0106:Short, $00C4:Short, $00C5:Short, $0118:Short, $0112:Short, $010C:Short, $00C9:Short, $0179:Short, $0116:Short, $0122:Short, $0136:Short, $012A:Short, $013B:Short,..
+				$0160:Short, $0143:Short, $0145:Short, $00D3:Short, $014C:Short, $00D5:Short, $00D6:Short, $00D7:Short, $0172:Short, $0141:Short, $015A:Short, $016A:Short, $00DC:Short, $017B:Short, $017D:Short, $00DF:Short,..
+				$0105:Short, $012F:Short, $0101:Short, $0107:Short, $00E4:Short, $00E5:Short, $0119:Short, $0113:Short, $010D:Short, $00E9:Short, $017A:Short, $0117:Short, $0123:Short, $0137:Short, $012B:Short, $013C:Short,..
+				$0161:Short, $0144:Short, $0146:Short, $00F3:Short, $014D:Short, $00F5:Short, $00F6:Short, $00F7:Short, $0173:Short, $0142:Short, $015B:Short, $016B:Short, $00FC:Short, $017C:Short, $017E:Short, $02D9:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+New TEncodingStrategyLoaderWindows1250
+New TEncodingStrategyLoaderWindows1251
+New TEncodingStrategyLoaderWindows1253
+New TEncodingStrategyLoaderWindows1254
+New TEncodingStrategyLoaderWindows1255
+New TEncodingStrategyLoaderWindows1256
+New TEncodingStrategyLoaderWindows1257
+

+ 53 - 0
encoding.mod/encoding.bmx

@@ -0,0 +1,53 @@
+' Copyright (c) 2023 Bruce A Henderson
+'
+' This software is provided 'as-is', without any express or implied
+' warranty. In no event will the authors be held liable for any damages
+' arising from the use of this software.
+' 
+' Permission is granted to anyone to use this software for any purpose,
+' including commercial applications, and to alter it and redistribute it
+' freely, subject to the following restrictions:
+' 
+'    1. The origin of this software must not be misrepresented; you must not
+'    claim that you wrote the original software. If you use this software
+'    in a product, an acknowledgment in the product documentation would be
+'    appreciated but is not required.
+' 
+'    2. Altered source versions must be plainly marked as such, and must not be
+'    misrepresented as being the original software.
+' 
+'    3. This notice may not be removed or altered from any source
+'    distribution.
+' 
+SuperStrict
+
+Rem
+bbdoc: Additional encodings support for BRL.UTF8Stream
+about: This adds support for the following encodings :
+  - ISO-8859-2
+  - ISO-8859-5
+  - ISO-8859-6
+  - ISO-8859-7
+  - ISO-8859-8
+  - ISO-8859-9
+  - ISO-8859-15
+  - Windows-1250
+  - Windows-1251
+  - Windows-1253
+  - Windows-1254
+  - Windows-1255
+  - Windows-1256
+  - Windows-1257
+End Rem
+Module Text.Encoding
+
+ModuleInfo "Version: 1.00"
+ModuleInfo "Author: Bruce A Henderson"
+ModuleInfo "License: zlib"
+ModuleInfo "Copyright: 2023 Bruce A Henderson"
+
+ModuleInfo "History: 1.00"
+ModuleInfo "History: Initial Release"
+
+Import "codepage.bmx"
+Import "iso.bmx"

+ 289 - 0
encoding.mod/iso.bmx

@@ -0,0 +1,289 @@
+' Copyright (c) 2023 Bruce A Henderson
+'
+' This software is provided 'as-is', without any express or implied
+' warranty. In no event will the authors be held liable for any damages
+' arising from the use of this software.
+' 
+' Permission is granted to anyone to use this software for any purpose,
+' including commercial applications, and to alter it and redistribute it
+' freely, subject to the following restrictions:
+' 
+'    1. The origin of this software must not be misrepresented; you must not
+'    claim that you wrote the original software. If you use this software
+'    in a product, an acknowledgment in the product documentation would be
+'    appreciated but is not required.
+' 
+'    2. Altered source versions must be plainly marked as such, and must not be
+'    misrepresented as being the original software.
+' 
+'    3. This notice may not be removed or altered from any source
+'    distribution.
+' 
+SuperStrict
+
+Import BRL.UTF8Stream
+
+
+Type TEncodingStrategyLoaderISO_8859_2 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_2
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_2_EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TISO_8859_2_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $0104:Short, $02D8:Short, $0141:Short, $00A4:Short, $013D:Short, $015A:Short, $00A7:Short, $00A8:Short, $0160:Short, $015E:Short, $0164:Short, $0179:Short, $00AD:Short, $017D:Short, $017B:Short,..
+				$00B0:Short, $0105:Short, $02DB:Short, $0142:Short, $00B4:Short, $013E:Short, $015B:Short, $02C7:Short, $00B8:Short, $0161:Short, $015F:Short, $0165:Short, $017A:Short, $02DD:Short, $017E:Short, $017C:Short,..
+				$0154:Short, $00C1:Short, $00C2:Short, $0102:Short, $00C4:Short, $0139:Short, $0106:Short, $00C7:Short, $010C:Short, $00C9:Short, $0118:Short, $00CB:Short, $011A:Short, $00CD:Short, $00CE:Short, $010E:Short,..
+				$0110:Short, $0143:Short, $0147:Short, $00D3:Short, $00D4:Short, $0150:Short, $00D6:Short, $00D7:Short, $0158:Short, $016E:Short, $00DA:Short, $0170:Short, $00DC:Short, $00DD:Short, $0162:Short, $00DF:Short,..
+				$0155:Short, $00E1:Short, $00E2:Short, $0103:Short, $00E4:Short, $013A:Short, $0107:Short, $00E7:Short, $010D:Short, $00E9:Short, $0119:Short, $00EB:Short, $011B:Short, $00ED:Short, $00EE:Short, $010F:Short,..
+				$0111:Short, $0144:Short, $0148:Short, $00F3:Short, $00F4:Short, $0151:Short, $00F6:Short, $00F7:Short, $0159:Short, $016F:Short, $00FA:Short, $0171:Short, $00FC:Short, $00FD:Short, $0163:Short, $02D9:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+
+Type TEncodingStrategyLoaderISO_8859_5 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_5
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_5_EncodingStrategy(stream)
+	End Method
+End Type
+
+
+Type TISO_8859_5_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $0401:Short, $0402:Short, $0403:Short, $0404:Short, $0405:Short, $0406:Short, $0407:Short, $0408:Short, $0409:Short, $040A:Short, $040B:Short, $040C:Short, $00AD:Short, $040E:Short, $040F:Short,..
+				$0410:Short, $0411:Short, $0412:Short, $0413:Short, $0414:Short, $0415:Short, $0416:Short, $0417:Short, $0418:Short, $0419:Short, $041A:Short, $041B:Short, $041C:Short, $041D:Short, $041E:Short, $041F:Short,..
+				$0420:Short, $0421:Short, $0422:Short, $0423:Short, $0424:Short, $0425:Short, $0426:Short, $0427:Short, $0428:Short, $0429:Short, $042A:Short, $042B:Short, $042C:Short, $042D:Short, $042E:Short, $042F:Short,..
+				$0430:Short, $0431:Short, $0432:Short, $0433:Short, $0434:Short, $0435:Short, $0436:Short, $0437:Short, $0438:Short, $0439:Short, $043A:Short, $043B:Short, $043C:Short, $043D:Short, $043E:Short, $043F:Short,..
+				$0440:Short, $0441:Short, $0442:Short, $0443:Short, $0444:Short, $0445:Short, $0446:Short, $0447:Short, $0448:Short, $0449:Short, $044A:Short, $044B:Short, $044C:Short, $044D:Short, $044E:Short, $044F:Short,..
+				$2116:Short, $0451:Short, $0452:Short, $0453:Short, $0454:Short, $0455:Short, $0456:Short, $0457:Short, $0458:Short, $0459:Short, $045A:Short, $045B:Short, $045C:Short, $00A7:Short, $045E:Short, $045F:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderISO_8859_6 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_6
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_6_EncodingStrategy(stream)
+	End Method
+End Type
+
+
+Type TISO_8859_6_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $00A4:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $060C:Short, $00AD:Short, $FFFD:Short, $FFFD:Short,..
+				$FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $061B:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $061F:Short,..
+				$FFFD:Short, $0621:Short, $0622:Short, $0623:Short, $0624:Short, $0625:Short, $0626:Short, $0627:Short, $0628:Short, $0629:Short, $062A:Short, $062B:Short, $062C:Short, $062D:Short, $062E:Short, $062F:Short,..
+				$0630:Short, $0631:Short, $0632:Short, $0633:Short, $0634:Short, $0635:Short, $0636:Short, $0637:Short, $0638:Short, $0639:Short, $063A:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$0640:Short, $0641:Short, $0642:Short, $0643:Short, $0644:Short, $0645:Short, $0646:Short, $0647:Short, $0648:Short, $0649:Short, $064A:Short, $064B:Short, $064C:Short, $064D:Short, $064E:Short, $064F:Short,..
+				$0650:Short, $0651:Short, $0652:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderISO_8859_7 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_7
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_7_EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TISO_8859_7_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $2018:Short, $2019:Short, $00A3:Short, $20AC:Short, $20AF:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $037A:Short, $00AB:Short, $00AC:Short, $00AD:Short, $FFFD:Short, $2015:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $0384:Short, $0385:Short, $0386:Short, $00B7:Short, $0388:Short, $0389:Short, $038A:Short, $00BB:Short, $038C:Short, $00BD:Short, $038E:Short, $038F:Short,..
+				$0390:Short, $0391:Short, $0392:Short, $0393:Short, $0394:Short, $0395:Short, $0396:Short, $0397:Short, $0398:Short, $0399:Short, $039A:Short, $039B:Short, $039C:Short, $039D:Short, $039E:Short, $039F:Short,..
+				$03A0:Short, $03A1:Short, $FFFD:Short, $03A3:Short, $03A4:Short, $03A5:Short, $03A6:Short, $03A7:Short, $03A8:Short, $03A9:Short, $03AA:Short, $03AB:Short, $03AC:Short, $03AD:Short, $03AE:Short, $03AF:Short,..
+				$03B0:Short, $03B1:Short, $03B2:Short, $03B3:Short, $03B4:Short, $03B5:Short, $03B6:Short, $03B7:Short, $03B8:Short, $03B9:Short, $03BA:Short, $03BB:Short, $03BC:Short, $03BD:Short, $03BE:Short, $03BF:Short,..
+				$03C0:Short, $03C1:Short, $03C2:Short, $03C3:Short, $03C4:Short, $03C5:Short, $03C6:Short, $03C7:Short, $03C8:Short, $03C9:Short, $03CA:Short, $03CB:Short, $03CC:Short, $03CD:Short, $03CE:Short, $FFFD:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderISO_8859_8 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_8
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_8_EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TISO_8859_8_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $FFFD:Short, $00A2:Short, $00A3:Short, $00A4:Short, $00A5:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $00D7:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00AF:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00B8:Short, $00B9:Short, $00F7:Short, $00BB:Short, $00BC:Short, $00BD:Short, $00BE:Short, $FFFD:Short,..
+				$FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short,..
+				$FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $FFFD:Short, $2017:Short,..
+				$05D0:Short, $05D1:Short, $05D2:Short, $05D3:Short, $05D4:Short, $05D5:Short, $05D6:Short, $05D7:Short, $05D8:Short, $05D9:Short, $05DA:Short, $05DB:Short, $05DC:Short, $05DD:Short, $05DE:Short, $05DF:Short,..
+				$05E0:Short, $05E1:Short, $05E2:Short, $05E3:Short, $05E4:Short, $05E5:Short, $05E6:Short, $05E7:Short, $05E8:Short, $05E9:Short, $05EA:Short, $FFFD:Short, $FFFD:Short, $200E:Short, $200F:Short, $FFFD:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderISO_8859_9 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_9
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_9_EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TISO_8859_9_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $00A1:Short, $00A2:Short, $00A3:Short, $00A4:Short, $00A5:Short, $00A6:Short, $00A7:Short, $00A8:Short, $00A9:Short, $00AA:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00AF:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $00B4:Short, $00B5:Short, $00B6:Short, $00B7:Short, $00B8:Short, $00B9:Short, $00BA:Short, $00BB:Short, $00BC:Short, $00BD:Short, $00BE:Short, $00BF:Short,..
+				$00C0:Short, $00C1:Short, $00C2:Short, $00C3:Short, $00C4:Short, $00C5:Short, $00C6:Short, $00C7:Short, $00C8:Short, $00C9:Short, $00CA:Short, $00CB:Short, $00CC:Short, $00CD:Short, $00CE:Short, $00CF:Short,..
+				$011E:Short, $00D1:Short, $00D2:Short, $00D3:Short, $00D4:Short, $00D5:Short, $00D6:Short, $00D7:Short, $00D8:Short, $00D9:Short, $00DA:Short, $00DB:Short, $00DC:Short, $0130:Short, $015E:Short, $00DF:Short,..
+				$00E0:Short, $00E1:Short, $00E2:Short, $00E3:Short, $00E4:Short, $00E5:Short, $00E6:Short, $00E7:Short, $00E8:Short, $00E9:Short, $00EA:Short, $00EB:Short, $00EC:Short, $00ED:Short, $00EE:Short, $00EF:Short,..
+				$011F:Short, $00F1:Short, $00F2:Short, $00F3:Short, $00F4:Short, $00F5:Short, $00F6:Short, $00F7:Short, $00F8:Short, $00F9:Short, $00FA:Short, $00FB:Short, $00FC:Short, $0131:Short, $015F:Short, $00FF:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+Type TEncodingStrategyLoaderISO_8859_15 Extends TEncodingStrategyLoader
+	Method Encoding:EStreamEncoding()
+		Return EStreamEncoding.ISO_8859_15
+	End Method
+
+	Method Load:IEncodingStrategy(stream:TStream)
+		Return New TISO_8859_15_EncodingStrategy(stream)
+	End Method
+End Type
+
+Type TISO_8859_15_EncodingStrategy Extends TBaseSingleByteEncodingStrategy
+    Method New(sourceStream:TStream)
+        stream = sourceStream
+        LoadMapping()
+    End Method
+
+    Method LoadTable(table:Short Ptr)
+        Global encodingTable:Short[]
+        If Not encodingTable Then
+            encodingTable = [..
+				$0080:Short, $0081:Short, $0082:Short, $0083:Short, $0084:Short, $0085:Short, $0086:Short, $0087:Short, $0088:Short, $0089:Short, $008A:Short, $008B:Short, $008C:Short, $008D:Short, $008E:Short, $008F:Short,..
+				$0090:Short, $0091:Short, $0092:Short, $0093:Short, $0094:Short, $0095:Short, $0096:Short, $0097:Short, $0098:Short, $0099:Short, $009A:Short, $009B:Short, $009C:Short, $009D:Short, $009E:Short, $009F:Short,..
+				$00A0:Short, $00A1:Short, $00A2:Short, $00A3:Short, $20AC:Short, $00A5:Short, $0160:Short, $00A7:Short, $0161:Short, $00A9:Short, $00AA:Short, $00AB:Short, $00AC:Short, $00AD:Short, $00AE:Short, $00AF:Short,..
+				$00B0:Short, $00B1:Short, $00B2:Short, $00B3:Short, $017D:Short, $00B5:Short, $00B6:Short, $00B7:Short, $017E:Short, $00B9:Short, $00BA:Short, $00BB:Short, $0152:Short, $0153:Short, $0178:Short, $00BF:Short,..
+				$00C0:Short, $00C1:Short, $00C2:Short, $00C3:Short, $00C4:Short, $00C5:Short, $00C6:Short, $00C7:Short, $00C8:Short, $00C9:Short, $00CA:Short, $00CB:Short, $00CC:Short, $00CD:Short, $00CE:Short, $00CF:Short,..
+				$00D0:Short, $00D1:Short, $00D2:Short, $00D3:Short, $00D4:Short, $00D5:Short, $00D6:Short, $00D7:Short, $00D8:Short, $00D9:Short, $00DA:Short, $00DB:Short, $00DC:Short, $00DD:Short, $00DE:Short, $00DF:Short,..
+				$00E0:Short, $00E1:Short, $00E2:Short, $00E3:Short, $00E4:Short, $00E5:Short, $00E6:Short, $00E7:Short, $00E8:Short, $00E9:Short, $00EA:Short, $00EB:Short, $00EC:Short, $00ED:Short, $00EE:Short, $00EF:Short,..
+				$00F0:Short, $00F1:Short, $00F2:Short, $00F3:Short, $00F4:Short, $00F5:Short, $00F6:Short, $00F7:Short, $00F8:Short, $00F9:Short, $00FA:Short, $00FB:Short, $00FC:Short, $00FD:Short, $00FE:Short, $00FF:Short]
+        End If
+
+        For Local i:Int = 0 To 127
+            table[i] = encodingTable[i]
+        Next
+    End Method
+End Type
+
+
+New TEncodingStrategyLoaderISO_8859_2
+New TEncodingStrategyLoaderISO_8859_5
+New TEncodingStrategyLoaderISO_8859_6
+New TEncodingStrategyLoaderISO_8859_7
+New TEncodingStrategyLoaderISO_8859_8
+New TEncodingStrategyLoaderISO_8859_9
+New TEncodingStrategyLoaderISO_8859_15

+ 114 - 0
encoding.mod/tests/test.bmx

@@ -0,0 +1,114 @@
+SuperStrict
+
+Framework brl.standardio
+Import Text.Encoding
+Import BRL.MaxUnit
+
+New TTestSuite.run()
+
+Type TISOStrategyTest Extends TTest
+
+
+	Method CompareStreams(encoding:EStreamEncoding)
+
+		Local encodedStream:TStream = ReadStream("test_data/" + encoding.ToString().ToLower() +"_encoded.txt")
+		Local utf8Sstream:TStream = ReadStream("test_data/" + encoding.ToString().ToLower() + "_utf8.txt")
+	
+		If Not encodedStream Or Not utf8Sstream Then
+			Fail("Error: Unable to open the input or expected files.")
+		End If
+	
+		Local encodingStream:TEncodingToUTF8Stream = New TEncodingToUTF8Stream(encodedStream, encoding)
+		Local buf:Byte[128]
+	
+		Local totalBytesRead:Long
+		Local expectedByte:Byte
+		Local success:Int = True
+	
+		Local bytesRead:Long = encodingStream.Read(buf, 128)
+
+		While bytesRead > 0
+			For Local i:Int = 0 Until bytesRead
+				utf8Sstream.ReadBytes(varptr expectedByte, 1)
+				If buf[i] <> expectedByte Then
+					Print "Mismatch at position " + (totalBytesRead + i) + ": Expected " + expectedByte + " but got " + buf[i]
+					success = False
+				End If
+			Next
+	
+			totalBytesRead :+ bytesRead
+
+			bytesRead = encodingStream.Read(buf, 128)
+		Wend
+	
+		encodingStream.Close()
+		utf8Sstream.Close()
+
+		AssertTrue(success)
+	End Method
+
+	Method testISO_8859_1() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_1)
+	End Method
+
+	Method testISO_8859_2() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_2)
+	End Method
+
+	Method testISO_8859_5() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_5)
+	End Method
+
+	Method testISO_8859_6() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_6)
+	End Method
+
+	Method testISO_8859_7() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_7)
+	End Method
+
+	Method testISO_8859_8() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_8)
+	End Method
+
+	Method testISO_8859_9() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_9)
+	End Method
+
+	Method testISO_8859_15() { test }
+		CompareStreams(EStreamEncoding.ISO_8859_15)
+	End Method
+
+	Method testWindows_1250() { test }
+		CompareStreams(EStreamEncoding.CP1250)
+	End Method
+
+	Method testWindows_1251() { test }
+		CompareStreams(EStreamEncoding.CP1251)
+	End Method
+
+	Method testWindows_1252() { test }
+		CompareStreams(EStreamEncoding.CP1252)
+	End Method
+
+	Method testWindows_1253() { test }
+		CompareStreams(EStreamEncoding.CP1253)
+	End Method
+
+	Method testWindows_1254() { test }
+		CompareStreams(EStreamEncoding.CP1254)
+	End Method
+
+	Method testWindows_1255() { test }
+		CompareStreams(EStreamEncoding.CP1255)
+	End Method
+
+	Method testWindows_1256() { test }
+		CompareStreams(EStreamEncoding.CP1256)
+	End Method
+
+	Method testWindows_1257() { test }
+		CompareStreams(EStreamEncoding.CP1257)
+	End Method
+
+End Type

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_15_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆���辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬����

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_15_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_1_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆���辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬����

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_1_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_2_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆���辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬����

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_2_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_5_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�����������������﹜ㄓ它夾帚型陋秣捲陷絮溢劃遞蝨螃謝藥齪ヌ圴佮迓玿旂衲欶趹欹詘棰葮摵蜠樉賥濋錎膼瀔嚦黀蘜蠲╭帉爎�

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_5_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_6_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€≠ヤ�㊧炎旧克署葬灯楓利劒屆撼泛、ャュサソチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレ珮粤蒟跚韜��ⅰ��

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_6_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¤،­؛؟ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوىيًٌٍَُِّْ

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_7_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�걗깂뀊뇠뎷땶뜋룓몤뱮븭뿕솞썫씆윝、$ⅵ㎤øガ�갚껙뉘떱많본섹씩읒쩠컵판훔墾勁卦今戇倆厘描白繃嗇飡宸臆預隅膺狀穽增彩充坂沆樺詰

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_7_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§¨©ͺ«¬­―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_8_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������■ぅΗ┤���葦桶患況弦沙悉醤珀矣粤肄蓍裨跋鈿韵鴦���燾�

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_8_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾‗אבגדהוזחטיךכלםמןנסעףפץצקרשת‎‏

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_9_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆���辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬����

+ 1 - 0
encoding.mod/tests/test_data/iso_8859_9_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ

+ 1 - 0
encoding.mod/tests/test_data/windows_1250_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€d�㊨葛訣誌葬灯楓吏圀悃棔�。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚珮粤蒟跚韜��ⅰ�����涇���

+ 1 - 0
encoding.mod/tests/test_data/windows_1250_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚„…†‡‰Š‹ŚŤŽŹ‘’“”•–—™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙

+ 1 - 0
encoding.mod/tests/test_data/windows_1251_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������、�ウЖ��⑭�渦慨偽係杭纂従神疎団兎波品北洋椀冫嘖孛忤掣桀毳烙痰邃繙艾蜉謖邇關髓齡��巐鄕��

+ 1 - 0
encoding.mod/tests/test_data/windows_1251_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя

+ 1 - 0
encoding.mod/tests/test_data/windows_1252_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������、�ウЖ��⑭�渦慨偽係杭纂従神疎団兎波品北洋椀冫嘖孛忤掣桀毳烙痰邃繙艾蜉謖邇關髓齡��巐鄕��

+ 1 - 0
encoding.mod/tests/test_data/windows_1252_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

+ 1 - 0
encoding.mod/tests/test_data/windows_1253_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�������������������、�ウЖ���葦桶患況弦沙悉梢請唾津毒班碧麺力佰嘖孛忤掣桀毳烙痰邃繙艾蜉謖邇關髓齡��巐鄕�

+ 1 - 0
encoding.mod/tests/test_data/windows_1253_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡‰‹‘’“”•–—™› ΅Ά£¤¥¦§¨©«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ

+ 1 - 0
encoding.mod/tests/test_data/windows_1254_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������、�ウЖ��⑭�渦慨偽係杭纂従神疎団兎波品北洋椀冫嘖孛忤掣桀毳烙痰邃繙艾蜉謖邇關髓齡��巐鄕��

+ 1 - 0
encoding.mod/tests/test_data/windows_1254_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ

+ 1 - 0
encoding.mod/tests/test_data/windows_1255_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€們剠唶垑嫅挀敃枟槞洜、¥ウЖ┆���辈炒刀犯购患骄坷谅媚牌侨伤掏蜗醒矣哉肿剜徕沅彐玷殛腱眍镳耱篝貊鼬��

+ 1 - 0
encoding.mod/tests/test_data/windows_1255_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰‹‘’“”•–—˜™› ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֻּֽ־ֿ׀ׁׂ׃װױײ׳״אבגדהוזחטיךכלםמןנסעףפץצקרשת‎‏

+ 1 - 0
encoding.mod/tests/test_data/windows_1256_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆���辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬����

+ 1 - 0
encoding.mod/tests/test_data/windows_1256_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے

+ 1 - 0
encoding.mod/tests/test_data/windows_1257_encoded.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�����������������������■うЖ��⑭�渦慨偽係杭纂従神疎団兎波品北洋椀冫嘖孛忤掣桀毳烙痰邃繙艾蜉謖邇關髓齡��巐鄕��

+ 1 - 0
encoding.mod/tests/test_data/windows_1257_utf8.txt

@@ -0,0 +1 @@
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚„…†‡‰‹¨ˇ¸‘’“”•–—™›¯˛ ¢£¤¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙

+ 44 - 0
encoding.mod/tests/test_data_generator.py

@@ -0,0 +1,44 @@
+import codecs
+import os
+import re
+
+def generate_test_files(encoding, output_dir):
+
+    if re.match(r'^cp\d+', encoding):
+        prefix = re.sub(r'^cp', 'windows_', encoding)
+    else:
+        prefix = encoding
+
+    encoded_filename = os.path.join(output_dir, f"{prefix}_encoded.txt")
+    utf8_filename = os.path.join(output_dir, f"{prefix}_utf8.txt")
+
+    encoded_chars = bytearray()
+    utf8_chars = bytearray()
+
+    for i in range(0x20, 0x100):
+        try:
+            char = bytes([i])
+            utf8_char = codecs.decode(char, encoding).encode('utf-8')
+            encoded_chars.extend(char)
+            utf8_chars.extend(utf8_char)
+        except UnicodeDecodeError:
+            pass
+
+    with open(encoded_filename, 'wb') as encoded_file:
+        encoded_file.write(encoded_chars)
+
+    with open(utf8_filename, 'wb') as utf8_file:
+        utf8_file.write(utf8_chars)
+
+def main():
+    encodings = ['iso_8859_1', 'iso_8859_2', 'iso_8859_5', 'iso_8859_6', 'iso_8859_7', 'iso_8859_8', 'iso_8859_9', 'iso_8859_15', 'cp1252', 'cp1251', 'cp1250', 'cp1254', 'cp1253', 'cp1257', 'cp1255', 'cp1256']
+    output_dir = 'test_data'
+
+    if not os.path.exists(output_dir):
+        os.makedirs(output_dir)
+
+    for encoding in encodings:
+        generate_test_files(encoding, output_dir)
+
+if __name__ == "__main__":
+    main()