Test whether the output connection has ANSI style escape support or UTF-8 support.

output_ansi()

output_utf8()

Details

output_ansi tests whether the output connection supports ANSI style escapes. This is TRUE if the connection is a terminal and not the Windows GUI. Otherwise, it is true if running in RStudio 1.1 or later with ANSI escapes enabled, provided stdout() has not been redirected to another connection by sink().

output_utf8 tests whether the output connection supports UTF-8. For most platforms l10n_info()$`UTF-8` gives this information, but this does not give an accurate result for Windows GUIs. To work around this, we proceed as follows:

  • if the character locale (LC_CTYPE) is "C", then the result is FALSE;

  • otherwise, if l10n_info()$`UTF-8` is TRUE, then the result is TRUE;

  • if running on Windows, then the result is TRUE;

  • in all other cases the result is FALSE.

Strictly speaking, UTF-8 support is always available on Windows GUI, but only a subset of UTF-8 is available (defined by the current character locale) when the output is redirected by knitr or another process. Unfortunately, it is impossible to set the character locale to UTF-8 on Windows. Further, the utf8 package only handles two character locales: C and UTF-8. To get around this, on Windows, we treat all non-C locales on that platform as UTF-8. This liberal approach means that characters in the user's locale never get escaped; others will get output as <U+XXXX>, with incorrect values for utf8_width.

Value

A logical scalar indicating whether the output connection supports the given capability.

Examples

# test whether ANSI style escapes or UTF-8 output are supported
cat("ANSI:", output_ansi(), "\n")
#> ANSI: FALSE 
cat("UTF8:", output_utf8(), "\n")
#> UTF8: TRUE 

# switch to C locale
Sys.setlocale("LC_CTYPE", "C")
#> [1] "C"
cat("ANSI:", output_ansi(), "\n")
#> ANSI: FALSE 
cat("UTF8:", output_utf8(), "\n")
#> UTF8: FALSE 

# switch to native locale
Sys.setlocale("LC_CTYPE", "")
#> [1] "C.UTF-8"

tmp <- tempfile()
sink(tmp) # redirect output to a file
cat("ANSI:", output_ansi(), "\n")
#> ANSI: FALSE 
cat("UTF8:", output_utf8(), "\n")
#> UTF8: TRUE 
sink() # restore stdout

# inspect the output
readLines(tmp)
#> character(0)