R.matlab
R.matlab copied to clipboard
encoding error when get a string array using getVariable .
Hi, everyone! I encountered a problem when get a string array using getVariable function. Here is a example code . My platform is PCWIN64 ,my matlab version is R2020b. The error is "can only read in bytes in a non-UTF-8 MBCS locale". I have tested and found that this problem came up when the array is string array rather than char string, and since my matlab default encoding is 'GBK', I have tried changing it to 'UTF-8' by using slCharacterEncoding('UTF-8'), but it didn't work. I will appreciate it if anyone can help or give some advice!
library(R.matlab)
Matlab$startServer()
matlab <- Matlab()
open(matlab)
evaluate(matlab,'a=["adsafdsa";"bfdgadfg"];')
a <- getVariable(matlab,'a')
close(matlab)
PS: the encoding format of Rstudio is 'UTF-8', though I also tried 'WINDOWS-1252' as my win10 encoding.
Hi, I have very little time to work on this package, but please provide what traceback() outputs immediately after you get the error, and also your sessionInfo(). This helps narrow down where in the code the problem lies.
sorry, I made a mistake, it was not a error but a warning.
Warning messages: 1: In readChar(con = con, nchars = nbrOfBytes) : can only read in bytes in a non-UTF-8 MBCS locale 2: In readMat(filename) : strings not representable in native encoding will be translated to UTF-8
The problem is , the variable I get became a byte array. For example,
evaluate(matlab,'a=["a";"b"];')
a <- getVariable(matlab,'a')
a is just like
>a
$MCOS
[1] 73 74 72 69 6e 67
[[2]]
[,1]
[1,] -587202560
[2,] 2
[3,] 1
[4,] 1
[5,] 1
[6,] 1
[[3]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
[1,] 0 1 73 77 0 0 0 0 14 0 0 0 8 3 0 0 6 0 0 0 8 0 0 0
[,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47]
[1,] 2 0 0 0 0 0 0 0 5 0 0 0 8 0 0 0 1 0 0 0 1 0 0
[,48] [,49] [,50] [,51] [,52] [,53] [,54] [,55] [,56] [,57] [,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] [,67] [,68] [,69] [,70]
[1,] 0 1 0 0 0 0 0 0 0 5 0 4 0 5 0 0 0 1 0 0 0 5 0
[,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79] [,80] [,81] [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90] [,91] [,92] [,93]
...(total 936)
attr(,"header")
attr(,"header")$description
[1] "MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Tue Dec 29 11:30:02 2020 \b\001"
attr(,"header")$version
[1] "5"
attr(,"header")$endian
[1] "little"
But there is no problem if the variable is not string array but char array.
evaluate(matlab,"a=['a';'b'];")
a <- getVariable(matlab,'a')
you got
> evaluate(matlab,"a=['a';'b'];")
> a <- getVariable(matlab,'a')
Warning message:
In readChar(con = con, nchars = nbrOfBytes) :
can only read in bytes in a non-UTF-8 MBCS locale
> a
$a
[,1]
[1,] "a"
[2,] "b"
attr(,"header")
attr(,"header")$description
[1] "MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Tue Dec 29 11:34:24 2020 "
attr(,"header")$version
[1] "5"
attr(,"header")$endian
[1] "little"
Thanks. So, my MATLAB skills are super rusty - like from 2005-ish.
Let's focus on:
> evaluate(matlab,"a=['a';'b'];")
> a <- getVariable(matlab,'a')
Warning message:
In readChar(con = con, nchars = nbrOfBytes) :
can only read in bytes in a non-UTF-8 MBCS locale
This warning comes from readMat() reading the results from MATLAB. It would be useful to have that as a MAT file. Can you create that a in MATLAB, and then save it in MAT v6 format, and make it available somewhere for download? Something like:
>> a=['a'; 'b']';
>> save('issue49-a.mat', '-v6', 'a');
Thank you for your kind replay!