在Android上编码和解码GB1830

时间:2017-07-21 09:56:13

标签: android delphi encoding

我开发了一个编码和解码GB1830的小型编码器类。我需要这个来读写Dicom文件,可以使用GB1830。对于那些没有参与这些事情的人来说,GB1830是一个中文多字节编码(1,2或4个字节),它覆盖与Unicode相同的代码点(超过1.1M),但是具有非常复杂的映射,使其与旧的中国标准(GBK)兼容。

但在Windows上,这比我预期的要简单:

Type
  GB18030String = Type AnsiString(54936);

Class Procedure TMEGB18030Encoder.Decode(Const Input: TMEStreamHandler; Const Output: TMEMultiCharSetString);
Var
  sGB18030: GB18030String;
  sUTF16LE: UnicodeString;
Begin
  sGB18030 := AnsiStringOf(Input.ReadRawByteString, 54936);
  sUTF16LE := UnicodeString(sGB18030);
  TMEUTF16LEEncoder.Decode(RawByteStringOf(sUTF16LE), Output);
End;

Class Procedure TMEGB18030Encoder.Encode(Const Input: TMEMultiCharSetString; Const Output: TMEStreamHandler);
Var
  sUTF16LE: UnicodeString;
  sGB18030: GB18030String;
Begin
  sUTF16LE := StringOf(TMEUTF16LEEncoder.Encode(Input));
  sGB18030 := GB18030String(sUTF16LE);
  Output.WriteRawByteString(RawByteStringOf(AnsiString(sGB18030)));
End;

这基本上使用AnsiString,代码页为54936,让操作系统处理GB1830和Unicode(UTF16LE)的转换。

但显然这段代码不会在Android上进行事件编译,因为没有AnsiStrings,而且我认为对Windows代码页的支持不多。但我可能错了,因为我实际上正在调用LocaleCharsFromUnicode,我认为这是在非Windows平台上模拟的。

所有这些都需要进行单元测试...但如果我甚至找不到在Android上重新编译此代码的方法,我认为无法开始测试它。任何提示或想法?

0 个答案:

没有答案