Okay, eventually it boils down to this:<br><br><span style="font-family:courier new,monospace">import Data.Text</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">import Data.Text.Encoding (encodeUtf32LE)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">import Data.ByteString.Unsafe (unsafeUseAsCString)</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">textAsPtrW32 :: Text -&gt; (Ptr Word32 -&gt; IO a) -&gt; IO a</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">textAsPtrW32 t = unsafeUseAsCString (encodeUtf32LE $ t `snoc` &#39;\0&#39;) . (. castPtr)</span><br><br>As the function passed copies or at least does not store the pointer, I can use unsafeUseAsCString, but then I have to manually append the null-termination.<br>

<br><br><div class="gmail_quote">Le 21 mars 2012 13:09, Antoine Latter <span dir="ltr">&lt;<a href="mailto:aslatter@gmail.com">aslatter@gmail.com</a>&gt;</span> a écrit :<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im">On Wed, Mar 21, 2012 at 3:35 AM, Yves Parès &lt;<a href="mailto:yves.pares@gmail.com">yves.pares@gmail.com</a>&gt; wrote:<br>
&gt; Hello,<br>
&gt;<br>
&gt; I have to interact with a C++ library that accepts as string types (putting<br>
&gt; c++ strings aside) pointers of wchar_t (CWString in Haskell) or unsigned<br>
&gt; 32-bit int (Ptr Word32 for UTF-32 codepoints).<br>
&gt;<br>
&gt; I have read what text, bytestring and base provide, but Text can only be<br>
&gt; directly converted to (Ptr Word16), and if I use encodeUTF32 to get a<br>
&gt; ByteString, then I only get useAsCString, no direct conversion to CWString<br>
&gt; or Ptr WordXX is possible.<br>
<br>
</div>A CString is a (Ptr CChar). You can then use castPtr to get whichever<br>
pointer type you need, if you believe the underlying buffer has the<br>
representation you want (in this case, UTF-32).<br>
<br>
It still won&#39;t be null-terminated, however.<br>
<span class="HOEnZb"><font color="#888888"><br>
Antoine<br>
</font></span></blockquote></div><br>