2016-04-08 2 views
9

Это ошибка?sprintf, кажется, игнорирует некоторые специальные символы

> 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

Это работает на моей машине..'nchar (sprintf ("% - 20s", "São Paulo")) [1] 20' – Sotos

+1

Ну, должно быть, дело Mac, или * моя Mac * вещь, то – geotheory

+1

То же самое здесь, пожалуйста, напишите свой 'sessionInfo()', возможно, это связано с настройками локали? –

ответ

2

Если вы читаете страницу справки о Sprintf, это говорит о том, кодироаки важны. Если вы посмотрите справочную страницу nchar, вы также узнаете, что существуют разные типы.

Как следствие, я вижу следующее (на Linux, R 3.3.0 беты):

> 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 
> 

Так что я утверждая, что нет ошибки вообще. Я не говорю гораздо больше, чем @TheRimalaya, но я делаю другое заключение

+0

Полезный фон. Но IMO, если функция дополнений выводит длину строки, отличную от указанной, должна быть ошибкой, даже если указанная ошибка объясняется кодировкой в ​​документации. – geotheory

+0

Настоящим «решением» было бы предоставить исправление для источников, чтобы –

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

Я вижу специальные полномочия, которые у вас есть. – geotheory

+0

Я также использую mac, поэтому я мог бы воспроизвести вашу проблему, когда я попробовал 'type =" bytes "' он работал, thats all – TheRimalaya

+0

Но пока 'nchar' распознает 20 символов, строка по-прежнему остается только дополнением к наблюдаемому 19. Я думаю, что кратковременный взлом - это проверить разницу между вызовами и добавить разницу в символах пробела. – geotheory