[vtkusers] VTK and Unicode

David Gobbi david.gobbi at gmail.com
Fri Jun 6 11:41:02 EDT 2014


Hi Maarten,

I've never used ToNarrow() myself, so I think you're relying a bit too
much on my expertise ;)

However, I have used WideCharToMultiByte() directly, and if given
CP_UTF8 as the first argument, it converts to UTF8.  It simply does
the conversion according to the codepage passed in the first argument.

 - David

On Fri, Jun 6, 2014 at 9:14 AM, Maarten Beek <beekmaarten at yahoo.com> wrote:
> Hi David,
>
> After copying the ushort string into a wchar_t string, ::ToNarrow() would
> return nonsense.
>
> I gave the variable KWSYS_ENCODING_DEFAULT_CODEPAGE the value CP_UTF8
> (defaults to CP_ACP in the vtksys CMakeLists.txt if nothing is defined) by
> using the add entry button in CMake.
> After rebuilding VTK, this didn't solve the problem.
>
> Would the codepage setting of the computer have to be set to CP_UTF8 at the
> moment of file creation for this to work? Although, this wouldn't affect my
> problem of getting the correct char* into the SetFileName() function. Would
> it?
>
> Maarten
>
>
> On Thursday, June 5, 2014 6:45:38 PM, David Gobbi <david.gobbi at gmail.com>
> wrote:
>
>
> Hi Maarten,
>
> Yes, vtksys::Encoding::ToNarrow() requires a wchart_t *.  If you like to
> live
> dangerously, you could just use a reinterpret_cast to convert your ushort *
> to a wchar_t *, but to be safe you should allocate a wchar_t string of the
> right size and then copy your ushort string into it.
>
> VTK doesn't have any cmake options related to unicode.  All file-level stuff
> in VTK always uses 8-bit strings no matter what build options you choose.
>
>   David
>
>
> On Thu, Jun 5, 2014 at 4:20 PM, Maarten Beek <beekmaarten at yahoo.com> wrote:
>> It's complaining about the ToNarrow() function.
>> (... symbol "__declspec(dllimport) <bla-bla> __cdecl
>> vtksys::Encoding::ToNarrow(<bla-bla>) referenced in function <bla-bla> )
>>
>> I got the VS solution from svn before my unicode changes and added the
>> ToNarrow() function and everything builds fine.
>> I guess if I build my app with unicode, I should do this with VTK as well
>> (how? don't see such an option in cmake...).
>>
>>
>> However the app crashes in Debug, but not in Release.
>> In another app, I need to set wchar_t as a build-in type to avoid the
>> unresolved external symbol error, but then an ushort* (returned by
>> QString::utf16()) cannot be cast to a wchar_t*... I guess ::ToNarrow(const
>> wchar_t*) needs a ::ToNarrow(const ushort*) overload?
>>
>> Maarten
>>
>>
>>
>> On Thursday, June 5, 2014 5:03:56 PM, David Gobbi <david.gobbi at gmail.com>
>> wrote:
>>
>>
>> Hi Maarten,
>>
>> I use the functions in vtksys all the time.  Not specifically the
>> Encoding functions, but they shouldn't be any different.
>>
>> You said it reported an unresolved symbol error... what symbol
>> was it complaining about?
>>
>>  David
>>
>>
>> On Thu, Jun 5, 2014 at 2:56 PM, Maarten Beek <beekmaarten at yahoo.com>
>> wrote:
>>> I am linking my app with vtksys.lib.
>>>
>>> But your answer also tells me I can use this function in my app.
>>>
>>> So it must be something else... maybe the fact that my vtk is built with
>>> multibyte and the app with unicode?
>>> Should find a function in vtksys that is unrelated to this to test.
>>>
>>> Maarten
>>>
>>>
>>> On Thursday, June 5, 2014 4:31:20 PM, David Gobbi <david.gobbi at gmail.com>
>>> wrote:
>>>
>>>
>>> An unresolved symbol just means that you have to link to the library,
>>> e.g. if you have a target_link_libraries() call in your CMakeLists.txt,
>>> make sure that "vtksys" is listed.
>>>
>>> On Thu, Jun 5, 2014 at 2:20 PM, Maarten Beek <beekmaarten at yahoo.com>
>>> wrote:
>>>> Hi David,
>>>>
>>>> Thanks for the quick reply.
>>>>
>>>> Sounds complicated, but I'll browse through the windows docs.
>>>>
>>>> In my search for a solution I also bumped into
>>>> vtksys::Encoding::ToNarrow(),
>>>> however this gives me an 'unresolved external symbol' link error. I have
>>>> never used stuff in vtksys (and similar libs like vtkpng, vtktiff)
>>>> before,
>>>> so I am not really sure I am supposed to, i.e., these are just functions
>>>> used by cmake and/or in just the vtk build.
>>>>
>>>> Maarten
>>>>
>>>>
>>>> On Thursday, June 5, 2014 3:44:46 PM, David Gobbi
>>>> <david.gobbi at gmail.com>
>>>> wrote:
>>>>
>>>>
>>>> Hi Maarten,
>>>>
>>>> VTK just uses C++ streams in most of its readers/writers.  On OS X,
>>>> you'll find that you can use utf-8 filenames just fine.  Same for linux,
>>>> for the most part at least.
>>>>
>>>> For Windows, you'd have to set the codepage to 65001 (utf-8).  I've
>>>> done this successfully for console I/O (via SetConsoleOutputCP()),
>>>> but you'll have to look through the Windows docs to see what function
>>>> is needed to change the codepage used by CreateFileA.
>>>>
>>>> - David
>>>>
>>>>
>>>> On Thu, Jun 5, 2014 at 1:17 PM, Maarten Beek <beekmaarten at yahoo.com>
>>>> wrote:
>>>>> Hi all,
>>>>>
>>>>> I was wondering if there is a multi-platform way of loading a file
>>>>> (e.g.
>>>>> tif, stl) with chinese, russian characters in the file path in VTK.
>>>>> How would I build VTK with Unicode characters?
>>>>> Can I use a non-unicode VTK in a unicode app?
>>>>>
>>>>> Thanks - Maarten
>>>>
>>>>
>>>
>>>
>>
>>
>
>


More information about the vtkusers mailing list