我有C字符串保证是UTF-8编码.使用简单的字符串,我会这样做(假设我们可以使用pack
和unpack
):
result <- peekCString cstr free cstr -- ? not really important here return (T.pack result)
并使用字符串:
withCString (T.unpack str) $ \cstr -> use_string cstr
这些功能的问题在于
它们将使用由当前区域设置确定的编码
...但我知道它总是应该是UTF-8,如果当前的语言环境指定不同的编码,我会得到错误的结果.
那么,我应该如何处理来回的编组Text
?
尝试使用ByteString
中间类型,而不是String
,因为这将允许您使用Data.Text.Encoding
手动解码和编码字符串.
module Main where import Data.ByteString import Data.Text import Data.Text.Encoding import Foreign.C.String import Foreign.Marshal.Alloc decode :: CString -> IO Text decode cstr = do bytestr <- packCString cstr return (decodeUtf8 bytestr) encode :: Text -> (CString -> IO a) -> IO a encode text cont = useAsCString (encodeUtf8 text) cont
呜,进口派对.