【问题标题】:Using non-ASCII characters inside functions for packages在包的函数中使用非 ASCII 字符
【发布时间】:2014-04-09 00:38:26
【问题描述】:

我正在尝试编写一个等效于scales::dollar 的函数,它在图形的开头添加一个英镑 (£) 符号。由于 scales 代码非常健壮,我将其用作框架并简单地将 $ 替换为 £。

一个精简的函数示例:

pounds<-function(x) paste0("£",x)

当我运行 CHECK 时,我得到以下信息:

Found the following file with non-ASCII characters:
  pounds.R
Portable packages must use only ASCII characters in their R code,
except perhaps in comments.
Use \uxxxx escapes for other characters.

浏览 Writing R extensions 指南并没有为如何解决此问题提供很多帮助 (IMO)。它提到了 \uxxxx 并说它指的是 Unicode 字符。

查找 unicode 字符会得到代码 &amp;#163,但我可以找到的 \uxxxx 指导很少,并且与 W3schools 上的 Java 有关。

我的问题是:

如何使用 \uxxxx 转义符在 R 函数中实现非 unicode 字符的使用,以及在函数使用后这种用法如何影响此类字符的显示?

【问题讨论】:

  • 供参考 - 请参阅这个几乎相同的问题:stackoverflow.com/q/11452796/602276
  • 干杯@Andrie - 不知道我在第一次谷歌搜索时怎么没有找到它。 Karsten 添加了有关如何识别 unicode 应该是什么的有价值信息 - 我建议否则标记为重复。
  • 由于这个问题也有答案,我们不能关闭为重复。有一个合并类似问题的过程,但我没有时间这样做。对我来说,将问题联系起来就足够了。如果其他人想发起合并,那也没关系。

标签: r string unicode ascii


【解决方案1】:

试试这个:

pounds<-function(x) paste0("\u00A3",x)

【讨论】:

    【解决方案2】:

    对于 \uxxxx 转义,您需要知道字符的十六进制数。您可以使用charToRaw 确定它:

    sprintf("%X", as.integer(charToRaw("£")))
    [1] "A3"
    

    现在您可以使用它来指定您的非 ascii 字符。 \u00A3£ 都代表同一个字符。

    另一种选择是使用stringi::stri_escape_unicode

    library(stringi)
    stringi::stri_escape_unicode("➛")
    # "\\u279b"
    

    这告诉您"\u279b" 代表字符"➛"

    【讨论】:

    • 这为 提供了sprintf("%X", as.integer(charToRaw("➛"))) # "E2" "9E" "9B。那该怎么办呢?
    • 已编辑此案例的答案。不知道为什么 rawToChar 不适用于您的示例。
    【解决方案3】:

    stringi 包在以下情况下很有用:

    library(stringi)
    
    stri_escape_unicode("£")
    #> [1] "\\u00a3"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2018-07-27
      • 2013-08-30
      • 1970-01-01
      • 2014-06-12
      相关资源
      最近更新 更多