我的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
的编组?
答案 0 :(得分:5)
尝试使用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
Woo,进口方。