dart-app-core/lib/cp949.dart
2023-03-26 01:48:46 +09:00

59 lines
1.8 KiB
Dart

import 'dart:typed_data';
import 'code_map.dart' show cp949ToUnicodeCodeMap, unicodeToCp949CodeMap;
Uint8List toUnicodes(final Uint8List codeUnits) {
final unicodes = Uint8List(codeUnits.length);
var j = 0;
for (var i = 0; i < codeUnits.length; j++) {
// When 1 byte becomes 1 cp949 code
if (0x00 <= codeUnits[i] && codeUnits[i] <= 0x7F) {
unicodes[j] = cp949ToUnicodeCodeMap[codeUnits[i]]!;
i = i + 1;
} else {
// When 2 bytes become 1 cp949 code
final cp949Code = (codeUnits[i] << 8) + codeUnits[i + 1];
i = i + 2;
if (0x8141 <= cp949Code &&
cp949Code <= 0xFDFE &&
cp949ToUnicodeCodeMap.containsKey(cp949Code)) {
unicodes[j] = cp949ToUnicodeCodeMap[cp949Code]!;
} else {
throw FormatException(
'Invalid code unit of CP949. It has to be (>=0x00 <=0x7F) || (>=0x8141 <=0xFDFE).');
}
}
}
return unicodes.sublist(0, j);
}
String decode(final Uint8List codeUnits) {
return String.fromCharCodes(toUnicodes(codeUnits));
}
String decodeString(final String brokenString) {
return decode(Uint8List.fromList(brokenString.codeUnits));
}
/// Dart does not support non-unicode encoding.
/// Thus, the return value has to be raw byte array of CP949.
Uint8List encode(final String str) {
final cp949codeUnits = Uint8List(str.codeUnits.length * 2);
var i = 0;
for (final unicode in str.codeUnits) {
final cp949Code = unicodeToCp949CodeMap[unicode];
final firstByte = cp949Code! >> 8;
final secondByte = cp949Code - (firstByte << 8);
if (firstByte != 0) {
cp949codeUnits[i] = firstByte;
i = i + 1;
}
cp949codeUnits[i] = secondByte;
i = i + 1;
}
return cp949codeUnits.sublist(0, i);
}
String encodeToString(final String str) {
return String.fromCharCodes(encode(str));
}