Re: String encoding problem in R wrappers on Windows
Kevin Smith <[email protected]>
| Newsgroups | gmane.comp.programming.swig |
|---|---|
| Message-ID | <[email protected]> |
Just for future reference, my code had an incorrect function call in it. The correct way to create only UTF8 strings in R is as follows:
%typemap(out,noblock=1) char *
{
if ( $1 ) {
PROTECT($result = Rf_mkCharCE((char *)($1), CE_UTF8));
$result = Rf_ScalarString($result);
UNPROTECT(1);
} else {
$result = R_NilValue;
}
}
Kevin Smith
[email protected]
> On Aug 11, 2020, at 4:25 PM, William S Fulton <[email protected]> wrote:
>
> The code in question looks like it comes from the 'out' typemap for char *, so you are probably wrapping a function returning a char *:
>
> %typemap(out,noblock=1) char *
> { $result = $1 ? Rf_mkString(%reinterpret_cast($1,char *)) : R_NilValue; }
>
> Just add in your own version with the code you want (your code doesn't compile for me, but here it is converted into a typemap:)
>
> %typemap(out,noblock=1) char *
> // { $result = $1 ? Rf_mkString(%reinterpret_cast($1,char *)) : R_NilValue; }
> {
> if ( $1 ) {
> PROTECT($result = Rf_mkCharCE((char *)($1), CE_UTF8));
> $result = Rf_mkString($result);
> UNPROTECT(1);
> } else {
> $result = R_NilValue;
> }
> }
>
> William
>
>
>
> On Thu, 30 Jul 2020 at 21:42, Kevin Smith <[email protected]> wrote:
> I’m wrapping a library that uses all UTF-8 strings as results. I noticed recently that non-ASCII characters on Windows contained incorrect characters. I tracked it down to the use of Rf_mkString in the wrappers which I’m assuming must think the C string is encoded in the native encoding for the platform, not necessarily UTF-8. The lines looks like:
>
> r_ans = result ? Rf_mkString(result) : R_NilValue;
>
> I’m not sure how to make the wrappers work properly with UTF-8 result strings though. The only thing I can think of is to post-process the wrappers to generate code like the following. It forces the encoding to UTF-8. This approach seems pretty heavy-handed though and I was wondering if there was a better solution.
>
> if ( result ) {
> PROTECT(r_ans = Rf_mkCharCE((char *)(result), CE_UTF8));
> r_ans = Rf_mkString(r_ans);
> UNPROTECT(1);
> } else {
> r_ans = R_NilValue;
> }
>
> Kevin Smith
> [email protected]
>
>
>
>
>
>
> _______________________________________________
> Swig-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/swig-user
_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user