在Windows下使用任何语言环境的平日

我试图得到一周的一天,并在任何地区一直工作。 在与拉丁字母的地方,一切都很好。

Sys.getlocale() ## [1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252" weekdays(Sys.Date()) ## [1] "Tuesday" 

我有其他地区的两个相关的问题。

如果我设置

 Sys.setlocale("LC_ALL", "Arabic_Qatar") ## [1] "LC_COLLATE=Arabic_Qatar.1256;LC_CTYPE=Arabic_Qatar.1256;LC_MONETARY=Arabic_Qatar.1256;LC_NUMERIC=C;LC_TIME=Arabic_Qatar.1256" 

那么我有时(正确)得到

 weekdays(Sys.Date()) ## [1] "الثلاثاء 

有时得到

 weekdays(Sys.Date()) ## [1] "ÇáËáÇËÇÁ" 

取决于我的设置。 问题是,我无法弄清楚是什么导致了差异。

我认为这可能是与getOption("encoding") ,但我已经明确设置options(encoding = "native.enc")options(encoding = "UTF-8") ,并没有什么区别。

我已经尝试了R的几个最新版本,并且所有这些问题都是一致的。

目前,在R GUI中string显示正确,但在使用IDE(Architect和RStudiotesting)时不正确。

我应该设置什么来确保工作日始终正确显示?

知道weekdays(Sys.Date())format(as.POSIXlt(Sys.Date()), "%A")是等价的,它调用一个内部format.POSIXlt方法。

其次,改变所有的语言环境似乎是矫枉过正的。 我以为我应该能够设置时间选项。 但是,如果我设置了区域设置的单个组件,则weekdays返回一串问号。

 for(category in c("LC_TIME", "LC_CTYPE", "LC_COLLATE", "LC_MONETARY")) { Sys.setlocale(category, "Arabic_Qatar") print(Sys.getlocale()) print(weekdays(Sys.Date())) } ## [1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=Arabic_Qatar.1256" ## [1] "????????" ## [1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=Arabic_Qatar.1256;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=Arabic_Qatar.1256" ## [1] "????????" ## [1] "LC_COLLATE=Arabic_Qatar.1256;LC_CTYPE=Arabic_Qatar.1256;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=Arabic_Qatar.1256" ## [1] "????????" ## [1] "LC_COLLATE=Arabic_Qatar.1256;LC_CTYPE=Arabic_Qatar.1256;LC_MONETARY=Arabic_Qatar.1256;LC_NUMERIC=C;LC_TIME=Arabic_Qatar.1256" ## [1] "????????" 

场所的哪些部分会影响工作日的打印方式?


更新:问题似乎与Windows相关。 当我在一个语言环境为"ar_QA.UTF8"的Linux机器上运行代码时,工作日正确显示。


进一步更新:正如他在答复中提到的研究一样,在Windows下设置语言环境很奇怪,因为您不能像使用“en-GB”那样使用ISO代码。 对于Windows 7 / Vista / Server 2003 / XP,您可以使用setlocale语言string或“ 国家语言支持”值设置语言环境。 对于卡塔尔阿拉伯语,没有setlocale语言string,所以我们必须使用NLS值。 我们有几个select:

 Sys.setlocale("LC_TIME", "ARQ") # the language abbreviation name Sys.setlocale("LC_TIME", "Arabic_Qatar") # corresponding to the language/country pair "Arabic (Qatar)" Sys.setlocale("LC_TIME", "Arabic_Qatar.1256") # explicitly including the ANSI codepage Sys.setlocale("LC_TIME", "Arabic") # would sometimes be a possibility too, but it defaults to Saudi Arabic 

所以问题不是R不能支持Windows下的阿拉伯语言(尽pipe我不完全相信Sys.setlocale的健壮性)。


绝望的最后一次尝试:试图通过使用Windows Management Instrumentation命令更改操作系统区域设置不可行,因为R似乎无法识别所做的更改。

 system("wmic os set locale=MS_4001") ## Updating property(s) of '\\PC402729\ROOT\CIMV2:Win32_OperatingSystem=@' ## Property(s) update successful. system("wmic os get locale") # same as before 

Solutions Collecting From Web of "在Windows下使用任何语言环境的平日"

命名语言环境的系统是特定于操作系统的。 我建议您阅读“R安装和管理”手册中的语言环境以获取完整说明。

在windows下:

支持的语言列表列出了MSDN语言字符串 。 令人惊讶的是那里没有阿拉伯语。 “语言字符串”列包含用于在R中设置区域设置的合法输入 ,甚至在列表中没有国家说的阿拉伯文字符 。

当然,您可以更改您的语言环境全局设置(面板设置 – >区域 – > ..),但这会全局更改,并且不确定如何在没有编码问题的情况下获得正确的输出。

在Linux下(在我的情况下,Ubuntu的):

通常阿拉伯语默认不受支持,但使用locale很容易locale

  locale -a ## to list all already supported language sudo locale-gen ar_QA.UTF-8 ## install it in case does not exist 

现在RStudio下:

  Sys.setlocale('LC_TIME','ar_QA.UTF-8') [1] "ar_QA.UTF-8" > format(Sys.Date(),'%A') [1] "الثلاثاء 

还要注意的是,在R控制台下,打印效果不如R studio,因为它是从左到右而不是从右到左书写的。

RStudio / Architect问题

这可以通过明确地将星期几字符串的编码更改为UTF-8来稍微解决。

 current_codepage <- as.character(l10n_info()$codepage) iconv(weekdays(Sys.Date()), from = current_codepage, to = "utf8") 

请注意,代码页只存在于Windows上; 在Linux上, l10n_info()$codepageNULL

LC_TIME问题

事实证明,在Windows下,您必须设置LC_CTYPELC_TIME语言环境类别,并且必须在LC_TIME之前设置LC_CTYPE ,否则将无法工作。


最后,我们需要不同的操作系统的不同的实现。

Windows版本:

 get_today_windows <- function(locale = NULL) { 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) } today <- weekdays(Sys.Date()) current_codepage <- as.character(l10n_info()$codepage) iconv(today, from = current_codepage, to = "utf8") } get_today_windows() ## [1] "Tuesday" get_today_windows("French_France") ## [1] "mardi" get_today_windows("Arabic_Qatar") ## [1] "الثلاثاء" get_today_windows("Serbian (Cyrillic)") ## [1] "уторак" get_today_windows("Chinese (Traditional)_Taiwan") ## [1] "星期二" 

Linux版本:

 get_today_linux <- function(locale = NULL) { if(!is.null(locale)) { lc_time <- Sys.getlocale("LC_TIME") on.exit(Sys.setlocale("LC_TIME", lc_time), add = TRUE) Sys.setlocale("LC_TIME", locale) } weekdays(Sys.Date()) } get_today_linux() ## [1] "Tuesday" get_today_linux("fr_FR.utf8") ## [1] "mardi" get_today_linux("ar_QA.utf8") ## [1] "الثلاثاء" get_today_linux("sr_RS.utf8") ## [1] "уторак" get_today_linux("zh_TW.utf8") ## [1] "週二" 

在语言环境中强制执行.utf8编码似乎很重要get_today_linux("zh_TW")无法正确显示。