基于Android的gb183编解码

基于Android的gb183编解码,android,delphi,encoding,Android,Delphi,Encoding,我开发了一个小的编码器类,对GB1830进行编码和解码。我需要这个来读写Dicom文件,可以使用GB1830。对于那些不喜欢这些东西的人来说,是一种中文多字节编码(1、2或4字节),它覆盖了与Unicode相同的代码点(超过1.1M),但具有非常复杂的映射,以保持它与旧的中文标准(GBK)兼容 但在Windows上,这比我想象的要容易: Type GB18030String = Type AnsiString(54936); Class Procedure TMEGB18030Encode

我开发了一个小的编码器类,对GB1830进行编码和解码。我需要这个来读写Dicom文件,可以使用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;
这基本上使用了一个代码页为54936的AnsiString,让操作系统处理GB1830和Unicode(UTF16LE)之间的转换

但很明显,这段代码不会在Android上编译,因为没有应答,而且我想Windows代码页也不太支持。但在这一点上我可能是错的,因为我实际上正在经历对LocaleCharsFromUnicode的调用,我认为这是在非Windows平台上模拟的


所有这些都要经过单元测试。。。但如果我甚至找不到在Android上重新编译这段代码的方法,我看不到开始测试它的方法。有什么提示或想法吗?

这对你开始有帮助吗?看看它应该在所有平台上都能工作。@Dsm这正是我的AnsiStringOf函数的来源。它实际上操纵一个RawByteString设置其代码页。但我看不出有什么办法可以让它在Android上运行。请记住,这里的魔力来自硬类型的sUTF16LE:=UnicodeString(sGB18030)和sGB18030:=GB18030String(sUTF16LE)。这一切都是因为Delphi知道该字节串是使用特定的代码页编码的,并相应地转换数据。@DalijaPrasnikar-TEncoding在所有平台上都可以工作,但它不支持GB1830,即使在TCharSetEncoding实现中也不支持(它包括扩展ASCII和其他常见的编码)。重新实现GB1830 Unicode转换不是一项我有时间去做的任务。Android有一个实现更多编码的类,但是除了标准编码之外,
availableEncodings
都依赖于设备。不过,这可能是一条路要走。