Terminal control/Unicode output: Difference between revisions

m
No edit summary
 
(14 intermediate revisions by 10 users not shown)
Line 5:
 
Note that it is permissible to use system configuration data to determine terminal capabilities if the system provides such a facility.
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">canHandleUnicode?: function [][
any? @[
if key? env "LC_ALL" -> contains? lower get env "LC_ALL" "utf-8"
if key? env "LC_CTYPE" -> contains? lower get env "LC_CTYPE" "utf-8"
if key? env "LANG" -> contains? lower get env "LANG" "utf-8"
]
]
 
if? canHandleUnicode? ->
print "Terminal handle unicode and U+25B3 is: △"
else ->
print "Unicode is not supported on this terminal"</syntaxhighlight>
 
{{out}}
 
<pre>Terminal handle unicode and U+25B3 is: △</pre>
 
=={{header|AutoHotkey}}==
 
<langsyntaxhighlight lang="autohotkey">DllCall("AllocConsole")
hConsole:=DllCall("GetConsoleWindow","UPtr")
Stdout:=FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
Line 62 ⟶ 81:
Pause() {
RunWait, %comspec% /c pause>NUL
}</langsyntaxhighlight>
 
=={{header|AWK}}==
 
<langsyntaxhighlight lang="awk">#!/usr/bin/awk -f
BEGIN {
unicodeterm=1 # Assume Unicode support
Line 90 ⟶ 109:
print "HW65001 This program requires a Unicode compatible terminal"|"cat 1>&2"
exit 252 # Incompatible hardware
}</langsyntaxhighlight>
 
=={{header|BaCon}}==
<code>LANG</code> environment test borrowed from C solution.
<syntaxhighlight lang="freebasic">' Determine if the terminal supports Unicode
' if so display delta, if not display error message
LET lc$ = GETENVIRON$("LANG")
IF INSTR(LCASE$(lc$), "utf8") != 0 THEN
PRINT UTF8$(0x25B3)
ELSE
EPRINT "Sorry, terminal is not testing as unicode ready"
END IF</syntaxhighlight>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> VDU 23,22,640;512;8,16,16,128+8 : REM Enable UTF-8 mode
*FONT Arial Unicode MS,36
PRINT CHR$(&E2)+CHR$(&96)+CHR$(&B3)</langsyntaxhighlight>
 
=={{header|C}}==
<syntaxhighlight lang="c">
<lang c>
#include<stdlib.h>
#include<stdio.h>
Line 126 ⟶ 156:
return 0;
}
</syntaxhighlight>
</lang>
Output:
<pre>
Line 133 ⟶ 163:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">
(if-not (empty? (filter #(and (not (nil? %)) (.contains (.toUpperCase %) "UTF"))
(map #(System/getenv %) ["LANG" "LC_ALL" "LC_CTYPE"])))
"Unicode is supported on this terminal and U+25B3 is : \u25b3"
"Unicode is not supported on this terminal.")
</syntaxhighlight>
</lang>
 
{{out}}
Line 145 ⟶ 175:
=={{header|Common Lisp}}==
Each implementation has a different "getenv" function, to work with various implementations was created the "my-getenv" function.
<langsyntaxhighlight lang="lisp">
(defun my-getenv (name &optional default)
#+CMU
Line 165 ⟶ 195:
(format t "Unicode is not supported on this terminal.~&")
)
</syntaxhighlight>
</lang>
{{out}}
<pre>Unicode is supported on this terminal and U+25B3 is : △</pre>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">
if ["LANG", "LC_CTYPE", "LC_ALL"]
|> Enum.map(&System.get_env/1)
Line 179 ⟶ 209:
raise "This terminal does not support Unicode."
end
</syntaxhighlight>
</lang>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">Print "Terminal handle unicode and U+25B3 is: "; WChr(&H25B3)</syntaxhighlight>
 
=={{header|FunL}}==
<langsyntaxhighlight lang="funl">if map( v -> System.getenv(v), ["LC_ALL", "LC_CTYPE", "LANG"]).filter( (!= null) ).exists( ('UTF' in) )
println( '\u25b3' )
else
println( 'Unicode not supported' )</langsyntaxhighlight>
 
=={{header|Go}}==
{{works with|Ubuntu 16.04}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 204 ⟶ 237:
fmt.Println("This terminal does not support unicode")
}
}</langsyntaxhighlight>
 
{{out}}
Line 212 ⟶ 245:
 
=={{header|Haskell}}==
<langsyntaxhighlight Haskelllang="haskell">import System.Environment
import Data.List
import Data.Char
Line 222 ⟶ 255:
then putStrLn "UTF supported: \x25b3"
else putStrLn "UTF not supported"
</syntaxhighlight>
</lang>
Output:
<pre>
Line 236 ⟶ 269:
 
"has_unicode_support" therefore cannot simply test whether one of the variables LC_ALL, LC_TYPE and LANG contains the string UTF.
<langsyntaxhighlight lang="jq">def has_unicode_support:
def utf: if . == null then false else contains("UTF") or contains("utf") end;
env.LC_ALL
Line 250 ⟶ 283:
end ;
 
task</langsyntaxhighlight>
{{Out}}
$ jq -M -r -n -f Terminal_control.jq
Line 258 ⟶ 291:
$ jq -M -r -n -f Terminal_control.jq
 
=={{header|Jsish}}==
Detection based on code from other entries, looking in LC_ALL, LC_CTYPE, LANG for hints of 'UTF'.
<syntaxhighlight lang="javascript">/* Terminal Control/Unicode, in Jsish */
 
var utf = false;
for (var envar of ['LC_ALL', 'LC_CTYPE', 'LANG']) {
var val = Util.getenv(envar);
if (val && (val.search(/utf/i) > 0)) {
utf = true;
break;
}
}
 
puts((utf) ? '\u25b3' : 'Unicode support not detected');
 
/*
=!EXPECTSTART!=
=!EXPECTEND!=
*/</syntaxhighlight>
 
{{out}}
<pre>prompt$ jsish --U terminalControlUnicode.jsi
△</pre>
 
=={{header|Julia}}==
{{works with|Linux}}
<syntaxhighlight lang="julia">
<lang Julia>
c = '\u25b3'
 
Line 269 ⟶ 327:
println("This output device does not support Unicode.")
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 278 ⟶ 336:
=={{header|Kotlin}}==
{{works with|Ubuntu|14.04}}
<langsyntaxhighlight lang="scala">// version 1.1.2
 
fun main(args: Array<String>) {
Line 286 ⟶ 344:
else
println("This terminal does not support unicode")
}</langsyntaxhighlight>
 
{{out}}
Line 294 ⟶ 352:
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(env_vars = sys_environ -> join('###'))
if(#env_vars >> regexp(`(LANG|LC_ALL|LC_CTYPE).*?UTF.*?###`)) => {
stdout('UTF supported \u25b3')
else
stdout('This terminal does not support UTF')
}</langsyntaxhighlight>
<pre>UTF supported △
</pre>
 
=={{header|M2000 Interpreter}}==
M2000 Environment has own console (with graphics support)
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
If IsWine then Font "DejaVu Sans"
Line 316 ⟶ 375:
}
Checkit
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}}==
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<lang Mathematica>If[StringMatchQ[$CharacterEncoding, "UTF*"], Print[FromCharacterCode[30000]], Print["UTF-8 capable terminal required"]]
<syntaxhighlight lang="mathematica">If[StringMatchQ[$CharacterEncoding, "UTF*"], Print[FromCharacterCode[30000]], Print["UTF-8 capable terminal required"]]
->田</lang>
->田</syntaxhighlight>
 
=={{header|Mercury}}==
<langsyntaxhighlight lang="mercury">:- module unicode_output.
:- interface.
 
Line 345 ⟶ 405:
else
io.write_string("Unicode is not supported on this terminal.\n", !IO)
).</langsyntaxhighlight>
Output:
<pre>Unicode is supported on this terminal and U+25B3 is : △</pre>
Line 351 ⟶ 411:
=={{header|Nemerle}}==
Typically, on a windows system, the output encoding is '''not''' UTF-8, so in an actual application it would make more sense to set <tt>Console.OutputEncoding</tt> than to merely check it.
<langsyntaxhighlight Nemerlelang="nemerle">using System.Console;
 
module UnicodeOut
Line 360 ⟶ 420:
else Write("Console encoding may not support Unicode characters.");
}
}</langsyntaxhighlight>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import os, strutils
 
if "utf" in getEnv("LANG").toLower:
echo "Unicode is supported on this terminal and U+25B3 is: △"
else:
echo "Unicode is not supported on this terminal."</langsyntaxhighlight>
 
=={{header|Perl}}==
Much like Perl 6Raku...
<langsyntaxhighlight lang="perl">die "Terminal can't handle UTF-8"
unless $ENV{LC_ALL} =~ /utf-8/i or $ENV{LC_CTYPE} =~ /utf-8/i or $ENV{LANG} =~ /utf-8/i;
 
print "△ \n";</langsyntaxhighlight>
=={{header|Perl 6}}==
<lang perl6>die "Terminal can't handle UTF-8"
unless first(*.defined, %*ENV<LC_ALL LC_CTYPE LANG>) ~~ /:i 'utf-8'/;
say "△";</lang>
{{out}}
<pre>△</pre>
 
=={{header|Phix}}==
Works on both linux and windows.
 
First,The hide some of thefollowing (grubby low-level details are hidden away in) abuiltins/unicode_console.e re-usablewhich is now included in the standard includedistribution:
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>--
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
-- builtins/unicode_console.e
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">cffi</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
--
<span style="color: #008080;">constant</span> <span style="color: #000000;">tGSH</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
-- Implements unicode_console() -- initialises one, and returns true if supported
HANDLE WINAPI GetStdHandle(
--
_In_ DWORD nStdHandle
-- While there is some appeal to performing (the equivalent inline assembly of) this automatically in the
);
-- back-end/run-time, it would probably break too much legacy code that assumes Windows-1252 or ISO-8859.
"""</span><span style="color: #0000FF;">,</span>
--
<span style="color: #000000;">tSCOCP</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
include builtins\cffi.e
BOOL WINAPI SetConsoleOutputCP(
--set_unicode(true)
_In_ UINT wCodePageID
constant
);
--windows:
"""</span><span style="color: #0000FF;">,</span>
tGSH = """
<span style="color: #000000;">STD_OUTPUT_HANDLE</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span>
HANDLE WINAPI GetStdHandle(
<span style="color: #000000;">CP_UTF8</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">65001</span><span style="color: #0000FF;">,</span>
_In_ DWORD nStdHandle
<span style="color: #000000;">envset</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"LANG"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"LC_ALL"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"LC_CTYPE"</span><span style="color: #0000FF;">}</span>
);
""",
<span style="color: #004080;">atom</span> <span style="color: #000000;">k32</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">NULL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xGetStdHandle</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hConsole</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xSetConsoleOutputCP</span>
tSCOCP = """
BOOL WINAPI SetConsoleOutputCP(
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">unicode_console</span><span style="color: #0000FF;">()</span>
_In_ UINT wCodePageID
<span style="color: #000080;font-style:italic;">-- initialises the windows console for unicode, and
);
-- returns true if unicode is supported, else false.</span>
""",
<span style="color: #004080;">bool</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
STD_OUTPUT_HANDLE = -11,
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">WINDOWS</span> <span style="color: #008080;">then</span>
CP_UTF8 = 65001,
<span style="color: #008080;">if</span> <span style="color: #000000;">k32</span><span style="color: #0000FF;">=</span><span style="color: #004600;">NULL</span> <span style="color: #008080;">then</span>
--linux:
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- force console to exist</span>
envset = {"LANG","LC_ALL","LC_CTYPE"}
<span style="color: #000000;">k32</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">open_dll</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"kernel32.dll"</span><span style="color: #0000FF;">)</span>
 
<span style="color: #000000;">xGetStdHandle</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_cffi_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tGSH</span><span style="color: #0000FF;">)</span>
atom k32 = NULL,
<span style="color: #000000;">hConsole</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xGetStdHandle</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">STD_OUTPUT_HANDLE</span><span style="color: #0000FF;">})</span>
xGetStdHandle,
<span style="color: #000000;">xSetConsoleOutputCP</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_cffi_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tSCOCP</span><span style="color: #0000FF;">)</span>
hConsole,
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
xSetConsoleOutputCP
<span style="color: #000080;font-style:italic;">-- following is equivalent to running "chcp 65001":</span>
 
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xSetConsoleOutputCP</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">CP_UTF8</span><span style="color: #0000FF;">})</span>
global function unicode_console()
<span style="color: #008080;">else</span> <span style="color: #000080;font-style:italic;">-- LINUX</span>
-- initialises the windows console for unicode,
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">envset</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
-- and returns true/false if unicode is supported.
<span style="color: #008080;">if</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"UTF"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">upper</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">getenv</span><span style="color: #0000FF;">(</span><span style="color: #000000;">envset</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])))!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
bool res = false
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
if platform()=WINDOWS then
<span style="color: #008080;">exit</span>
if k32=NULL then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
puts(1,"") -- force console to exist
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
k32 = open_dll("kernel32.dll")
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
xGetStdHandle = define_cffi_func(k32,tGSH)
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
hConsole = c_func(xGetStdHandle,{STD_OUTPUT_HANDLE})
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
xSetConsoleOutputCP = define_cffi_func(k32,tSCOCP)
<!--</syntaxhighlight>-->
end if
Which can be used like this:
-- the following is equivalent to running "chcp 65001":
<!--<syntaxhighlight lang="phix">(phixonline)-->
res = c_func(xSetConsoleOutputCP,{CP_UTF8})
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
-- zero(false) means failure.
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">unicode_console</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
else -- LINUX
for i=1 to length(envset) do
<span style="color: #000080;font-style:italic;">-- pi, root, lambda, sigma, delta</span>
if match("UTF",upper(getenv(envset[i])))!=0 then
<span style="color: #008080;">constant</span> <span style="color: #000000;">prlsd</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"\u03C0\u221A\u03BB\u03A3\u25B3"</span>
res = true
exit
<span style="color: #008080;">if</span> <span style="color: #000000;">unicode_console</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">then</span>
end if
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">prlsd</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">else</span>
end if
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"unicode is not supported\n"</span><span style="color: #0000FF;">)</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function</lang>
<!--</syntaxhighlight>-->
That file has now been added to the standard distribution build files (0.8.0 and later, not yet uploaded)
Note that delta does not work on Windows (see talk page) but the others do, and all five work on linux and under pwa/p2js.
 
We can then use it like this:
<lang Phix>include builtins\unicode_console.e
 
-- pi, root, lambda, sigma, delta
constant prlsd = "\u03C0\u221A\u03BB\u03A3\u25B3"
 
if unicode_console() then
puts(1,prlsd&"\n")
else
puts(1,"unicode is not supported\n")
end if</lang>
Note that delta does not work on Windows (see talk page) but the others do, and all five work on linux.
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(if (sub? "UTF-8" (or (sys "LC_ALL") (sys "LC_CTYPE") (sys "LANG")))
(prinl (char (hex "25b3")))
(quit "UTF-8 capable terminal required") )</langsyntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight Pythonlang="python">import sys
 
if "UTF-8" in sys.stdout.encoding:
print("△")
else:
raise Exception("Terminal can't handle UTF-8")</langsyntaxhighlight>
 
=={{header|R}}==
<syntaxhighlight lang="r">if (any(grepl("UTF", toupper(Sys.getenv(c("LANG", "LC_ALL", "LC_CTYPE")))))) {
cat("Unicode is supported on this terminal and U+25B3 is : \u25b3\n")
} else {
cat("Unicode is not supported on this terminal.")
}</syntaxhighlight>
 
{{out}}
<pre>Unicode is supported on this terminal and U+25B3 is : △</pre>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(displayln
Line 479 ⟶ 531:
(or (getenv "LC_ALL") (getenv "LC_CTYPE") (getenv "LANG")))
"\u25b3" "No Unicode detected."))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" line>die "Terminal can't handle UTF-8"
unless first(*.defined, %*ENV<LC_ALL LC_CTYPE LANG>) ~~ /:i 'utf-8'/;
say "△";</syntaxhighlight>
{{out}}
<pre>△</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">#encoding: UTF-8 # superfluous in Ruby >1.9.3
 
if ENV.values_at("LC_ALL","LC_CTYPE","LANG").compact.first.include?("UTF-8")
Line 489 ⟶ 549:
raise "Terminal can't handle UTF-8"
end
</syntaxhighlight>
</lang>
 
=={{header|Scala}}==
Ad hoc in the REPL:
{{libheader|Scala}}<langsyntaxhighlight Scalalang="scala">scala> println(s"Unicode is supported on this terminal and U+25B3 is : \u25b3")
Unicode is supported on this terminal and U+25B3 is : △</langsyntaxhighlight>
 
=={{header|Seed7}}==
The Seed7 library [http://seed7.sourceforge.net/libraries/console.htm console.s7i] defines
[http://seed7.sourceforge.net/libraries/console.htm#STD_CONSOLE STD_CONSOLE], which can used directly,
or be assigned to [http://seed7.sourceforge.net/libraries/stdio.htm#OUT OUT] (which is the default
output file). STD_CONSOLE supports Unicode under Linux and Windows.
 
<syntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "environment.s7i";
include "console.s7i";
 
const proc: main is func
begin
if pos(lower(getenv("LANG")), "utf") <> 0 or
pos(lower(getenv("LC_ALL")), "utf") <> 0 or
pos(lower(getenv("LC_CTYPE")), "utf") <> 0 then
writeln(STD_CONSOLE, "Unicode is supported on this terminal and U+25B3 is: △");
else
writeln("Unicode is not supported on this terminal.");
end if;
end func;</syntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">if (/\bUTF-?8/i ~~ [ENV{"LC_ALL","LC_CTYPE","LANG"}]) {
say "△"
} else {
die "Terminal can't handle UTF-8.\n";
}</langsyntaxhighlight>
 
=={{header|Tcl}}==
Tcl configures the standard output channel to use the system encoding by default. The system encoding is formally the encoding for use when communicating with the OS (e.g., for filenames) but is virtually always correlated with the default terminal encoding.<langsyntaxhighlight lang="tcl"># Check if we're using one of the UTF or "unicode" encodings
if {[string match utf-* [encoding system]] || [string match *unicode* [encoding system]]} {
puts "\u25b3"
} else {
error "terminal does not support unicode (probably)"
}</langsyntaxhighlight>Note that idiomatic Tcl code would not perform such a check; it would just produce the output which would be translated as best as possible (possibly into the target encoding's placeholder character).
 
=={{header|UNIX Shell}}==
Line 518 ⟶ 599:
 
{{works with|Bourne Shell}}
<langsyntaxhighlight lang="bash">unicode_tty() {
# LC_ALL supersedes LC_CTYPE, which supersedes LANG.
# Set $1 to environment value.
Line 541 ⟶ 622:
echo "HW65001 This program requires a Unicode compatible terminal" >&2
exit 252 # Incompatible hardware
fi</langsyntaxhighlight>
 
The terminal might support UTF-8, but its fonts might not have every Unicode character. Unless they have U+25B3, the output will not look correct. Greek letters like U+25B3 tend to be common, but some fonts might not have Chinese characters (for example), and almost no fonts have dead scripts such as Cuneiform.
 
=={{header|Wren}}==
{{trans|C}}
As there is currently no way to obtain this information via Wren CLI, we instead embed a Wren script in a C application and ask the host program to get it for us.
<syntaxhighlight lang="wren">/* Terminal_control_Unicode_output.wren */
 
class C {
foreign static isUnicodeSupported
}
 
if (C.isUnicodeSupported) {
System.print("Unicode is supported on this terminal and U+25B3 is : \u25b3")
} else {
System.print("Unicode is not supported on this terminal.")
}</syntaxhighlight>
<br>
We now embed this Wren script in the following C program, compile and run it.
<syntaxhighlight lang="c">/* gcc Terminal_control_Unicode_output.c -o Terminal_control_Unicode_output -lwren -lm */
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "wren.h"
 
void C_isUnicodeSupported(WrenVM* vm) {
char *str = getenv("LANG");
bool us = false;
int i;
for (i = 0; str[i + 2] != 0; i++) {
if ((str[i] == 'u' && str[i + 1] == 't' && str[i + 2] == 'f') ||
(str[i] == 'U' && str[i + 1] == 'T' && str[i + 2] == 'F')) {
us = true;
break;
}
}
wrenSetSlotBool(vm, 0, us);
}
 
WrenForeignMethodFn bindForeignMethod(
WrenVM* vm,
const char* module,
const char* className,
bool isStatic,
const char* signature) {
if (strcmp(module, "main") == 0) {
if (strcmp(className, "C") == 0) {
if (isStatic && strcmp(signature, "isUnicodeSupported") == 0) {
return C_isUnicodeSupported;
}
}
}
return NULL;
}
 
static void writeFn(WrenVM* vm, const char* text) {
printf("%s", text);
}
 
void errorFn(WrenVM* vm, WrenErrorType errorType, const char* module, const int line, const char* msg) {
switch (errorType) {
case WREN_ERROR_COMPILE:
printf("[%s line %d] [Error] %s\n", module, line, msg);
break;
case WREN_ERROR_STACK_TRACE:
printf("[%s line %d] in %s\n", module, line, msg);
break;
case WREN_ERROR_RUNTIME:
printf("[Runtime Error] %s\n", msg);
break;
}
}
 
char *readFile(const char *fileName) {
FILE *f = fopen(fileName, "r");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
rewind(f);
char *script = malloc(fsize + 1);
fread(script, 1, fsize, f);
fclose(f);
script[fsize] = 0;
return script;
}
 
int main() {
WrenConfiguration config;
wrenInitConfiguration(&config);
config.writeFn = &writeFn;
config.errorFn = &errorFn;
config.bindForeignMethodFn = &bindForeignMethod;
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "Terminal_control_Unicode_output.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
switch (result) {
case WREN_RESULT_COMPILE_ERROR:
printf("Compile Error!\n");
break;
case WREN_RESULT_RUNTIME_ERROR:
printf("Runtime Error!\n");
break;
case WREN_RESULT_SUCCESS:
break;
}
wrenFreeVM(vm);
free(script);
return 0;
}</syntaxhighlight>
 
{{out}}
<pre>
Unicode is supported on this terminal and U+25B3 is : △
</pre>
 
=={{header|zkl}}==
This code works for Unix/Linux, Windows XP cmd terminals don't support UTF-8.
<langsyntaxhighlight lang="zkl">if(System.isUnix and T("LC_CTYPE","LC_LANG","LANG").apply(System.getenv)
.filter().filter("holds","UTF"))
println("This terminal supports UTF-8 (\U25B3;)");
else println("I have doubts about UTF-8 on this terminal.");</langsyntaxhighlight>
{{out}}
<pre>
Line 558 ⟶ 753:
=={{header|ZX Spectrum Basic}}==
 
<langsyntaxhighlight lang="zxbasic">10 REM There is no Unicode delta in ROM
20 REM So we first define a custom character
30 FOR l=0 TO 7
Line 568 ⟶ 763:
9500 REM data for our custom delta
9510 DATA 0,0,8,20,34,65,127,0
</syntaxhighlight>
</lang>
 
{{omit from|BASIC}}{{omit from|GUISS}}
{{omit from|Axe}}
{{omit from|BASIC}}
{{omit from|GUISS}}
9,476

edits