在Mac OS X上UniChar的正确JNA映射是什么?

时间:2010-10-20 01:13:03

标签: java unicode macos-carbon jna

我有一个像这样的C结构:

struct HFSUniStr255 {
    UInt16 length;
    UniChar unicode[255];
};

我已按预期方式映射:

public class HFSUniStr255 extends Structure
{
    public UInt16 length; // UInt16 is just an IntegerType with length 2 for convenience.

    public /*UniChar*/ char[] unicode = new char[255];
    //public /*UniChar*/ byte[] unicode = new byte[255*2];
    //public /*UniChar*/ UInt16[] unicode = new UInt16[255];

    public HFSUniStr255()
    {
    }

    public HFSUniStr255(Pointer pointer)
    {
        super(pointer);
    }
}

如果我使用这个版本,我会将字符串的每个第二个字符放入我的char [](“Aits D”代表“Macintosh HD”。)我假设这与64位相关平台和JNA将值映射到32位wchar_t,然后在复制它们时切断每个wchar_t上的高16位。

如果我使用byte []版本,我会得到使用UTF-16LE字符集正确解码的数据。

如果我使用UInt16 []版本,我会为每个字符获得正确的代码点,但是将它们转换回字符串会很不方便。

有没有什么方法可以将我的类型定义为char [],然后让它正确转换?

1 个答案:

答案 0 :(得分:0)

我不这么认为,因为char是一个解码的字节序列。

这就是为什么你的字节版本就像使用手动解码

的魅力一样

如果你想坚持使用字符,我建议:

  • 你用解码器挂钩JNA
  • 或将您的字符数字形式从UTF-16LE转换为内部JVM字符集,即unicode

不幸的是,我不知道如何做到这两者中的任何一个。

我的观点:坚持byte[] verion


顺便问一下,你是如何创建UInt16课程的?