[Rd] Any progress on write.csv fileEncoding for UTF-16 and UTF-32 ?
Duncan Murdoch
murdoch.duncan at gmail.com
Sun Apr 30 18:23:58 CEST 2017
No, I don't think anyone is working on this.
There's a fairly simple workaround for the UTF-16 and UTF-32 iconv
issues: don't attempt to produce character vectors, produce raw vectors
instead. (The "toRaw" argument to iconv() asks for this.) Raw vectors
can contain embedded nulls. Character vectors can't, because
internally, R is using 8 bit C strings, and the nulls are string
terminators.
I don't know how difficult it would be to fix the write.table problems.
Duncan Murdoch
On 29/04/2017 7:53 PM, Jack Kelley wrote:
> "R version 3.4.0 (2017-04-21)" on "x86_64-w64-mingw32" platform
>
> I am using CSVs and other text tables, and text in general (including
> regular expressions), on Windows 10.
> For me, that means dealing with Windows-1252 and UTF-8 encoding, with UTF-16
> and UTF-32 as helpful curiosities.
>
> Something as simple as iconv ("\n", to = "UTF-16") causes an error, due to
> an embedded nul.
>
> Then there is write.csv (or write.table) with its fileEncoding parameter:
> not working correctly for UTF-16 and UTF-32.
>
> Of course, developers are aware of this, for example …
>
> [Rd] iconv to UTF-16 encoding produces error due to embedded nulls
> (write.table with fileEncoding param)
> https://stat.ethz.ch/pipermail/r-devel/2016-February/072323.html
>
> iconv to UTF-16 encoding produces error due to embedded nulls (write.table
> with fileEncoding param)
> http://r.789695.n4.nabble.com/iconv-to-UTF-16-encoding-produces-error-due-to
> -embedded-nulls-write-table-with-fileEncoding-param-td4717481.html
>
> ----------------------------------------------------------------------------
> ------------------------
>
> Focussing on write.csv and UTF-16LE and UTF-16BE, it seems that a nul
> character is omitted in each <CarriageReturn><LineFeed> pair.
>
> TEST SCRIPT
> ----------------------------------------------------------------------------
> ------------------------
> remove (list = objects())
>
> print (sessionInfo())
> cat ("---------------------------------\n\n")
>
> LE <- data.frame (
> want = c ("0d,00", "0a,00"),
> got = c ("0d ", "0a,00")
> )
>
> BE <- data.frame (
> want = c ("00,0d", "00,0a"),
> got = c ("00,0d", " 0a")
> )
>
> write.csv (LE, "R_LE.csv", fileEncoding = "UTF-16LE", row.names = FALSE)
> write.csv (BE, "R_BE.csv", fileEncoding = "UTF-16BE", row.names = FALSE)
>
> print (readBin ("R_LE.csv", "raw", 1000))
> print (LE)
> cat ("\n")
>
> print (readBin ("R_BE.csv", "raw", 1000))
> print (BE)
> cat ("\n")
>
> try (iconv ("\n", to = "UTF-8"))
>
> try (iconv ("\n", to = "UTF-16LE"))
> try (iconv ("\n", to = "UTF-16BE"))
> try (iconv ("\n", to = "UTF-16"))
>
> try (iconv ("\n", to = "UTF-32LE"))
> try (iconv ("\n", to = "UTF-32BE"))
> try (iconv ("\n", to = "UTF-32"))
> ----------------------------------------------------------------------------
> ------------------------
>
> TEST SCRIPT OUTPUT
>
>> source ("bug_encoding.R")
> R version 3.4.0 (2017-04-21)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
> Running under: Windows 10 x64 (build 14393)
>
> Matrix products: default
>
> locale:
> [1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
> [3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
> [5] LC_TIME=English_Australia.1252
>
> attached base packages:
> [1] stats graphics grDevices utils datasets methods base
>
> loaded via a namespace (and not attached):
> [1] compiler_3.4.0
> ---------------------------------
>
> [1] 22 00 77 00 61 00 6e 00 74 00 22 00 2c 00 22 00 67 00 6f 00 74 00 22 00
> 0d
> [26] 0a 00 22 00 30 00 64 00 2c 00 30 00 30 00 22 00 2c 00 22 00 30 00 64 00
> 20
> [51] 00 20 00 20 00 22 00 0d 0a 00 22 00 30 00 61 00 2c 00 30 00 30 00 22 00
> 2c
> [76] 00 22 00 30 00 61 00 2c 00 30 00 30 00 22 00 0d 0a 00
> want got
> 1 0d,00 0d
> 2 0a,00 0a,00
>
> [1] 00 22 00 77 00 61 00 6e 00 74 00 22 00 2c 00 22 00 67 00 6f 00 74 00 22
> 00
> [26] 0d 0a 00 22 00 30 00 30 00 2c 00 30 00 64 00 22 00 2c 00 22 00 30 00 30
> 00
> [51] 2c 00 30 00 64 00 22 00 0d 0a 00 22 00 30 00 30 00 2c 00 30 00 61 00 22
> 00
> [76] 2c 00 22 00 20 00 20 00 20 00 30 00 61 00 22 00 0d 0a
> want got
> 1 00,0d 00,0d
> 2 00,0a 0a
>
> Error in iconv("\n", to = "UTF-16LE") : embedded nul in string: '\n\0'
> Error in iconv("\n", to = "UTF-16BE") : embedded nul in string: '\0\n'
> Error in iconv("\n", to = "UTF-16") : embedded nul in string: 'þÿ\0\n'
> Error in iconv("\n", to = "UTF-32LE") :
> embedded nul in string: '\n\0\0\0'
> Error in iconv("\n", to = "UTF-32BE") :
> embedded nul in string: '\0\0\0\n'
> Error in iconv("\n", to = "UTF-32") :
> embedded nul in string: '\0\0þÿ\0\0\0\n'
>>
> ----------------------------------------------------------------------------
> ------------------------
> Cheers -- Jack Kelley
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
More information about the R-devel
mailing list