我正在尝试从Jython中分配一个Java char
数组,该数组将由Java库填充。我想从Jython中做相同的事情:
char[] charBuffer = new char[charCount];
我已经阅读了array和jarray模块的文档(我认为它们是相同的),但我不完全确定我想使用哪种类型的代码。这两个文件似乎有点矛盾,但较新的数组模块似乎更正确。
根据Java documentation,char
是“16位Unicode字符”(2个字节)。
因此,如果我检查以下类型代码:
>>> array.array('c').itemsize # C char, Python character
1
>>> array.array('b').itemsize # C signed char, Python int
1
>>> array.array('B').itemsize # C unsigned char, Python int
2
>>> array.array('u').itemsize # C Py_UNICODE, Python unicode character
4
>>> array.array('h').itemsize # C signed short, Python int
2
>>> array.array('H').itemsize # C unsigned short Python int
4
我觉得奇怪的是B
和H
的大小是签名对手b
和h
的两倍。我可以安全可靠地使用16位B
(无符号字符)或h
(带符号短整数)来表示Java char
吗?或者,如果使用 array 模块是完全错误的,请告诉我。
答案 0 :(得分:1)
简短的回答是:使用' c'
在幕后,jython正在为您转换数据类型。
您可以通过某些测试进行验证。有一个java.nio.CharBuffer类,带有一个方法wrap(),它接受一个char []数组。观察jython数组类型' c'在其他一切都失败的情况下工作:
>>> import array
>>> from java.nio import CharBuffer
>>> array.array('c', 'Hello World')
array('c', 'Hello World')
>>> CharBuffer.wrap( array.array('c', 'Hello World') )
Hello World
>>> array.array('b','Hello World')
array('b', [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100])
>>> CharBuffer.wrap( array.array('b', 'Hello World') )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: wrap(): 1st arg can't be coerced to char[], java.lang.CharSequence
>>> array.array('u', u'Hello World')
array('u', u'Hello World')
>>> CharBuffer.wrap( array.array('u', u'Hello World') )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: wrap(): 1st arg can't be coerced to char[], java.lang.CharSequence