R中的Sprintf不计算变音符号

时间:2012-02-15 11:44:11

标签: r printf diacritics

我有字符向量,我想确保向量的所有元素具有相同的长度。因此,我用空格填充短元素,如下所示:

vec <- c("fjdlksa01dada","rau","sjklf")
x <- sprintf("%-15s", vec)
nchar(x)
# returns
[1] 15 15 15

喜欢我建议的previous question的答案。这很好,但它似乎与变音符号有问题。例如,如果我的矢量看起来像这样:

vec2 <- c("fjdlksa01dada","rauü","sjklf")
y <- sprintf("%-15s", vec)
nchar(y)
# returns
[1] 15 14 15

我在Mac OS X上运行R(10.6)。我该如何解决这个问题?

编辑: 注意,我不打算修复nchar的输出,因为它是正确的。问题是sprintf失去了变形金刚。

编辑:更新R,更改为DWins语言环境 - 完全没有变化。但是:

vec2 <- c("fjdlksa01dada","rauü","sjklf")
Encoding(vec2)
# returns
[1] "unknown" "UTF-8"   "unknown"

奇怪。

2 个答案:

答案 0 :(得分:1)

可能有一种更清洁的方式......但这有效:

sapply(vec, function(x){
      paste(x, paste(rep(" ", 13-nchar(x)), collapse=""), "")
      })

(请参阅下面的注释,了解13的[non] - 表达式)

答案 1 :(得分:1)

我在?sprintf页面上找到了这个:

  

如果fmt的任何元素或任何字符参数声明为UTF-8,则结果的元素将为UTF-8并且编码声明为UTF-8。否则它将是当前语言环境的编码。

输入从Rgui的语言环境中获取其语言环境(我认为);见下文。

在Windows上,幸运的是已打印出来:

> vec2 <- c("fjdlksa01dada","rauü","sjklf")
> y <- sprintf("%-15s", vec)
> nchar(y)
[1] 15 15 15

想想在MacO上你可以通过打开R来实现这一点,如下所示,但我没有任何Mac来实际测试这个:

Rgui --encoding=utf-8