以阿拉伯语语言环境格式化完整月份名称的日期

时间:2015-07-06 00:54:14

标签: r date settings arabic

以完整月份名称格式设置日期格式:[月份名称] [年份]我使用:

format(Sys.Date(),"%B %Y")

现在,我会用阿拉伯语做同样的事情:

## save locals
loc <- Sys.getlocale("LC_TIME")
Sys.setlocale("LC_TIME","Arabic")
format(Sys.Date(),"%B %Y")
## "????? 2015"          ## <----should have "جويلية 2015"
## restore locales
Sys.setlocale("LC_TIME",loc)

阿拉伯语月份不会被“????”取代。我不认为这是打印/ Unicode问题,因为阿拉伯语在控制台中正确显示:

"مرحبا "
[1] "مرحبا "

strptime

调用内部?strptime进行格式设置
  

适当的可用

中使用与字符串相关的特定于区域设置的转换

我认为strptime没有正确的阿拉伯语翻译。如果这是真的,我可以在哪里解决这个问题?

修改

AS在评论中指出这似乎可能是一个特定的系统/操作系统问题。 实际上,在 Ubuntu 机器下,安装language-pack-ar并调用

Sys.setlocale("LC_TIME", "ar_AE.utf8"); 
format(Sys.Date(),"%B %Y") 
[1] "يوليو 2015" 

给出了正确的答案。

但在 Windows 下,将区域设置转换为阿拉伯语(设置面板 - &gt;区域..)并调用相同的问题代码无法解决问题。

1 个答案:

答案 0 :(得分:3)

这个答案受到one的启发。我刚刚为@RichieCotton

给出的函数添加了一个格式参数
get_today_windows <- function(locale = NULL, fmt = "%B %Y")
{
  if(!is.null(locale))
  {
    lc_ctype <- Sys.getlocale("LC_CTYPE")
    lc_time <- Sys.getlocale("LC_TIME")
    on.exit(Sys.setlocale("LC_CTYPE", lc_ctype))
    on.exit(Sys.setlocale("LC_TIME", lc_time), add = TRUE)
    Sys.setlocale("LC_CTYPE", locale)
    Sys.setlocale("LC_TIME", locale)
  }
  ## here I am changing 
  today <- format(Sys.Date(), format = fmt )
  current_codepage <- as.character(l10n_info()$codepage)
  iconv(today, from = current_codepage, to = "utf8")
}

使用不同的阿拉伯语进行测试,因为各国之间存在一些差异:

get_today_windows("Arabic_Qatar")
## [1] "يوليو 2015"

get_today_windows("Arabic_Tunisia")
## [1] "جوييه 2015"

get_today_windows("Arabic_Saudi Arabia.1256")
## [1] "يوليو 2015"