1local_ctype <- function(mode = c("C", "UTF-8"), env = parent.frame()) {
2  mode <- match.arg(mode)
3
4  if (mode == "UTF-8") {
5    sysname <- Sys.info()[["sysname"]]
6    if (sysname == "Windows") {
7      ctype <- "English_United States.1252"
8    } else if (sysname == "Darwin") {
9      ctype <- "UTF-8"
10    } else {
11      ctype <- "en_US.utf8"
12    }
13  } else {
14    ctype <- "C"
15  }
16
17  ctype0 <- Sys.getlocale("LC_CTYPE")
18  suppressWarnings({
19    withr::local_locale(LC_CTYPE = ctype, .local_envir = env)
20  })
21  if (Sys.getlocale("LC_CTYPE") != ctype) {
22    skip(paste0("Cannot change locale to '", ctype, "'"))
23  }
24  if (mode == "UTF-8" && !output_utf8()) {
25    skip("Cannot change to UTF-8 output")
26  }
27
28  ctype0
29}
30
31with_ctype <- function(mode = c("C", "UTF-8"), code) {
32  local_ctype(mode)
33  force(code)
34}
35