Smalltalk FFI调用OpenDBX中的unicode字符

时间:2011-03-06 19:18:43

标签: unicode smalltalk squeak pharo ffi

我需要将一些包含非ASCII字符的字符串插入数据库(Postgress)。这是最小的例子。我在<cdecl: long 'odbx_query' (ulong char* ulong) module: 'opendbx'>上得到了“无法强迫论证”。根据我的理解,这是一个FFI错误,调用甚至没有进入数据库后端,但我不确定。

| conn settings sql |
settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password'.
conn := DBXConnection platform: DBXPostgresPlatform new settings: settings.
conn connectAndOpen.
sql := 'select ''', (WideString fromPacked: 269), ''' from dual'.
conn execute: sql.
conn close.
conn disconnect.

5 个答案:

答案 0 :(得分:4)

我想我遇到了同样的问题。应该使用与服务器相同的编码对数据进行编码。目前,您应该能够通过以下方式指定编码:

settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password';
                encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).

如果不知道编码,可以使用DBXAutomaticEncoding代替DBXStaticEncoding。 这应该适用于postgresql数据库。

答案 1 :(得分:1)

问题似乎是WideString。似乎FFI无法从WideString实例转换为C char *

你可以使用普通的ByteString代替宽吗?也许FFI可以修复,以便它可以做到吗?

答案 2 :(得分:1)

我仍然不知道如何在stackoverflow中回答某人。无论如何,Panu说应该有用:

settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password';
                encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).

无需使用直接使用UTF8TextConverter。这是用SqueakDBX做的方法。它与GlorpDBX无关,它只是简单的SqueakDBX。如果未更新最新的ConfigurationOfSqueakDBX,只需使用Monticello Browser更新到最新版本。

答案 3 :(得分:0)

FFI的char *想要一个ByteString。也许postgres可以直接使用UTF-8?如果是这样,你只需要说squeakToUtf8。

答案 4 :(得分:0)

使用

修复

UTF8TextConverter >> convertToSystemString

UTF8TextConverter >> convertFromSystemString