2016-04-08 13 views
9

Si tratta di un errore?sprintf sembra ignorare alcuni caratteri speciali

> nchar(sprintf("%-20s", "Sao Paulo")) 
[1] 20 
> nchar(sprintf("%-20s", "São Paulo")) 
[1] 19 

> sessionInfo() 
R version 3.2.4 (2016-03-10) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.4 (El Capitan) 

locale: 
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.2.4 fortunes_1.5-2 
+0

Funziona sulla mia macchina..'nchar (sprintf ("% - 20s", "São Paulo")) [1] 20' – Sotos

+1

Ah deve essere un Mac, o un * mio Mac * cosa poi – geotheory

+1

Lo stesso qui, per favore pubblica il tuo 'sessionInfo()', forse è legato alle impostazioni locali? –

risposta

2

Se leggete la pagina di aiuto di sprintf, si parla del fatto codifiche sono importanti. Se si guarda la pagina di aiuto di nchar, si impara anche che ci sono diversi tipi.

Di conseguenza, compaiono i seguenti (su Linux, R 3.3.0 beta):

> nchars <- function(x) vapply(c("bytes","chars","width"), 
           function(typ) nchar(x, type=typ), 1) 
> sp <- "São Paulo" 
> Encoding(sp) 
[1] "UTF-8" 
> nchars(sp) 
bytes chars width 
    10  9  9 
> nchars(sprintf("%-20s", sp)) 
bytes chars width 
    20 19 19 
> 

quindi sto sostenendo non v'è alcun bug a tutti. Non sto dicendo molto più di @TheRimalaya ma sto tracciando una conclusione diversa

+0

Sfondo utile. Ma IMO se una funzione di padding emette una lunghezza di stringa diversa da quella specificata, deve essere un bug, anche se detto bug è spiegato dalla codifica nella documentazione. – geotheory

+0

Una "soluzione" reale sarebbe quella di fornire una patch alle fonti in modo che –

3
> nchar(sprintf("%-20s", "Sao Paulo"), type = "bytes") 
[1] 20 
> nchar(sprintf("%-20s", "São Paulo"), type = "bytes") 
[1] 20 
+0

Vedo poteri speciali che hai .. – geotheory

+0

Sto anche usando mac, quindi posso riprodurre il tuo problema, quando ho provato 'type =" byte "' ha funzionato, questo è tutto – TheRimalaya

+0

Ma mentre 'nchar' riconosce 20 caratteri, la stringa è ancora riempito solo per un osservabile 19. Immagino che l'hack a breve termine sia quello di verificare la differenza tra le chiamate e aggiungere la differenza nei caratteri dello spazio. – geotheory