Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中填充unicode字符串字符?_R_Printf - Fatal编程技术网

如何在R中填充unicode字符串字符?

如何在R中填充unicode字符串字符?,r,printf,R,Printf,我正在尝试使用sprintf()(但任何基R选项都可以)用空格填充字符 对于字母“a”它可以正常工作,但是对于“β”它将不起作用: sprintf(“%2s”,“a”) #>[1]“a” sprintf(“%2s”,“β”) #> [1] "β" sprintf(“%3s”,“β”) #> [1] " β" 我想这是因为需要两个字节(即两个sprintf的“字符”)来表示“β”字符串。。。但是,我可以更改代码使其正常工作,并使用空格填充“β”被理解为一个字符(即一个可见字符)。首先将字符串转换

我正在尝试使用
sprintf()
(但任何基R选项都可以)用空格填充字符

对于字母
“a”
它可以正常工作,但是对于
“β”
它将不起作用:

sprintf(“%2s”,“a”)
#>[1]“a”
sprintf(“%2s”,“β”)
#> [1] "β"
sprintf(“%3s”,“β”)
#> [1] " β"

我想这是因为需要两个字节(即两个sprintf的“字符”)来表示
“β”
字符串。。。但是,我可以更改代码使其正常工作,并使用空格填充
“β”
被理解为一个字符(即一个可见字符)。

首先将字符串转换为本机字符。这在Windows上适用,但在将其.Platform$os.type报告为unix的Windows上不适用

s <- 'β'; n <- 3 # inputs

sprintf("%*s", n, enc2native(s))  # or hard code the 3 and drop n
## [1] "  ß"

没有ANSI和Unicode字符。整个字符串使用单一编码,事实上,应用程序中的所有字符串都使用相同的编码。您描述的(1字节vs 2或更多)是如何使用非常特定的编码UTF8对字符串进行编码。在希腊语代码页中,
β
只使用一个字节,就像拉丁文中的
ß
一样,这很可能取决于系统(我们需要知道)。在R4.0.0/Win10/English_UK上,我似乎得到了默认情况下您想要的行为。Windows是一个Unicode操作系统。所有字符串都是Unicode,这意味着所有字符串至少使用两个字节。R在编码方面存在重大问题,而不仅仅是Unicode。它在第一次发布时根本没有处理它们,假设所有文件和字符串都是使用本地机器编码的单字节。R和R Studio甚至无法显示Unicode文本。虽然这在语言本身中得到了(缓慢地)修复,但一些软件包仍然无法处理具有不同编码的文件。在Windows上,非Unicode应用程序(和字符串)的默认编码来自用户的区域设置。在Linux上,
LC\uu
env变量指定机器上的所有应用程序或特定shell使用的编码。大多数情况下,编码是UTF8,但有时不是,这会导致问题。在Mac上,
LC
变量至少设置在两个不同的位置,可以。。。顺便说一句,你可能发现了另一个R bug。您使用的是哪个R版本?你试过升级吗?由于
β
被视为2个字节,而
a
被视为1个字节,这意味着您没有使用Wiindows,并且系统编码是UTF8,因此首先不需要这样做。只有一个角色。这是一个错误,
enc2nitive
解决方案在macOS/R 4.0和Linux上都不起作用(我直觉上也不这么认为)。@KonradRudolph有一个简单的解释吗?@MartinGal
enc2nitive
不应该对字符串文本产生任何影响,因为文本的编码已经是本机编码。只有当字符串是使用不同的编码从其他来源(例如文件)读取时,才会产生差异。(可能Windows做了一些不同的事情,不知道。)@Konrad Rudolph,在我的Windows PC上,
s
的编码是UTF-8,但是
enc2native的编码是拉丁语。
# 2
paste0(strrep(' ', n - nchar(s)), s)
## [1] "  β"

# 3
`substring<-`(strrep(" ", n), n - nchar(s) + 1, n, s)
## [1] "  ß"

# 4
sub("X+", s, sprintf("%*s", n, strrep("X", nchar(s))))
## [1] "  β"