<div dir="ltr"><div>Hi Serge,</div><div><br></div><div>I'm not sure if this will be useful to you, but here is a function that I wrote a while ago</div><div>for converting Latin1 to utf8. A warning: even if utf8 works in some parts of VTK,</div><div>it definitely doesn't work in all parts of VTK. In particular, I suspect that most readers</div><div>and writers do not support utf8, or only support utf8 on certain operating systems.</div><div><br></div><div>Also the following unicode library is pre-installed on many systems these days:</div><div><a href="http://site.icu-project.org/">http://site.icu-project.org/</a></div><div><br></div><div> - David </div><div><br></div><div><br></div><div>std::string ConvertLatin1ToUtf8(const char *text, size_t l)</div><div>{</div><div><div> // compute expected size of the utf8 string and allocate it<br></div><div> const char *cp = text;</div><div> size_t m = l;</div><div> for (size_t n = 0; n < l; n++)</div><div> {</div><div> // add one byte for each 8-bit character in the string</div><div> m += static_cast<unsigned char>(*cp++) >> 7;</div><div> }</div><div> s.resize(m);</div><div><br></div><div> // encode each latin1 character as utf8</div><div> cp = text;</div><div> size_t i = 0;</div><div> while (i < m)</div><div> {</div><div> while (i < m && (*cp & 0x80) == 0)</div><div> {</div><div> // convert 7-bit character to one utf8 byte</div><div> s[i++] = *cp++;</div><div> }</div><div> if (i < m)</div><div> {</div><div> // convert 8-bit character to two utf8 bytes</div><div> int code = static_cast<unsigned char>(*cp++);</div><div> s[i++] = (0xC0 | (code >> 6));</div><div> s[i++] = (0x80 | (code & 0x3F));</div><div> }</div><div> }</div><div> </div><div> return s;</div></div><div><div>}</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 20, 2015 at 10:41 AM, Serge Lalonde <span dir="ltr"><<a href="mailto:serge@infolytica.com" target="_blank">serge@infolytica.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
I realized that I was passing a TrueType font file instead of a
FreeType one.<br>
So I downloaded the DejaVu fonts as recommended here:
<a href="http://vtkusers.public.kitware.narkive.com/5fy8hSRK/unicode-support" target="_blank">http://vtkusers.public.kitware.narkive.com/5fy8hSRK/unicode-support</a><br>
But it made no difference.<br>
<br>
I also looked at the TestChartUnicode and TextContextUnicode tests
to see how it's done there and I'm doing the same thing.<br>
<br>
So I don't see what's wrong. Anyone have any suggestions?<br>
<br>
Thanks.<div><div class="h5"><br>
<br>
<div>On 1/20/2015 12:03 PM, Serge Lalonde
wrote:<br>
</div>
</div></div><blockquote type="cite"><div><div class="h5">
Hi Sean,<br>
<br>
Thanks for the tips on encoding. I knew that I probably wasn't
using the right terminology and I'll read up on those soon.<br>
<br>
In the meantime, I'm no closer to being able to display "J (A/m2)"
as the title of a vtkScalarBarActor.<br>
<br>
I tried using these APIs on the TitleTextProperty of the
vtkScalarBarActor<br>
<pre> m_VTKScalarBarActor->GetTitleTextProperty()->SetFontFamily(VTK_FONT_FILE);
m_VTKScalarBarActor->GetTitleTextProperty()->SetFontFile("C:\\Windows\\winsxs\\amd64_microsoft-windows-font-truetype-arial_31bf3856ad364e35_6.1.7601.18528_none_d0a29012c3ff391b\\arial.ttf");
</pre>
and then encoding the string to be a sequence of hex escape
sequences like the example here:<br>
<pre> <a href="http://marc.info/?l=vtkusers&m=138868987612759&w=2" target="_blank">http://marc.info/?l=vtkusers&m=138868987612759&w=2</a>)</pre>
and it just spits out the string as-is, that is something like
"\x4A\x20\x28\x41\x2F\x6D\xC2\xB2\x29".<br>
<br>
Is there a tutorial or a wiki that shows how to use Unicode
strings in VTK? Ideally with the system fonts? What's the magic
formula? ;-)<br>
<br>
Thanks.<br>
<br>
<div>On 1/20/2015 11:05 AM, Sean McBride
wrote:<br>
</div>
<blockquote type="cite">
<pre>On Tue, 20 Jan 2015 10:18:44 -0500, Serge Lalonde said:
</pre>
<blockquote type="cite">
<pre>I'm upgrading from VTK 5.10.1 to VTK 6.1. All went smoothly until I ran
into an error rendering a vtkScalarBarActor whose title was set to "J (A/m2)".
This worked fine in 5.10.1, but in 6.1, the vtkutf8::is_valid() method
called from vtkUnicodeString::from_utf8() returns false because the
value of "2" is 0xB2 (in the extended ASCII range) but the vtkutf8 code
internally stops at 0x80 (sequence_length() in core.h returns 0). That
in turn causes a debug message "vtkUnicodeString::from_utf8(): not a
valid UTF-8 string." to appear and then other problems with vtkTextActor
not being able to calculate its bounds and so on.
</pre>
</blockquote>
<pre>I think you are a bit confused about character encodings (it's a confusing thing!).
First, there are no ASCII characters above 127. ASCII is a 7 bit code. What you mean to refer to is ISO-8859-1 aka Latin1. In that encoding, the 'square' character does indeed seem to be 0xB2:
<a href="https://en.wikipedia.org/wiki/ISO/IEC_8859-1" target="_blank"><https://en.wikipedia.org/wiki/ISO/IEC_8859-1></a>
8859 is not part of Unicode at all and is not the same as UTF-8.
There are many online Unicode tools, ex:
<a href="http://utf8-chartable.de" target="_blank"><http://utf8-chartable.de></a>
Where you can see the Unicode code point for 'superscript two' is U+00B2, which encoded as UTF-8 is 'c2 b2' in hex.
You might want to read this, which is a helpful classic:
<a href="http://www.joelonsoftware.com/articles/Unicode.html" target="_blank"><http://www.joelonsoftware.com/articles/Unicode.html></a>
Cheers,
</pre>
</blockquote>
<br>
<div>-- <br>
<a href="http:://www.infolytica.com" target="_blank">www.infolytica.com
</a><br>
300 Leo Pariseau, Suite 2222, Montreal, QC, Canada, H2X 4B3<br>
<a href="tel:%28514%29%20849-8752%20x236" value="+15148498752" target="_blank">(514) 849-8752 x236</a>, Fax: <a href="tel:%28514%29%20849-4239" value="+15148494239" target="_blank">(514) 849-4239</a> </div>
<br>
<fieldset></fieldset>
<br>
</div></div><span class=""><pre>_______________________________________________
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" target="_blank">http://markmail.org/search/?q=vtkusers</a>
Follow this link to subscribe/unsubscribe:
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a>
</pre>
</span></blockquote>
<br><span class="">
<div>-- <br>
<a href="http:://www.infolytica.com" target="_blank">www.infolytica.com </a><br>
300 Leo Pariseau, Suite 2222, Montreal, QC, Canada, H2X 4B3<br>
<a href="tel:%28514%29%20849-8752%20x236" value="+15148498752" target="_blank">(514) 849-8752 x236</a>, Fax: <a href="tel:%28514%29%20849-4239" value="+15148494239" target="_blank">(514) 849-4239</a>
</div>
</span></div>
<br>_______________________________________________<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" target="_blank">http://markmail.org/search/?q=vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br>
<br></blockquote></div><br></div>