2016-04-08 11 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ãoPaulo")) [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 "'それはうまくいっていますね。 – TheRimalaya

+0

しかし、 'nchar'は20文字を認識しますが、文字列観測可能な19にしかパディングされていません。短期間のハックは、コールの違いをテストし、スペース文字の違いを追加することだと思います。 – geotheory

関連する問題