diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index 562085de..813049b1 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -22,6 +22,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import math + import TermTk.libbpytop as lbt from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.log import TTkLog @@ -338,6 +340,42 @@ class TTkCanvas: self.drawText(pos=(x+w-2,y+0),text=top, color=borderColor) self.drawText(pos=(x+w-2,y+1),text=center, color=borderColor) + def drawHChart(self, pos, values, zoom=1.0, color=TTkColor.RST): + x,y=pos + v1,v2 = values + t1,t2,b1,b2=0,0,0,0 + gu=TTkCfg.theme.graph_up + gd=TTkCfg.theme.graph_down + + if v1>0: t1 = v1*zoom + else: b1 = v1*zoom + if v2>0: t2 = v2*zoom + else: b2 = v2*zoom + ''' + loop 0 1 2 3 = range(0,1+maxt//4) + v1 13 |---|---|---|--| + v2 10 |---|---|-| + maxt 13 |---|---|---|--| + out 4,4 4,4 4,2 3,0 0,0 + o1 = 4 if v1-4 > i*4 else v1-i*4 + ''' + # Draw Top Chart + maxt = max(t1,t2) + for i in range(0,int(maxt//4)+1): + o1 = 4 if t1-4 > i*4 else max(0,int(t1-i*4)) + o2 = 4 if t2-4 > i*4 else max(0,int(t2-i*4)) + #TTkLog.debug(f"{v1,v2},{(t1//4),(t2//4)}, {(t1%4),(t2%4)}, {o1,o2}") + self._set(y-i,x, gu[o1][o2], color) + # Draw Bottom Chart + minb = min(b1,b2) + for i in range(int(minb//4),0): + o1 = 4 if -b1-4 > -i*4 else max(0,int(-b1+i*4)) + o2 = 4 if -b2-4 > -i*4 else max(0,int(-b2+i*4)) + ##TTkLog.debug(f"{v1,v2},{(t1//(t2//4)}, {(t1%4),(t2%4)}, {o1,o2}") + self._set(y-i,x, gd[o1][o2], color) + + + def execPaint(self, winw, winh): pass diff --git a/TermTk/TTkCore/cfg.py b/TermTk/TTkCore/cfg.py index 5161276d..365b4b5a 100644 --- a/TermTk/TTkCore/cfg.py +++ b/TermTk/TTkCore/cfg.py @@ -22,13 +22,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from TermTk.TTkCore.constant import TTkK class TTkCfg: - DEP_2: int = 0x02 - DEP_4: int = 0x04 - DEP_8: int = 0x08 - DEP_24: int = 0x18 + color_depth: int = TTkK.DEP_24 - color_depth: int = DEP_24 + maxFps = 35 scrollDelta = 5 theme = None diff --git a/TermTk/TTkCore/constant.py b/TermTk/TTkCore/constant.py index 10223e8b..ffae4a09 100644 --- a/TermTk/TTkCore/constant.py +++ b/TermTk/TTkCore/constant.py @@ -23,6 +23,12 @@ # SOFTWARE. class TTkConstant: + # Color Depth + DEP_2: int = 0x02 + DEP_4: int = 0x04 + DEP_8: int = 0x08 + DEP_24: int = 0x18 + # Focus Policies NoFocus = 0x0000 ClickFocus = 0x0001 diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index 6877f652..e8ad7f2b 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -99,8 +99,8 @@ class TTkHelper: if TTkHelper._rootCanvas is None: return # Build a list of buffers to be repainted - updateBuffers = [w for w in TTkHelper._updateBuffer] - updateWidgets = [w for w in TTkHelper._updateWidget] + updateBuffers = TTkHelper._updateBuffer.copy() + updateWidgets = TTkHelper._updateWidget.copy() # TTkLog.debug(f"{len(TTkHelper._updateBuffer)} {len(TTkHelper._updateWidget)}") for widget in TTkHelper._updateWidget: diff --git a/TermTk/TTkCore/timer.py b/TermTk/TTkCore/timer.py index 01ce4acc..662c415d 100644 --- a/TermTk/TTkCore/timer.py +++ b/TermTk/TTkCore/timer.py @@ -22,9 +22,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# This code is inspired by -# https://github.com/ceccopierangiolieugenio/pyCuT/blob/master/cupy/CuTCore/CuDebug.py - import threading, time from TermTk.TTkCore.constant import TTkK @@ -33,6 +30,7 @@ from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal class TTkTimer(threading.Thread): + _timers = [] __slots__ = ( 'timeout', '_timerEvent', '_delay', '_delayLock', '_quit', @@ -42,28 +40,33 @@ class TTkTimer(threading.Thread): self.timeout = pyTTkSignal() self._timerEvent = threading.Event() - self._quit = False + self._quit = threading.Event() self._stopTime = 0 self._delay=0 self._delayLock = threading.Lock() threading.Thread.__init__(self) + TTkTimer._timers.append(self) threading.Thread.start(self) + @staticmethod + def quitAll(): + for timer in TTkTimer._timers: + timer.quit() + def quit(self): - self._quit = True - self._delay = 0 + self._quit.set() self._timerEvent.set() def run(self): while self._timerEvent.wait(): self._timerEvent.clear() - if self._quit: break while self._delay > 0: # self._delayLock.acquire() delay = self._delay self._delay = 0 # self._delayLock.release() - time.sleep(delay) + if self._quit.wait(delay): + return self.timeout.emit() @pyTTkSlot(int) @@ -74,4 +77,5 @@ class TTkTimer(threading.Thread): @pyTTkSlot() def stop(self): + # TODO: Timer.stop() self._stopTime = time.time() diff --git a/TermTk/TTkCore/ttk.py b/TermTk/TTkCore/ttk.py index 26b66642..3ced19c0 100644 --- a/TermTk/TTkCore/ttk.py +++ b/TermTk/TTkCore/ttk.py @@ -21,6 +21,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. + import os import signal import time @@ -82,7 +83,7 @@ class TTk(TTkWidget): threading.Thread(target=self._input_thread, daemon=True).start() self._timer = TTkTimer() self._timer.timeout.connect(self._time_event) - self._timer.start(0.2) + self._timer.start(0.1) self.show() self.running = True @@ -119,7 +120,7 @@ class TTk(TTkWidget): pass elif evt is TTkK.TIME_EVENT: TTkHelper.paintAll() - self._timer.start(0.03) + self._timer.start(1/TTkCfg.maxFps) self._fps() pass elif evt is TTkK.SCREEN_EVENT: @@ -158,7 +159,7 @@ class TTk(TTkWidget): def quit(self): self.events.put(TTkK.QUIT_EVENT) - self._timer.quit() + TTkTimer.quitAll() self.running = False def _SIGSTOP(self, signum, frame): diff --git a/TermTk/TTkGui/theme.py b/TermTk/TTkGui/theme.py index 79df066c..49a1ea2c 100644 --- a/TermTk/TTkGui/theme.py +++ b/TermTk/TTkGui/theme.py @@ -140,6 +140,28 @@ class TTkTheme(): #16 17 '◀','▶' ) + ''' + bpytop style graph: + ⢠⢠ ⡇ ⣆⡇ ⢠ ⣰ ⢠ + ⢸⣀⣀⣠⣸⣸⡄ ⡄⣼ ⣀⡀ ⢠⣷⡀ ⣀⣰⣀⣿⣇⡀⢀⣸⡀⣆⣿⣆⣄⣼⣀⣀⣸ + ⣾⣿⣿⣿⣿⣿⣧⣧⣧⣤⣦⣦⣿⣿⣤⣿⣧⣧⣿⣿⣿⣷⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧ + ⢿⣿⣿⣿⣿⣿⡟⠟⠟⠋⠟⠏⡿⣿⠋⣿⡟⡟⢿⣿⡿⠿⡿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⡏ + ⢸⠉⠉⠉⢸⢹⠁ ⠃⠹ ⠁ ⠈⡿⠁ ⠈⠸⠉⣿⡏ ⠈⢹⠁⠏⣿⠏⠃⢻⠉ ⠸⠈⠁ + ⠈⠈ ⠇ ⠋⠇ ⠈ ⠘ ⠈ + ''' + graph_up = ( + (' ','⢀','⢠','⢰','⢸'), + ('⡀','⣀','⣠','⣰','⣸'), + ('⡄','⣄','⣤','⣴','⣼'), + ('⡆','⣆','⣦','⣶','⣾'), + ('⡇','⣇','⣧','⣷','⣿')) + graph_down=( + (' ','⠈','⠘','⠸','⢸'), + ('⠁','⠉','⠙','⠹','⢹'), + ('⠃','⠋','⠛','⠻','⢻'), + ('⠇','⠏','⠟','⠿','⢿'), + ('⡇','⡏','⡟','⡿','⣿')) + frameBorderColor = TTkColor.RST frameTitleColor = TTkColor.fg("#dddddd")+TTkColor.bg("#222222") diff --git a/TermTk/TTkWidgets/__init__.py b/TermTk/TTkWidgets/__init__.py index 0d225434..555502eb 100644 --- a/TermTk/TTkWidgets/__init__.py +++ b/TermTk/TTkWidgets/__init__.py @@ -19,3 +19,4 @@ from .tree import * from .treeview import * from .treewidget import * from .logviewer import * +from .graph import * diff --git a/TermTk/TTkWidgets/button.py b/TermTk/TTkWidgets/button.py index 1a6e6cd6..09204caf 100644 --- a/TermTk/TTkWidgets/button.py +++ b/TermTk/TTkWidgets/button.py @@ -75,13 +75,13 @@ class TTkButton(TTkWidget): self._canvas.drawText(pos=(1,y), color=textColor ,text=text) def mousePressEvent(self, evt): - TTkLog.debug(f"{self._text} Test Mouse {evt}") + # TTkLog.debug(f"{self._text} Test Mouse {evt}") self._pressed = True self.update() return True def mouseReleaseEvent(self, evt): - TTkLog.debug(f"{self._text} Test Mouse {evt}") + # TTkLog.debug(f"{self._text} Test Mouse {evt}") self._pressed = False self.update() self.clicked.emit() diff --git a/TermTk/TTkWidgets/graph.py b/TermTk/TTkWidgets/graph.py new file mode 100644 index 00000000..31295651 --- /dev/null +++ b/TermTk/TTkWidgets/graph.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2021 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# inspired by: +# https://grafana.com/docs/grafana/latest/panels/visualizations/graph-panel/ +# And of course: +# https://github.com/aristocratos/bpytop + +from TermTk.TTkCore.cfg import * +from TermTk.TTkCore.constant import TTkK +from TermTk.TTkCore.log import TTkLog +from TermTk.TTkWidgets.widget import TTkWidget +from TermTk.TTkTemplates.color import TColor + +class TTkGraph(TTkWidget, TColor): + __slots__ = ('_data', '_maxData', '_offset', '_direction') + def __init__(self, *args, **kwargs): + self._data = [] + self._offset = 0 + TTkWidget.__init__(self, *args, **kwargs) + TColor.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , 'TTkGraph' ) + self._maxData = kwargs.get('maxData', 0x1000) + self._direction = kwargs.get('direction', TTkK.RIGHT) + + def addValue(self, value): + self._data.append(value) + self.update() + + def paintEvent(self): + if not self._data: return + x=0 + y = self.height()//2 + w,h = self.size() + v1,v2 = 0,0 + i=0 + data = self._data[-w*2:] + zoom = 2*h/max(max(data),-min(data)) + for i in range(len(data)): + v2 = v1 + v1 = data[i] + if i%2==0: + if self._direction == TTkK.RIGHT: + self._canvas.drawHChart(pos=(x+i//2,y),values=(v2,v1), zoom=zoom, color=self.color.modParam(val=-y)) + else: + self._canvas.drawHChart(pos=(w-(x+i//2),y),values=(v1,v2), zoom=zoom, color=self.color.modParam(val=-y)) + if i%2==1: + if self._direction == TTkK.RIGHT: + self._canvas.drawHChart(pos=(x+i//2+1,y),values=(v1,0), zoom=zoom, color=self.color.modParam(val=-y)) + else: + self._canvas.drawHChart(pos=(w-(x+i//2+1),y),values=(0,v1), zoom=zoom, color=self.color.modParam(val=-y)) diff --git a/TermTk/TTkWidgets/treewidget.py b/TermTk/TTkWidgets/treewidget.py index 8dcf9351..28109634 100644 --- a/TermTk/TTkWidgets/treewidget.py +++ b/TermTk/TTkWidgets/treewidget.py @@ -129,7 +129,7 @@ class TTkTreeWidget(TTkTableView): raise TypeError("TTkTreeWidgetItem is required in TTkTreeWidget.addTopLevelItem(item)") if item.parent() is None: self._topLevelItems.addChild(item) - displayedItems = [i for i in item.data()] + displayedItems = item.data().copy() displayTreeItem = _TTkDisplayedTreeItem(text=displayedItems[0], id=0, depth=depth, treeWidgetItem=item) displayTreeItem._clicked.connect(self._controlClicked) displayedItems[0] = displayTreeItem diff --git a/TermTk/libbpytop/colors.py b/TermTk/libbpytop/colors.py index 6bb87038..87791b35 100644 --- a/TermTk/libbpytop/colors.py +++ b/TermTk/libbpytop/colors.py @@ -27,6 +27,7 @@ except Exception as e: exit(1) from TermTk.libbpytop.term import Term +from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.cfg import TTkCfg @@ -60,12 +61,12 @@ class Color: try: if len(hexa) == 3: c = int(hexa[1:], base=16) - if TTkCfg.color_depth is TTkCfg.DEP_24: + if TTkCfg.color_depth is TTkK.DEP_24: color = f'\033[{dint};2;{c};{c};{c}m' else: color = f'{Color.truecolor_to_256(rgb=(c, c, c), depth=depth)}' elif len(hexa) == 7: - if TTkCfg.color_depth is TTkCfg.DEP_24: + if TTkCfg.color_depth is TTkK.DEP_24: color = f'\033[{dint};2;{int(hexa[1:3], base=16)};{int(hexa[3:5], base=16)};{int(hexa[5:7], base=16)}m' else: color = f'{Color.truecolor_to_256(rgb=(int(hexa[1:3], base=16), int(hexa[3:5], base=16), int(hexa[5:7], base=16)), depth=depth)}' @@ -73,7 +74,7 @@ class Color: ttk.TTkLog.error(f'{e}') else: - if TTkCfg.color_depth is TTkCfg.DEP_24: + if TTkCfg.color_depth is TTkK.DEP_24: color = f'\033[{dint};2;{r};{g};{b}m' else: color = f'{Color.truecolor_to_256(rgb=(r, g, b), depth=depth)}' diff --git a/docs/TODO.md b/docs/TODO.md index c7dfc48c..f0c51ef5 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -117,9 +117,9 @@ - [ ] Events (Signal/Slots) - [ ] Themes #### Graph Widget - - [ ] Basic Implementation + - [x] Basic Implementation - [ ] Events (Signal/Slots) - - [ ] Themes + - [x] Themes #### Header Menu - [ ] Basic Implementation - [ ] Events (Signal/Slots) diff --git a/tests/showcase/graph.py b/tests/showcase/graph.py new file mode 100644 index 00000000..933c7882 --- /dev/null +++ b/tests/showcase/graph.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2021 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import sys, os, argparse, math, random + +sys.path.append(os.path.join(sys.path[0],'../..')) +import TermTk as ttk + +def demoGraph(root= None): + frame = ttk.TTkFrame(parent=root, border=False, layout=ttk.TTkGridLayout()) + graphWidget1 = ttk.TTkGraph(color=ttk.TTkColor.fg('#00dddd', modifier=ttk.TTkColorGradient(increment=-25))) + graphWidget2 = ttk.TTkGraph(direction=ttk.TTkK.LEFT, color=ttk.TTkColor.fg('#ff8800', modifier=ttk.TTkColorGradient(increment= 40))) + graphWidget3 = ttk.TTkGraph(color=ttk.TTkColor.fg('#dd00dd', modifier=ttk.TTkColorGradient(increment=-20))) + graphWidget4 = ttk.TTkGraph(color=ttk.TTkColor.fg('#00dd44', modifier=ttk.TTkColorGradient(increment=-30))) + frame.layout().addWidget(graphWidget1, 0,0) + frame.layout().addWidget(graphWidget2, 0,1) + frame.layout().addWidget(graphWidget3, 1,0) + frame.layout().addWidget(graphWidget4, 1,1) + class timerEvent(): + def __init__(self, w, type): + self.timer = ttk.TTkTimer() + self.val = 10 + self.switch = False + self.w = w + self.type = type + self.timer.timeout.connect(self.timerEvent) + self.timer.start(1) + @ttk.pyTTkSlot() + def timerEvent(self): + self.switch = not self.switch + if self.type == 1: # Simple sin + val = math.sin(self.val*math.pi/40)*4*10 + if self.type == 2: # Double sin + offset = 15 + if self.switch: val = math.sin(self.val*math.pi/40)*4*10 + else: val = math.sin((self.val+offset)*math.pi/40)*4*7 + if self.type == 3: # random + val = random.uniform(-40,+40) + if self.type == 4: # mix rand and sin + if self.switch: val = math.sin(self.val*math.pi/40)*4*10 + else: val = random.uniform(-40,+40) + self.val+=1 + self.w.addValue(val) + self.timer.start(0.1) + timerEvent(graphWidget1, 1) + timerEvent(graphWidget2, 2) + timerEvent(graphWidget3, 3) + timerEvent(graphWidget4, 4) + return frame + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-f', help='Full Screen', action='store_true') + args = parser.parse_args() + + ttk.TTkLog.use_default_file_logging() + + root = ttk.TTk() + if args.f: + rootGraph = root + root.setLayout(ttk.TTkGridLayout()) + else: + rootGraph = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Graph", border=True, layout=ttk.TTkGridLayout()) + demoGraph(rootGraph) + root.mainloop() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tests/test.showcase.001.py b/tests/test.showcase.001.py index e0bf0423..b18ae2fd 100755 --- a/tests/test.showcase.001.py +++ b/tests/test.showcase.001.py @@ -32,6 +32,7 @@ from showcase.layout import demoLayout from showcase.table import demoTable from showcase.tab import demoTab from showcase.tree import demoTree +from showcase.graph import demoGraph from showcase.splitter import demoSplitter from showcase.windows import demoWindows from showcase.formwidgets import demoFormWidgets @@ -42,6 +43,7 @@ def demoShowcase(root= None): tabWidget1.addTab(ttk.TTkTestWidget(border=True, title="Frame1.2"), " Label Test 1.2 ") tabWidget1.addTab(demoLayout(), " Layout Test ") tabWidget1.addTab(demoFormWidgets(), " Form Test ") + tabWidget1.addTab(demoGraph(), " Graph Test ") tabWidget1.addTab(demoTable(), " Table Test ") tabWidget1.addTab(demoTree(), " Tree Test ") tabWidget1.addTab(demoSplitter(), " Splitter Test ") @@ -61,7 +63,7 @@ def main(): root.setLayout(ttk.TTkGridLayout()) winTabbed1 = root else: - winTabbed1 = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Tab", border=True, layout=ttk.TTkGridLayout()) + winTabbed1 = ttk.TTkWindow(parent=root,pos=(0,0), size=(120,40), title="Test Tab", border=True, layout=ttk.TTkGridLayout()) demoShowcase(winTabbed1) root.mainloop() diff --git a/tests/test.ui.013.graph.py b/tests/test.ui.013.graph.py new file mode 100755 index 00000000..e6b3f453 --- /dev/null +++ b/tests/test.ui.013.graph.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 + +# MIT License +# +# Copyright (c) 2021 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import sys, os, argparse, math, random + +sys.path.append(os.path.join(sys.path[0],'..')) +import TermTk as ttk + +def demoGraph(root= None): + frame = ttk.TTkFrame(parent=root, border=False, layout=ttk.TTkGridLayout()) + graphWidget1 = ttk.TTkGraph(color=ttk.TTkColor.fg('#00dddd', modifier=ttk.TTkColorGradient(increment=-20))) + graphWidget2 = ttk.TTkGraph(direction=ttk.TTkK.LEFT, color=ttk.TTkColor.fg('#ffdd00', modifier=ttk.TTkColorGradient(increment= 10))) + graphWidget3 = ttk.TTkGraph(color=ttk.TTkColor.fg('#dd00dd', modifier=ttk.TTkColorGradient(increment=-10))) + graphWidget4 = ttk.TTkGraph(color=ttk.TTkColor.fg('#00dd44', modifier=ttk.TTkColorGradient(increment=-15))) + frame.layout().addWidget(graphWidget1, 0,0) + frame.layout().addWidget(graphWidget2, 0,1) + frame.layout().addWidget(graphWidget3, 1,0) + frame.layout().addWidget(graphWidget4, 1,1) + class timerEvent(): + def __init__(self, w, type): + self.timer = ttk.TTkTimer() + self.val = 10 + self.switch = False + self.w = w + self.type = type + self.timer.timeout.connect(self.timerEvent) + self.timer.start(1) + @ttk.pyTTkSlot() + def timerEvent(self): + self.switch = not self.switch + if self.type == 1: # Simple sin + val = math.sin(self.val*math.pi/40)*4*10 + if self.type == 2: # Double sin + offset = 15 + if self.switch: val = math.sin(self.val*math.pi/40)*4*10 + else: val = math.sin((self.val+offset)*math.pi/40)*4*7 + if self.type == 3: # random + val = random.uniform(-40,+40) + if self.type == 4: # mix rand and sin + if self.switch: val = math.sin(self.val*math.pi/40)*4*10 + else: val = random.uniform(-40,+40) + self.val+=1 + self.w.addValue(val) + self.timer.start(0.1) + timerEvent(graphWidget1, 1) + timerEvent(graphWidget2, 2) + timerEvent(graphWidget3, 3) + timerEvent(graphWidget4, 4) + return frame + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-f', help='Full Screen', action='store_true') + args = parser.parse_args() + + ttk.TTkLog.use_default_file_logging() + + root = ttk.TTk() + if args.f: + rootGraph = root + root.setLayout(ttk.TTkGridLayout()) + else: + rootGraph = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Graph", border=True, layout=ttk.TTkGridLayout()) + demoGraph(rootGraph) + root.mainloop() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tests/utf-8/utf-8.arrows.txt b/tests/utf-8/utf-8.arrows.txt new file mode 100644 index 00000000..53388fd3 --- /dev/null +++ b/tests/utf-8/utf-8.arrows.txt @@ -0,0 +1,258 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + +U+2190 ← e2 86 90 LEFTWARDS ARROW +U+2191 ↑ e2 86 91 UPWARDS ARROW +U+2192 → e2 86 92 RIGHTWARDS ARROW +U+2193 ↓ e2 86 93 DOWNWARDS ARROW +U+2194 ↔ e2 86 94 LEFT RIGHT ARROW +U+2195 ↕ e2 86 95 UP DOWN ARROW +U+2196 ↖ e2 86 96 NORTH WEST ARROW +U+2197 ↗ e2 86 97 NORTH EAST ARROW +U+2198 ↘ e2 86 98 SOUTH EAST ARROW +U+2199 ↙ e2 86 99 SOUTH WEST ARROW +U+219A ↚ e2 86 9a LEFTWARDS ARROW WITH STROKE +U+219B ↛ e2 86 9b RIGHTWARDS ARROW WITH STROKE +U+219C ↜ e2 86 9c LEFTWARDS WAVE ARROW +U+219D ↝ e2 86 9d RIGHTWARDS WAVE ARROW +U+219E ↞ e2 86 9e LEFTWARDS TWO HEADED ARROW +U+219F ↟ e2 86 9f UPWARDS TWO HEADED ARROW +U+21A0 ↠ e2 86 a0 RIGHTWARDS TWO HEADED ARROW +U+21A1 ↡ e2 86 a1 DOWNWARDS TWO HEADED ARROW +U+21A2 ↢ e2 86 a2 LEFTWARDS ARROW WITH TAIL +U+21A3 ↣ e2 86 a3 RIGHTWARDS ARROW WITH TAIL +U+21A4 ↤ e2 86 a4 LEFTWARDS ARROW FROM BAR +U+21A5 ↥ e2 86 a5 UPWARDS ARROW FROM BAR +U+21A6 ↦ e2 86 a6 RIGHTWARDS ARROW FROM BAR +U+21A7 ↧ e2 86 a7 DOWNWARDS ARROW FROM BAR +U+21A8 ↨ e2 86 a8 UP DOWN ARROW WITH BASE +U+21A9 ↩ e2 86 a9 LEFTWARDS ARROW WITH HOOK +U+21AA ↪ e2 86 aa RIGHTWARDS ARROW WITH HOOK +U+21AB ↫ e2 86 ab LEFTWARDS ARROW WITH LOOP +U+21AC ↬ e2 86 ac RIGHTWARDS ARROW WITH LOOP +U+21AD ↭ e2 86 ad LEFT RIGHT WAVE ARROW +U+21AE ↮ e2 86 ae LEFT RIGHT ARROW WITH STROKE +U+21AF ↯ e2 86 af DOWNWARDS ZIGZAG ARROW +U+21B0 ↰ e2 86 b0 UPWARDS ARROW WITH TIP LEFTWARDS +U+21B1 ↱ e2 86 b1 UPWARDS ARROW WITH TIP RIGHTWARDS +U+21B2 ↲ e2 86 b2 DOWNWARDS ARROW WITH TIP LEFTWARDS +U+21B3 ↳ e2 86 b3 DOWNWARDS ARROW WITH TIP RIGHTWARDS +U+21B4 ↴ e2 86 b4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS +U+21B5 ↵ e2 86 b5 DOWNWARDS ARROW WITH CORNER LEFTWARDS +U+21B6 ↶ e2 86 b6 ANTICLOCKWISE TOP SEMICIRCLE ARROW +U+21B7 ↷ e2 86 b7 CLOCKWISE TOP SEMICIRCLE ARROW +U+21B8 ↸ e2 86 b8 NORTH WEST ARROW TO LONG BAR +U+21B9 ↹ e2 86 b9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +U+21BA ↺ e2 86 ba ANTICLOCKWISE OPEN CIRCLE ARROW +U+21BB ↻ e2 86 bb CLOCKWISE OPEN CIRCLE ARROW +U+21BC ↼ e2 86 bc LEFTWARDS HARPOON WITH BARB UPWARDS +U+21BD ↽ e2 86 bd LEFTWARDS HARPOON WITH BARB DOWNWARDS +U+21BE ↾ e2 86 be UPWARDS HARPOON WITH BARB RIGHTWARDS +U+21BF ↿ e2 86 bf UPWARDS HARPOON WITH BARB LEFTWARDS +U+21C0 ⇀ e2 87 80 RIGHTWARDS HARPOON WITH BARB UPWARDS +U+21C1 ⇁ e2 87 81 RIGHTWARDS HARPOON WITH BARB DOWNWARDS +U+21C2 ⇂ e2 87 82 DOWNWARDS HARPOON WITH BARB RIGHTWARDS +U+21C3 ⇃ e2 87 83 DOWNWARDS HARPOON WITH BARB LEFTWARDS +U+21C4 ⇄ e2 87 84 RIGHTWARDS ARROW OVER LEFTWARDS ARROW +U+21C5 ⇅ e2 87 85 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +U+21C6 ⇆ e2 87 86 LEFTWARDS ARROW OVER RIGHTWARDS ARROW +U+21C7 ⇇ e2 87 87 LEFTWARDS PAIRED ARROWS +U+21C8 ⇈ e2 87 88 UPWARDS PAIRED ARROWS +U+21C9 ⇉ e2 87 89 RIGHTWARDS PAIRED ARROWS +U+21CA ⇊ e2 87 8a DOWNWARDS PAIRED ARROWS +U+21CB ⇋ e2 87 8b LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +U+21CC ⇌ e2 87 8c RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +U+21CD ⇍ e2 87 8d LEFTWARDS DOUBLE ARROW WITH STROKE +U+21CE ⇎ e2 87 8e LEFT RIGHT DOUBLE ARROW WITH STROKE +U+21CF ⇏ e2 87 8f RIGHTWARDS DOUBLE ARROW WITH STROKE +U+21D0 ⇐ e2 87 90 LEFTWARDS DOUBLE ARROW +U+21D1 ⇑ e2 87 91 UPWARDS DOUBLE ARROW +U+21D2 ⇒ e2 87 92 RIGHTWARDS DOUBLE ARROW +U+21D3 ⇓ e2 87 93 DOWNWARDS DOUBLE ARROW +U+21D4 ⇔ e2 87 94 LEFT RIGHT DOUBLE ARROW +U+21D5 ⇕ e2 87 95 UP DOWN DOUBLE ARROW +U+21D6 ⇖ e2 87 96 NORTH WEST DOUBLE ARROW +U+21D7 ⇗ e2 87 97 NORTH EAST DOUBLE ARROW +U+21D8 ⇘ e2 87 98 SOUTH EAST DOUBLE ARROW +U+21D9 ⇙ e2 87 99 SOUTH WEST DOUBLE ARROW +U+21DA ⇚ e2 87 9a LEFTWARDS TRIPLE ARROW +U+21DB ⇛ e2 87 9b RIGHTWARDS TRIPLE ARROW +U+21DC ⇜ e2 87 9c LEFTWARDS SQUIGGLE ARROW +U+21DD ⇝ e2 87 9d RIGHTWARDS SQUIGGLE ARROW +U+21DE ⇞ e2 87 9e UPWARDS ARROW WITH DOUBLE STROKE +U+21DF ⇟ e2 87 9f DOWNWARDS ARROW WITH DOUBLE STROKE +U+21E0 ⇠ e2 87 a0 LEFTWARDS DASHED ARROW +U+21E1 ⇡ e2 87 a1 UPWARDS DASHED ARROW +U+21E2 ⇢ e2 87 a2 RIGHTWARDS DASHED ARROW +U+21E3 ⇣ e2 87 a3 DOWNWARDS DASHED ARROW +U+21E4 ⇤ e2 87 a4 LEFTWARDS ARROW TO BAR +U+21E5 ⇥ e2 87 a5 RIGHTWARDS ARROW TO BAR +U+21E6 ⇦ e2 87 a6 LEFTWARDS WHITE ARROW +U+21E7 ⇧ e2 87 a7 UPWARDS WHITE ARROW +U+21E8 ⇨ e2 87 a8 RIGHTWARDS WHITE ARROW +U+21E9 ⇩ e2 87 a9 DOWNWARDS WHITE ARROW +U+21EA ⇪ e2 87 aa UPWARDS WHITE ARROW FROM BAR +U+21EB ⇫ e2 87 ab UPWARDS WHITE ARROW ON PEDESTAL +U+21EC ⇬ e2 87 ac UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +U+21ED ⇭ e2 87 ad UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +U+21EE ⇮ e2 87 ae UPWARDS WHITE DOUBLE ARROW +U+21EF ⇯ e2 87 af UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +U+21F0 ⇰ e2 87 b0 RIGHTWARDS WHITE ARROW FROM WALL +U+21F1 ⇱ e2 87 b1 NORTH WEST ARROW TO CORNER +U+21F2 ⇲ e2 87 b2 SOUTH EAST ARROW TO CORNER +U+21F3 ⇳ e2 87 b3 UP DOWN WHITE ARROW +U+21F4 ⇴ e2 87 b4 RIGHT ARROW WITH SMALL CIRCLE +U+21F5 ⇵ e2 87 b5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +U+21F6 ⇶ e2 87 b6 THREE RIGHTWARDS ARROWS +U+21F7 ⇷ e2 87 b7 LEFTWARDS ARROW WITH VERTICAL STROKE +U+21F8 ⇸ e2 87 b8 RIGHTWARDS ARROW WITH VERTICAL STROKE +U+21F9 ⇹ e2 87 b9 LEFT RIGHT ARROW WITH VERTICAL STROKE +U+21FA ⇺ e2 87 ba LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +U+21FB ⇻ e2 87 bb RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +U+21FC ⇼ e2 87 bc LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +U+21FD ⇽ e2 87 bd LEFTWARDS OPEN-HEADED ARROW +U+21FE ⇾ e2 87 be RIGHTWARDS OPEN-HEADED ARROW +U+21FF ⇿ e2 87 bf LEFT RIGHT OPEN-HEADED ARROW +U+2200 ∀ e2 88 80 FOR ALL +U+2201 ∁ e2 88 81 COMPLEMENT +U+2202 ∂ e2 88 82 PARTIAL DIFFERENTIAL +U+2203 ∃ e2 88 83 THERE EXISTS +U+2204 ∄ e2 88 84 THERE DOES NOT EXIST +U+2205 ∅ e2 88 85 EMPTY SET +U+2206 ∆ e2 88 86 INCREMENT +U+2207 ∇ e2 88 87 NABLA +U+2208 ∈ e2 88 88 ELEMENT OF +U+2209 ∉ e2 88 89 NOT AN ELEMENT OF +U+220A ∊ e2 88 8a SMALL ELEMENT OF +U+220B ∋ e2 88 8b CONTAINS AS MEMBER +U+220C ∌ e2 88 8c DOES NOT CONTAIN AS MEMBER +U+220D ∍ e2 88 8d SMALL CONTAINS AS MEMBER +U+220E ∎ e2 88 8e END OF PROOF +U+220F ∏ e2 88 8f N-ARY PRODUCT +U+2210 ∐ e2 88 90 N-ARY COPRODUCT +U+2211 ∑ e2 88 91 N-ARY SUMMATION +U+2212 − e2 88 92 MINUS SIGN +U+2213 ∓ e2 88 93 MINUS-OR-PLUS SIGN +U+2214 ∔ e2 88 94 DOT PLUS +U+2215 ∕ e2 88 95 DIVISION SLASH +U+2216 ∖ e2 88 96 SET MINUS +U+2217 ∗ e2 88 97 ASTERISK OPERATOR +U+2218 ∘ e2 88 98 RING OPERATOR +U+2219 ∙ e2 88 99 BULLET OPERATOR +U+221A √ e2 88 9a SQUARE ROOT +U+221B ∛ e2 88 9b CUBE ROOT +U+221C ∜ e2 88 9c FOURTH ROOT +U+221D ∝ e2 88 9d PROPORTIONAL TO +U+221E ∞ e2 88 9e INFINITY +U+221F ∟ e2 88 9f RIGHT ANGLE +U+2220 ∠ e2 88 a0 ANGLE +U+2221 ∡ e2 88 a1 MEASURED ANGLE +U+2222 ∢ e2 88 a2 SPHERICAL ANGLE +U+2223 ∣ e2 88 a3 DIVIDES +U+2224 ∤ e2 88 a4 DOES NOT DIVIDE +U+2225 ∥ e2 88 a5 PARALLEL TO +U+2226 ∦ e2 88 a6 NOT PARALLEL TO +U+2227 ∧ e2 88 a7 LOGICAL AND +U+2228 ∨ e2 88 a8 LOGICAL OR +U+2229 ∩ e2 88 a9 INTERSECTION +U+222A ∪ e2 88 aa UNION +U+222B ∫ e2 88 ab INTEGRAL +U+222C ∬ e2 88 ac DOUBLE INTEGRAL +U+222D ∭ e2 88 ad TRIPLE INTEGRAL +U+222E ∮ e2 88 ae CONTOUR INTEGRAL +U+222F ∯ e2 88 af SURFACE INTEGRAL +U+2230 ∰ e2 88 b0 VOLUME INTEGRAL +U+2231 ∱ e2 88 b1 CLOCKWISE INTEGRAL +U+2232 ∲ e2 88 b2 CLOCKWISE CONTOUR INTEGRAL +U+2233 ∳ e2 88 b3 ANTICLOCKWISE CONTOUR INTEGRAL +U+2234 ∴ e2 88 b4 THEREFORE +U+2235 ∵ e2 88 b5 BECAUSE +U+2236 ∶ e2 88 b6 RATIO +U+2237 ∷ e2 88 b7 PROPORTION +U+2238 ∸ e2 88 b8 DOT MINUS +U+2239 ∹ e2 88 b9 EXCESS +U+223A ∺ e2 88 ba GEOMETRIC PROPORTION +U+223B ∻ e2 88 bb HOMOTHETIC +U+223C ∼ e2 88 bc TILDE OPERATOR +U+223D ∽ e2 88 bd REVERSED TILDE +U+223E ∾ e2 88 be INVERTED LAZY S +U+223F ∿ e2 88 bf SINE WAVE +U+2240 ≀ e2 89 80 WREATH PRODUCT +U+2241 ≁ e2 89 81 NOT TILDE +U+2242 ≂ e2 89 82 MINUS TILDE +U+2243 ≃ e2 89 83 ASYMPTOTICALLY EQUAL TO +U+2244 ≄ e2 89 84 NOT ASYMPTOTICALLY EQUAL TO +U+2245 ≅ e2 89 85 APPROXIMATELY EQUAL TO +U+2246 ≆ e2 89 86 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +U+2247 ≇ e2 89 87 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +U+2248 ≈ e2 89 88 ALMOST EQUAL TO +U+2249 ≉ e2 89 89 NOT ALMOST EQUAL TO +U+224A ≊ e2 89 8a ALMOST EQUAL OR EQUAL TO +U+224B ≋ e2 89 8b TRIPLE TILDE +U+224C ≌ e2 89 8c ALL EQUAL TO +U+224D ≍ e2 89 8d EQUIVALENT TO +U+224E ≎ e2 89 8e GEOMETRICALLY EQUIVALENT TO +U+224F ≏ e2 89 8f DIFFERENCE BETWEEN +U+2250 ≐ e2 89 90 APPROACHES THE LIMIT +U+2251 ≑ e2 89 91 GEOMETRICALLY EQUAL TO +U+2252 ≒ e2 89 92 APPROXIMATELY EQUAL TO OR THE IMAGE OF +U+2253 ≓ e2 89 93 IMAGE OF OR APPROXIMATELY EQUAL TO +U+2254 ≔ e2 89 94 COLON EQUALS +U+2255 ≕ e2 89 95 EQUALS COLON +U+2256 ≖ e2 89 96 RING IN EQUAL TO +U+2257 ≗ e2 89 97 RING EQUAL TO +U+2258 ≘ e2 89 98 CORRESPONDS TO +U+2259 ≙ e2 89 99 ESTIMATES +U+225A ≚ e2 89 9a EQUIANGULAR TO +U+225B ≛ e2 89 9b STAR EQUALS +U+225C ≜ e2 89 9c DELTA EQUAL TO +U+225D ≝ e2 89 9d EQUAL TO BY DEFINITION +U+225E ≞ e2 89 9e MEASURED BY +U+225F ≟ e2 89 9f QUESTIONED EQUAL TO +U+2260 ≠ e2 89 a0 NOT EQUAL TO +U+2261 ≡ e2 89 a1 IDENTICAL TO +U+2262 ≢ e2 89 a2 NOT IDENTICAL TO +U+2263 ≣ e2 89 a3 STRICTLY EQUIVALENT TO +U+2264 ≤ e2 89 a4 LESS-THAN OR EQUAL TO +U+2265 ≥ e2 89 a5 GREATER-THAN OR EQUAL TO +U+2266 ≦ e2 89 a6 LESS-THAN OVER EQUAL TO +U+2267 ≧ e2 89 a7 GREATER-THAN OVER EQUAL TO +U+2268 ≨ e2 89 a8 LESS-THAN BUT NOT EQUAL TO +U+2269 ≩ e2 89 a9 GREATER-THAN BUT NOT EQUAL TO +U+226A ≪ e2 89 aa MUCH LESS-THAN +U+226B ≫ e2 89 ab MUCH GREATER-THAN +U+226C ≬ e2 89 ac BETWEEN +U+226D ≭ e2 89 ad NOT EQUIVALENT TO +U+226E ≮ e2 89 ae NOT LESS-THAN +U+226F ≯ e2 89 af NOT GREATER-THAN +U+2270 ≰ e2 89 b0 NEITHER LESS-THAN NOR EQUAL TO +U+2271 ≱ e2 89 b1 NEITHER GREATER-THAN NOR EQUAL TO +U+2272 ≲ e2 89 b2 LESS-THAN OR EQUIVALENT TO +U+2273 ≳ e2 89 b3 GREATER-THAN OR EQUIVALENT TO +U+2274 ≴ e2 89 b4 NEITHER LESS-THAN NOR EQUIVALENT TO +U+2275 ≵ e2 89 b5 NEITHER GREATER-THAN NOR EQUIVALENT TO +U+2276 ≶ e2 89 b6 LESS-THAN OR GREATER-THAN +U+2277 ≷ e2 89 b7 GREATER-THAN OR LESS-THAN +U+2278 ≸ e2 89 b8 NEITHER LESS-THAN NOR GREATER-THAN +U+2279 ≹ e2 89 b9 NEITHER GREATER-THAN NOR LESS-THAN +U+227A ≺ e2 89 ba PRECEDES +U+227B ≻ e2 89 bb SUCCEEDS +U+227C ≼ e2 89 bc PRECEDES OR EQUAL TO +U+227D ≽ e2 89 bd SUCCEEDS OR EQUAL TO +U+227E ≾ e2 89 be PRECEDES OR EQUIVALENT TO +U+227F ≿ e2 89 bf SUCCEEDS OR EQUIVALENT TO +U+2280 ⊀ e2 8a 80 DOES NOT PRECEDE +U+2281 ⊁ e2 8a 81 DOES NOT SUCCEED +U+2282 ⊂ e2 8a 82 SUBSET OF +U+2283 ⊃ e2 8a 83 SUPERSET OF +U+2284 ⊄ e2 8a 84 NOT A SUBSET OF +U+2285 ⊅ e2 8a 85 NOT A SUPERSET OF +U+2286 ⊆ e2 8a 86 SUBSET OF OR EQUAL TO +U+2287 ⊇ e2 8a 87 SUPERSET OF OR EQUAL TO +U+2288 ⊈ e2 8a 88 NEITHER A SUBSET OF NOR EQUAL TO +U+2289 ⊉ e2 8a 89 NEITHER A SUPERSET OF NOR EQUAL TO +U+228A ⊊ e2 8a 8a SUBSET OF WITH NOT EQUAL TO +U+228B ⊋ e2 8a 8b SUPERSET OF WITH NOT EQUAL TO +U+228C ⊌ e2 8a 8c MULTISET +U+228D ⊍ e2 8a 8d MULTISET MULTIPLICATION +U+228E ⊎ e2 8a 8e MULTISET UNION +U+228F ⊏ e2 8a 8f SQUARE IMAGE OF \ No newline at end of file diff --git a/tests/utf-8/utf-8.box.drawing.txt b/tests/utf-8/utf-8.box.drawing.txt index 184b60d9..02e265e6 100644 --- a/tests/utf-8/utf-8.box.drawing.txt +++ b/tests/utf-8/utf-8.box.drawing.txt @@ -1,3 +1,5 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + U+2500 ─ e2 94 80 BOX DRAWINGS LIGHT HORIZONTAL U+2501 ━ e2 94 81 BOX DRAWINGS HEAVY HORIZONTAL U+2502 │ e2 94 82 BOX DRAWINGS LIGHT VERTICAL diff --git a/tests/utf-8/utf-8.braille.txt b/tests/utf-8/utf-8.braille.txt new file mode 100644 index 00000000..b6249b1e --- /dev/null +++ b/tests/utf-8/utf-8.braille.txt @@ -0,0 +1,258 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + +U+2800 ⠀ e2 a0 80 BRAILLE PATTERN BLANK +U+2801 ⠁ e2 a0 81 BRAILLE PATTERN DOTS-1 +U+2802 ⠂ e2 a0 82 BRAILLE PATTERN DOTS-2 +U+2803 ⠃ e2 a0 83 BRAILLE PATTERN DOTS-12 +U+2804 ⠄ e2 a0 84 BRAILLE PATTERN DOTS-3 +U+2805 ⠅ e2 a0 85 BRAILLE PATTERN DOTS-13 +U+2806 ⠆ e2 a0 86 BRAILLE PATTERN DOTS-23 +U+2807 ⠇ e2 a0 87 BRAILLE PATTERN DOTS-123 +U+2808 ⠈ e2 a0 88 BRAILLE PATTERN DOTS-4 +U+2809 ⠉ e2 a0 89 BRAILLE PATTERN DOTS-14 +U+280A ⠊ e2 a0 8a BRAILLE PATTERN DOTS-24 +U+280B ⠋ e2 a0 8b BRAILLE PATTERN DOTS-124 +U+280C ⠌ e2 a0 8c BRAILLE PATTERN DOTS-34 +U+280D ⠍ e2 a0 8d BRAILLE PATTERN DOTS-134 +U+280E ⠎ e2 a0 8e BRAILLE PATTERN DOTS-234 +U+280F ⠏ e2 a0 8f BRAILLE PATTERN DOTS-1234 +U+2810 ⠐ e2 a0 90 BRAILLE PATTERN DOTS-5 +U+2811 ⠑ e2 a0 91 BRAILLE PATTERN DOTS-15 +U+2812 ⠒ e2 a0 92 BRAILLE PATTERN DOTS-25 +U+2813 ⠓ e2 a0 93 BRAILLE PATTERN DOTS-125 +U+2814 ⠔ e2 a0 94 BRAILLE PATTERN DOTS-35 +U+2815 ⠕ e2 a0 95 BRAILLE PATTERN DOTS-135 +U+2816 ⠖ e2 a0 96 BRAILLE PATTERN DOTS-235 +U+2817 ⠗ e2 a0 97 BRAILLE PATTERN DOTS-1235 +U+2818 ⠘ e2 a0 98 BRAILLE PATTERN DOTS-45 +U+2819 ⠙ e2 a0 99 BRAILLE PATTERN DOTS-145 +U+281A ⠚ e2 a0 9a BRAILLE PATTERN DOTS-245 +U+281B ⠛ e2 a0 9b BRAILLE PATTERN DOTS-1245 +U+281C ⠜ e2 a0 9c BRAILLE PATTERN DOTS-345 +U+281D ⠝ e2 a0 9d BRAILLE PATTERN DOTS-1345 +U+281E ⠞ e2 a0 9e BRAILLE PATTERN DOTS-2345 +U+281F ⠟ e2 a0 9f BRAILLE PATTERN DOTS-12345 +U+2820 ⠠ e2 a0 a0 BRAILLE PATTERN DOTS-6 +U+2821 ⠡ e2 a0 a1 BRAILLE PATTERN DOTS-16 +U+2822 ⠢ e2 a0 a2 BRAILLE PATTERN DOTS-26 +U+2823 ⠣ e2 a0 a3 BRAILLE PATTERN DOTS-126 +U+2824 ⠤ e2 a0 a4 BRAILLE PATTERN DOTS-36 +U+2825 ⠥ e2 a0 a5 BRAILLE PATTERN DOTS-136 +U+2826 ⠦ e2 a0 a6 BRAILLE PATTERN DOTS-236 +U+2827 ⠧ e2 a0 a7 BRAILLE PATTERN DOTS-1236 +U+2828 ⠨ e2 a0 a8 BRAILLE PATTERN DOTS-46 +U+2829 ⠩ e2 a0 a9 BRAILLE PATTERN DOTS-146 +U+282A ⠪ e2 a0 aa BRAILLE PATTERN DOTS-246 +U+282B ⠫ e2 a0 ab BRAILLE PATTERN DOTS-1246 +U+282C ⠬ e2 a0 ac BRAILLE PATTERN DOTS-346 +U+282D ⠭ e2 a0 ad BRAILLE PATTERN DOTS-1346 +U+282E ⠮ e2 a0 ae BRAILLE PATTERN DOTS-2346 +U+282F ⠯ e2 a0 af BRAILLE PATTERN DOTS-12346 +U+2830 ⠰ e2 a0 b0 BRAILLE PATTERN DOTS-56 +U+2831 ⠱ e2 a0 b1 BRAILLE PATTERN DOTS-156 +U+2832 ⠲ e2 a0 b2 BRAILLE PATTERN DOTS-256 +U+2833 ⠳ e2 a0 b3 BRAILLE PATTERN DOTS-1256 +U+2834 ⠴ e2 a0 b4 BRAILLE PATTERN DOTS-356 +U+2835 ⠵ e2 a0 b5 BRAILLE PATTERN DOTS-1356 +U+2836 ⠶ e2 a0 b6 BRAILLE PATTERN DOTS-2356 +U+2837 ⠷ e2 a0 b7 BRAILLE PATTERN DOTS-12356 +U+2838 ⠸ e2 a0 b8 BRAILLE PATTERN DOTS-456 +U+2839 ⠹ e2 a0 b9 BRAILLE PATTERN DOTS-1456 +U+283A ⠺ e2 a0 ba BRAILLE PATTERN DOTS-2456 +U+283B ⠻ e2 a0 bb BRAILLE PATTERN DOTS-12456 +U+283C ⠼ e2 a0 bc BRAILLE PATTERN DOTS-3456 +U+283D ⠽ e2 a0 bd BRAILLE PATTERN DOTS-13456 +U+283E ⠾ e2 a0 be BRAILLE PATTERN DOTS-23456 +U+283F ⠿ e2 a0 bf BRAILLE PATTERN DOTS-123456 +U+2840 ⡀ e2 a1 80 BRAILLE PATTERN DOTS-7 +U+2841 ⡁ e2 a1 81 BRAILLE PATTERN DOTS-17 +U+2842 ⡂ e2 a1 82 BRAILLE PATTERN DOTS-27 +U+2843 ⡃ e2 a1 83 BRAILLE PATTERN DOTS-127 +U+2844 ⡄ e2 a1 84 BRAILLE PATTERN DOTS-37 +U+2845 ⡅ e2 a1 85 BRAILLE PATTERN DOTS-137 +U+2846 ⡆ e2 a1 86 BRAILLE PATTERN DOTS-237 +U+2847 ⡇ e2 a1 87 BRAILLE PATTERN DOTS-1237 +U+2848 ⡈ e2 a1 88 BRAILLE PATTERN DOTS-47 +U+2849 ⡉ e2 a1 89 BRAILLE PATTERN DOTS-147 +U+284A ⡊ e2 a1 8a BRAILLE PATTERN DOTS-247 +U+284B ⡋ e2 a1 8b BRAILLE PATTERN DOTS-1247 +U+284C ⡌ e2 a1 8c BRAILLE PATTERN DOTS-347 +U+284D ⡍ e2 a1 8d BRAILLE PATTERN DOTS-1347 +U+284E ⡎ e2 a1 8e BRAILLE PATTERN DOTS-2347 +U+284F ⡏ e2 a1 8f BRAILLE PATTERN DOTS-12347 +U+2850 ⡐ e2 a1 90 BRAILLE PATTERN DOTS-57 +U+2851 ⡑ e2 a1 91 BRAILLE PATTERN DOTS-157 +U+2852 ⡒ e2 a1 92 BRAILLE PATTERN DOTS-257 +U+2853 ⡓ e2 a1 93 BRAILLE PATTERN DOTS-1257 +U+2854 ⡔ e2 a1 94 BRAILLE PATTERN DOTS-357 +U+2855 ⡕ e2 a1 95 BRAILLE PATTERN DOTS-1357 +U+2856 ⡖ e2 a1 96 BRAILLE PATTERN DOTS-2357 +U+2857 ⡗ e2 a1 97 BRAILLE PATTERN DOTS-12357 +U+2858 ⡘ e2 a1 98 BRAILLE PATTERN DOTS-457 +U+2859 ⡙ e2 a1 99 BRAILLE PATTERN DOTS-1457 +U+285A ⡚ e2 a1 9a BRAILLE PATTERN DOTS-2457 +U+285B ⡛ e2 a1 9b BRAILLE PATTERN DOTS-12457 +U+285C ⡜ e2 a1 9c BRAILLE PATTERN DOTS-3457 +U+285D ⡝ e2 a1 9d BRAILLE PATTERN DOTS-13457 +U+285E ⡞ e2 a1 9e BRAILLE PATTERN DOTS-23457 +U+285F ⡟ e2 a1 9f BRAILLE PATTERN DOTS-123457 +U+2860 ⡠ e2 a1 a0 BRAILLE PATTERN DOTS-67 +U+2861 ⡡ e2 a1 a1 BRAILLE PATTERN DOTS-167 +U+2862 ⡢ e2 a1 a2 BRAILLE PATTERN DOTS-267 +U+2863 ⡣ e2 a1 a3 BRAILLE PATTERN DOTS-1267 +U+2864 ⡤ e2 a1 a4 BRAILLE PATTERN DOTS-367 +U+2865 ⡥ e2 a1 a5 BRAILLE PATTERN DOTS-1367 +U+2866 ⡦ e2 a1 a6 BRAILLE PATTERN DOTS-2367 +U+2867 ⡧ e2 a1 a7 BRAILLE PATTERN DOTS-12367 +U+2868 ⡨ e2 a1 a8 BRAILLE PATTERN DOTS-467 +U+2869 ⡩ e2 a1 a9 BRAILLE PATTERN DOTS-1467 +U+286A ⡪ e2 a1 aa BRAILLE PATTERN DOTS-2467 +U+286B ⡫ e2 a1 ab BRAILLE PATTERN DOTS-12467 +U+286C ⡬ e2 a1 ac BRAILLE PATTERN DOTS-3467 +U+286D ⡭ e2 a1 ad BRAILLE PATTERN DOTS-13467 +U+286E ⡮ e2 a1 ae BRAILLE PATTERN DOTS-23467 +U+286F ⡯ e2 a1 af BRAILLE PATTERN DOTS-123467 +U+2870 ⡰ e2 a1 b0 BRAILLE PATTERN DOTS-567 +U+2871 ⡱ e2 a1 b1 BRAILLE PATTERN DOTS-1567 +U+2872 ⡲ e2 a1 b2 BRAILLE PATTERN DOTS-2567 +U+2873 ⡳ e2 a1 b3 BRAILLE PATTERN DOTS-12567 +U+2874 ⡴ e2 a1 b4 BRAILLE PATTERN DOTS-3567 +U+2875 ⡵ e2 a1 b5 BRAILLE PATTERN DOTS-13567 +U+2876 ⡶ e2 a1 b6 BRAILLE PATTERN DOTS-23567 +U+2877 ⡷ e2 a1 b7 BRAILLE PATTERN DOTS-123567 +U+2878 ⡸ e2 a1 b8 BRAILLE PATTERN DOTS-4567 +U+2879 ⡹ e2 a1 b9 BRAILLE PATTERN DOTS-14567 +U+287A ⡺ e2 a1 ba BRAILLE PATTERN DOTS-24567 +U+287B ⡻ e2 a1 bb BRAILLE PATTERN DOTS-124567 +U+287C ⡼ e2 a1 bc BRAILLE PATTERN DOTS-34567 +U+287D ⡽ e2 a1 bd BRAILLE PATTERN DOTS-134567 +U+287E ⡾ e2 a1 be BRAILLE PATTERN DOTS-234567 +U+287F ⡿ e2 a1 bf BRAILLE PATTERN DOTS-1234567 +U+2880 ⢀ e2 a2 80 BRAILLE PATTERN DOTS-8 +U+2881 ⢁ e2 a2 81 BRAILLE PATTERN DOTS-18 +U+2882 ⢂ e2 a2 82 BRAILLE PATTERN DOTS-28 +U+2883 ⢃ e2 a2 83 BRAILLE PATTERN DOTS-128 +U+2884 ⢄ e2 a2 84 BRAILLE PATTERN DOTS-38 +U+2885 ⢅ e2 a2 85 BRAILLE PATTERN DOTS-138 +U+2886 ⢆ e2 a2 86 BRAILLE PATTERN DOTS-238 +U+2887 ⢇ e2 a2 87 BRAILLE PATTERN DOTS-1238 +U+2888 ⢈ e2 a2 88 BRAILLE PATTERN DOTS-48 +U+2889 ⢉ e2 a2 89 BRAILLE PATTERN DOTS-148 +U+288A ⢊ e2 a2 8a BRAILLE PATTERN DOTS-248 +U+288B ⢋ e2 a2 8b BRAILLE PATTERN DOTS-1248 +U+288C ⢌ e2 a2 8c BRAILLE PATTERN DOTS-348 +U+288D ⢍ e2 a2 8d BRAILLE PATTERN DOTS-1348 +U+288E ⢎ e2 a2 8e BRAILLE PATTERN DOTS-2348 +U+288F ⢏ e2 a2 8f BRAILLE PATTERN DOTS-12348 +U+2890 ⢐ e2 a2 90 BRAILLE PATTERN DOTS-58 +U+2891 ⢑ e2 a2 91 BRAILLE PATTERN DOTS-158 +U+2892 ⢒ e2 a2 92 BRAILLE PATTERN DOTS-258 +U+2893 ⢓ e2 a2 93 BRAILLE PATTERN DOTS-1258 +U+2894 ⢔ e2 a2 94 BRAILLE PATTERN DOTS-358 +U+2895 ⢕ e2 a2 95 BRAILLE PATTERN DOTS-1358 +U+2896 ⢖ e2 a2 96 BRAILLE PATTERN DOTS-2358 +U+2897 ⢗ e2 a2 97 BRAILLE PATTERN DOTS-12358 +U+2898 ⢘ e2 a2 98 BRAILLE PATTERN DOTS-458 +U+2899 ⢙ e2 a2 99 BRAILLE PATTERN DOTS-1458 +U+289A ⢚ e2 a2 9a BRAILLE PATTERN DOTS-2458 +U+289B ⢛ e2 a2 9b BRAILLE PATTERN DOTS-12458 +U+289C ⢜ e2 a2 9c BRAILLE PATTERN DOTS-3458 +U+289D ⢝ e2 a2 9d BRAILLE PATTERN DOTS-13458 +U+289E ⢞ e2 a2 9e BRAILLE PATTERN DOTS-23458 +U+289F ⢟ e2 a2 9f BRAILLE PATTERN DOTS-123458 +U+28A0 ⢠ e2 a2 a0 BRAILLE PATTERN DOTS-68 +U+28A1 ⢡ e2 a2 a1 BRAILLE PATTERN DOTS-168 +U+28A2 ⢢ e2 a2 a2 BRAILLE PATTERN DOTS-268 +U+28A3 ⢣ e2 a2 a3 BRAILLE PATTERN DOTS-1268 +U+28A4 ⢤ e2 a2 a4 BRAILLE PATTERN DOTS-368 +U+28A5 ⢥ e2 a2 a5 BRAILLE PATTERN DOTS-1368 +U+28A6 ⢦ e2 a2 a6 BRAILLE PATTERN DOTS-2368 +U+28A7 ⢧ e2 a2 a7 BRAILLE PATTERN DOTS-12368 +U+28A8 ⢨ e2 a2 a8 BRAILLE PATTERN DOTS-468 +U+28A9 ⢩ e2 a2 a9 BRAILLE PATTERN DOTS-1468 +U+28AA ⢪ e2 a2 aa BRAILLE PATTERN DOTS-2468 +U+28AB ⢫ e2 a2 ab BRAILLE PATTERN DOTS-12468 +U+28AC ⢬ e2 a2 ac BRAILLE PATTERN DOTS-3468 +U+28AD ⢭ e2 a2 ad BRAILLE PATTERN DOTS-13468 +U+28AE ⢮ e2 a2 ae BRAILLE PATTERN DOTS-23468 +U+28AF ⢯ e2 a2 af BRAILLE PATTERN DOTS-123468 +U+28B0 ⢰ e2 a2 b0 BRAILLE PATTERN DOTS-568 +U+28B1 ⢱ e2 a2 b1 BRAILLE PATTERN DOTS-1568 +U+28B2 ⢲ e2 a2 b2 BRAILLE PATTERN DOTS-2568 +U+28B3 ⢳ e2 a2 b3 BRAILLE PATTERN DOTS-12568 +U+28B4 ⢴ e2 a2 b4 BRAILLE PATTERN DOTS-3568 +U+28B5 ⢵ e2 a2 b5 BRAILLE PATTERN DOTS-13568 +U+28B6 ⢶ e2 a2 b6 BRAILLE PATTERN DOTS-23568 +U+28B7 ⢷ e2 a2 b7 BRAILLE PATTERN DOTS-123568 +U+28B8 ⢸ e2 a2 b8 BRAILLE PATTERN DOTS-4568 +U+28B9 ⢹ e2 a2 b9 BRAILLE PATTERN DOTS-14568 +U+28BA ⢺ e2 a2 ba BRAILLE PATTERN DOTS-24568 +U+28BB ⢻ e2 a2 bb BRAILLE PATTERN DOTS-124568 +U+28BC ⢼ e2 a2 bc BRAILLE PATTERN DOTS-34568 +U+28BD ⢽ e2 a2 bd BRAILLE PATTERN DOTS-134568 +U+28BE ⢾ e2 a2 be BRAILLE PATTERN DOTS-234568 +U+28BF ⢿ e2 a2 bf BRAILLE PATTERN DOTS-1234568 +U+28C0 ⣀ e2 a3 80 BRAILLE PATTERN DOTS-78 +U+28C1 ⣁ e2 a3 81 BRAILLE PATTERN DOTS-178 +U+28C2 ⣂ e2 a3 82 BRAILLE PATTERN DOTS-278 +U+28C3 ⣃ e2 a3 83 BRAILLE PATTERN DOTS-1278 +U+28C4 ⣄ e2 a3 84 BRAILLE PATTERN DOTS-378 +U+28C5 ⣅ e2 a3 85 BRAILLE PATTERN DOTS-1378 +U+28C6 ⣆ e2 a3 86 BRAILLE PATTERN DOTS-2378 +U+28C7 ⣇ e2 a3 87 BRAILLE PATTERN DOTS-12378 +U+28C8 ⣈ e2 a3 88 BRAILLE PATTERN DOTS-478 +U+28C9 ⣉ e2 a3 89 BRAILLE PATTERN DOTS-1478 +U+28CA ⣊ e2 a3 8a BRAILLE PATTERN DOTS-2478 +U+28CB ⣋ e2 a3 8b BRAILLE PATTERN DOTS-12478 +U+28CC ⣌ e2 a3 8c BRAILLE PATTERN DOTS-3478 +U+28CD ⣍ e2 a3 8d BRAILLE PATTERN DOTS-13478 +U+28CE ⣎ e2 a3 8e BRAILLE PATTERN DOTS-23478 +U+28CF ⣏ e2 a3 8f BRAILLE PATTERN DOTS-123478 +U+28D0 ⣐ e2 a3 90 BRAILLE PATTERN DOTS-578 +U+28D1 ⣑ e2 a3 91 BRAILLE PATTERN DOTS-1578 +U+28D2 ⣒ e2 a3 92 BRAILLE PATTERN DOTS-2578 +U+28D3 ⣓ e2 a3 93 BRAILLE PATTERN DOTS-12578 +U+28D4 ⣔ e2 a3 94 BRAILLE PATTERN DOTS-3578 +U+28D5 ⣕ e2 a3 95 BRAILLE PATTERN DOTS-13578 +U+28D6 ⣖ e2 a3 96 BRAILLE PATTERN DOTS-23578 +U+28D7 ⣗ e2 a3 97 BRAILLE PATTERN DOTS-123578 +U+28D8 ⣘ e2 a3 98 BRAILLE PATTERN DOTS-4578 +U+28D9 ⣙ e2 a3 99 BRAILLE PATTERN DOTS-14578 +U+28DA ⣚ e2 a3 9a BRAILLE PATTERN DOTS-24578 +U+28DB ⣛ e2 a3 9b BRAILLE PATTERN DOTS-124578 +U+28DC ⣜ e2 a3 9c BRAILLE PATTERN DOTS-34578 +U+28DD ⣝ e2 a3 9d BRAILLE PATTERN DOTS-134578 +U+28DE ⣞ e2 a3 9e BRAILLE PATTERN DOTS-234578 +U+28DF ⣟ e2 a3 9f BRAILLE PATTERN DOTS-1234578 +U+28E0 ⣠ e2 a3 a0 BRAILLE PATTERN DOTS-678 +U+28E1 ⣡ e2 a3 a1 BRAILLE PATTERN DOTS-1678 +U+28E2 ⣢ e2 a3 a2 BRAILLE PATTERN DOTS-2678 +U+28E3 ⣣ e2 a3 a3 BRAILLE PATTERN DOTS-12678 +U+28E4 ⣤ e2 a3 a4 BRAILLE PATTERN DOTS-3678 +U+28E5 ⣥ e2 a3 a5 BRAILLE PATTERN DOTS-13678 +U+28E6 ⣦ e2 a3 a6 BRAILLE PATTERN DOTS-23678 +U+28E7 ⣧ e2 a3 a7 BRAILLE PATTERN DOTS-123678 +U+28E8 ⣨ e2 a3 a8 BRAILLE PATTERN DOTS-4678 +U+28E9 ⣩ e2 a3 a9 BRAILLE PATTERN DOTS-14678 +U+28EA ⣪ e2 a3 aa BRAILLE PATTERN DOTS-24678 +U+28EB ⣫ e2 a3 ab BRAILLE PATTERN DOTS-124678 +U+28EC ⣬ e2 a3 ac BRAILLE PATTERN DOTS-34678 +U+28ED ⣭ e2 a3 ad BRAILLE PATTERN DOTS-134678 +U+28EE ⣮ e2 a3 ae BRAILLE PATTERN DOTS-234678 +U+28EF ⣯ e2 a3 af BRAILLE PATTERN DOTS-1234678 +U+28F0 ⣰ e2 a3 b0 BRAILLE PATTERN DOTS-5678 +U+28F1 ⣱ e2 a3 b1 BRAILLE PATTERN DOTS-15678 +U+28F2 ⣲ e2 a3 b2 BRAILLE PATTERN DOTS-25678 +U+28F3 ⣳ e2 a3 b3 BRAILLE PATTERN DOTS-125678 +U+28F4 ⣴ e2 a3 b4 BRAILLE PATTERN DOTS-35678 +U+28F5 ⣵ e2 a3 b5 BRAILLE PATTERN DOTS-135678 +U+28F6 ⣶ e2 a3 b6 BRAILLE PATTERN DOTS-235678 +U+28F7 ⣷ e2 a3 b7 BRAILLE PATTERN DOTS-1235678 +U+28F8 ⣸ e2 a3 b8 BRAILLE PATTERN DOTS-45678 +U+28F9 ⣹ e2 a3 b9 BRAILLE PATTERN DOTS-145678 +U+28FA ⣺ e2 a3 ba BRAILLE PATTERN DOTS-245678 +U+28FB ⣻ e2 a3 bb BRAILLE PATTERN DOTS-1245678 +U+28FC ⣼ e2 a3 bc BRAILLE PATTERN DOTS-345678 +U+28FD ⣽ e2 a3 bd BRAILLE PATTERN DOTS-1345678 +U+28FE ⣾ e2 a3 be BRAILLE PATTERN DOTS-2345678 +U+28FF ⣿ e2 a3 bf BRAILLE PATTERN DOTS-12345678 \ No newline at end of file diff --git a/tests/utf-8/utf-8.diacritical.marks.for.symbols.txt b/tests/utf-8/utf-8.diacritical.marks.for.symbols.txt new file mode 100644 index 00000000..df5d7d59 --- /dev/null +++ b/tests/utf-8/utf-8.diacritical.marks.for.symbols.txt @@ -0,0 +1,258 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + +U+20D0 ⃐ 0xe2 0x83 0x90 COMBINING LEFT HARPOON ABOVE +U+20D1 ⃑ 0xe2 0x83 0x91 COMBINING RIGHT HARPOON ABOVE +U+20D2 ⃒ 0xe2 0x83 0x92 COMBINING LONG VERTICAL LINE OVERLAY +U+20D3 ⃓ 0xe2 0x83 0x93 COMBINING SHORT VERTICAL LINE OVERLAY +U+20D4 ⃔ 0xe2 0x83 0x94 COMBINING ANTICLOCKWISE ARROW ABOVE +U+20D5 ⃕ 0xe2 0x83 0x95 COMBINING CLOCKWISE ARROW ABOVE +U+20D6 ⃖ 0xe2 0x83 0x96 COMBINING LEFT ARROW ABOVE +U+20D7 ⃗ 0xe2 0x83 0x97 COMBINING RIGHT ARROW ABOVE +U+20D8 ⃘ 0xe2 0x83 0x98 COMBINING RING OVERLAY +U+20D9 ⃙ 0xe2 0x83 0x99 COMBINING CLOCKWISE RING OVERLAY +U+20DA ⃚ 0xe2 0x83 0x9a COMBINING ANTICLOCKWISE RING OVERLAY +U+20DB ⃛ 0xe2 0x83 0x9b COMBINING THREE DOTS ABOVE +U+20DC ⃜ 0xe2 0x83 0x9c COMBINING FOUR DOTS ABOVE +U+20DD ⃝ 0xe2 0x83 0x9d COMBINING ENCLOSING CIRCLE +U+20DE ⃞ 0xe2 0x83 0x9e COMBINING ENCLOSING SQUARE +U+20DF ⃟ 0xe2 0x83 0x9f COMBINING ENCLOSING DIAMOND +U+20E0 ⃠ 0xe2 0x83 0xa0 COMBINING ENCLOSING CIRCLE BACKSLASH +U+20E1 ⃡ 0xe2 0x83 0xa1 COMBINING LEFT RIGHT ARROW ABOVE +U+20E2 ⃢ 0xe2 0x83 0xa2 COMBINING ENCLOSING SCREEN +U+20E3 ⃣ 0xe2 0x83 0xa3 COMBINING ENCLOSING KEYCAP +U+20E4 ⃤ 0xe2 0x83 0xa4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE +U+20E5 ⃥ 0xe2 0x83 0xa5 COMBINING REVERSE SOLIDUS OVERLAY +U+20E6 ⃦ 0xe2 0x83 0xa6 COMBINING DOUBLE VERTICAL STROKE OVERLAY +U+20E7 ⃧ 0xe2 0x83 0xa7 COMBINING ANNUITY SYMBOL +U+20E8 ⃨ 0xe2 0x83 0xa8 COMBINING TRIPLE UNDERDOT +U+20E9 ⃩ 0xe2 0x83 0xa9 COMBINING WIDE BRIDGE ABOVE +U+20EA ⃪ 0xe2 0x83 0xaa COMBINING LEFTWARDS ARROW OVERLAY +U+20EB ⃫ 0xe2 0x83 0xab COMBINING LONG DOUBLE SOLIDUS OVERLAY +U+20EC ⃬ 0xe2 0x83 0xac COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS +U+20ED ⃭ 0xe2 0x83 0xad COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS +U+20EE ⃮ 0xe2 0x83 0xae COMBINING LEFT ARROW BELOW +U+20EF ⃯ 0xe2 0x83 0xaf COMBINING RIGHT ARROW BELOW +U+20F0 ⃰ 0xe2 0x83 0xb0 COMBINING ASTERISK ABOVE +U+20F1 ⃱ 0xe2 0x83 0xb1 +U+20F2 ⃲ 0xe2 0x83 0xb2 +U+20F3 ⃳ 0xe2 0x83 0xb3 +U+20F4 ⃴ 0xe2 0x83 0xb4 +U+20F5 ⃵ 0xe2 0x83 0xb5 +U+20F6 ⃶ 0xe2 0x83 0xb6 +U+20F7 ⃷ 0xe2 0x83 0xb7 +U+20F8 ⃸ 0xe2 0x83 0xb8 +U+20F9 ⃹ 0xe2 0x83 0xb9 +U+20FA ⃺ 0xe2 0x83 0xba +U+20FB ⃻ 0xe2 0x83 0xbb +U+20FC ⃼ 0xe2 0x83 0xbc +U+20FD ⃽ 0xe2 0x83 0xbd +U+20FE ⃾ 0xe2 0x83 0xbe +U+20FF ⃿ 0xe2 0x83 0xbf +U+2100 ℀ 0xe2 0x84 0x80 ACCOUNT OF +U+2101 ℁ 0xe2 0x84 0x81 ADDRESSED TO THE SUBJECT +U+2102 ℂ 0xe2 0x84 0x82 DOUBLE-STRUCK CAPITAL C +U+2103 ℃ 0xe2 0x84 0x83 DEGREE CELSIUS +U+2104 ℄ 0xe2 0x84 0x84 CENTRE LINE SYMBOL +U+2105 ℅ 0xe2 0x84 0x85 CARE OF +U+2106 ℆ 0xe2 0x84 0x86 CADA UNA +U+2107 ℇ 0xe2 0x84 0x87 EULER CONSTANT +U+2108 ℈ 0xe2 0x84 0x88 SCRUPLE +U+2109 ℉ 0xe2 0x84 0x89 DEGREE FAHRENHEIT +U+210A ℊ 0xe2 0x84 0x8a SCRIPT SMALL G +U+210B ℋ 0xe2 0x84 0x8b SCRIPT CAPITAL H +U+210C ℌ 0xe2 0x84 0x8c BLACK-LETTER CAPITAL H +U+210D ℍ 0xe2 0x84 0x8d DOUBLE-STRUCK CAPITAL H +U+210E ℎ 0xe2 0x84 0x8e PLANCK CONSTANT +U+210F ℏ 0xe2 0x84 0x8f PLANCK CONSTANT OVER TWO PI +U+2110 ℐ 0xe2 0x84 0x90 SCRIPT CAPITAL I +U+2111 ℑ 0xe2 0x84 0x91 BLACK-LETTER CAPITAL I +U+2112 ℒ 0xe2 0x84 0x92 SCRIPT CAPITAL L +U+2113 ℓ 0xe2 0x84 0x93 SCRIPT SMALL L +U+2114 ℔ 0xe2 0x84 0x94 L B BAR SYMBOL +U+2115 ℕ 0xe2 0x84 0x95 DOUBLE-STRUCK CAPITAL N +U+2116 № 0xe2 0x84 0x96 NUMERO SIGN +U+2117 ℗ 0xe2 0x84 0x97 SOUND RECORDING COPYRIGHT +U+2118 ℘ 0xe2 0x84 0x98 SCRIPT CAPITAL P +U+2119 ℙ 0xe2 0x84 0x99 DOUBLE-STRUCK CAPITAL P +U+211A ℚ 0xe2 0x84 0x9a DOUBLE-STRUCK CAPITAL Q +U+211B ℛ 0xe2 0x84 0x9b SCRIPT CAPITAL R +U+211C ℜ 0xe2 0x84 0x9c BLACK-LETTER CAPITAL R +U+211D ℝ 0xe2 0x84 0x9d DOUBLE-STRUCK CAPITAL R +U+211E ℞ 0xe2 0x84 0x9e PRESCRIPTION TAKE +U+211F ℟ 0xe2 0x84 0x9f RESPONSE +U+2120 ℠ 0xe2 0x84 0xa0 SERVICE MARK +U+2121 ℡ 0xe2 0x84 0xa1 TELEPHONE SIGN +U+2122 ™ 0xe2 0x84 0xa2 TRADE MARK SIGN +U+2123 ℣ 0xe2 0x84 0xa3 VERSICLE +U+2124 ℤ 0xe2 0x84 0xa4 DOUBLE-STRUCK CAPITAL Z +U+2125 ℥ 0xe2 0x84 0xa5 OUNCE SIGN +U+2126 Ω 0xe2 0x84 0xa6 OHM SIGN +U+2127 ℧ 0xe2 0x84 0xa7 INVERTED OHM SIGN +U+2128 ℨ 0xe2 0x84 0xa8 BLACK-LETTER CAPITAL Z +U+2129 ℩ 0xe2 0x84 0xa9 TURNED GREEK SMALL LETTER IOTA +U+212A K 0xe2 0x84 0xaa KELVIN SIGN +U+212B Å 0xe2 0x84 0xab ANGSTROM SIGN +U+212C ℬ 0xe2 0x84 0xac SCRIPT CAPITAL B +U+212D ℭ 0xe2 0x84 0xad BLACK-LETTER CAPITAL C +U+212E ℮ 0xe2 0x84 0xae ESTIMATED SYMBOL +U+212F ℯ 0xe2 0x84 0xaf SCRIPT SMALL E +U+2130 ℰ 0xe2 0x84 0xb0 SCRIPT CAPITAL E +U+2131 ℱ 0xe2 0x84 0xb1 SCRIPT CAPITAL F +U+2132 Ⅎ 0xe2 0x84 0xb2 TURNED CAPITAL F +U+2133 ℳ 0xe2 0x84 0xb3 SCRIPT CAPITAL M +U+2134 ℴ 0xe2 0x84 0xb4 SCRIPT SMALL O +U+2135 ℵ 0xe2 0x84 0xb5 ALEF SYMBOL +U+2136 ℶ 0xe2 0x84 0xb6 BET SYMBOL +U+2137 ℷ 0xe2 0x84 0xb7 GIMEL SYMBOL +U+2138 ℸ 0xe2 0x84 0xb8 DALET SYMBOL +U+2139 ℹ 0xe2 0x84 0xb9 INFORMATION SOURCE +U+213A ℺ 0xe2 0x84 0xba ROTATED CAPITAL Q +U+213B ℻ 0xe2 0x84 0xbb FACSIMILE SIGN +U+213C ℼ 0xe2 0x84 0xbc DOUBLE-STRUCK SMALL PI +U+213D ℽ 0xe2 0x84 0xbd DOUBLE-STRUCK SMALL GAMMA +U+213E ℾ 0xe2 0x84 0xbe DOUBLE-STRUCK CAPITAL GAMMA +U+213F ℿ 0xe2 0x84 0xbf DOUBLE-STRUCK CAPITAL PI +U+2140 ⅀ 0xe2 0x85 0x80 DOUBLE-STRUCK N-ARY SUMMATION +U+2141 ⅁ 0xe2 0x85 0x81 TURNED SANS-SERIF CAPITAL G +U+2142 ⅂ 0xe2 0x85 0x82 TURNED SANS-SERIF CAPITAL L +U+2143 ⅃ 0xe2 0x85 0x83 REVERSED SANS-SERIF CAPITAL L +U+2144 ⅄ 0xe2 0x85 0x84 TURNED SANS-SERIF CAPITAL Y +U+2145 ⅅ 0xe2 0x85 0x85 DOUBLE-STRUCK ITALIC CAPITAL D +U+2146 ⅆ 0xe2 0x85 0x86 DOUBLE-STRUCK ITALIC SMALL D +U+2147 ⅇ 0xe2 0x85 0x87 DOUBLE-STRUCK ITALIC SMALL E +U+2148 ⅈ 0xe2 0x85 0x88 DOUBLE-STRUCK ITALIC SMALL I +U+2149 ⅉ 0xe2 0x85 0x89 DOUBLE-STRUCK ITALIC SMALL J +U+214A ⅊ 0xe2 0x85 0x8a PROPERTY LINE +U+214B ⅋ 0xe2 0x85 0x8b TURNED AMPERSAND +U+214C ⅌ 0xe2 0x85 0x8c PER SIGN +U+214D ⅍ 0xe2 0x85 0x8d AKTIESELSKAB +U+214E ⅎ 0xe2 0x85 0x8e TURNED SMALL F +U+214F ⅏ 0xe2 0x85 0x8f SYMBOL FOR SAMARITAN SOURCE +U+2150 ⅐ 0xe2 0x85 0x90 VULGAR FRACTION ONE SEVENTH +U+2151 ⅑ 0xe2 0x85 0x91 VULGAR FRACTION ONE NINTH +U+2152 ⅒ 0xe2 0x85 0x92 VULGAR FRACTION ONE TENTH +U+2153 ⅓ 0xe2 0x85 0x93 VULGAR FRACTION ONE THIRD +U+2154 ⅔ 0xe2 0x85 0x94 VULGAR FRACTION TWO THIRDS +U+2155 ⅕ 0xe2 0x85 0x95 VULGAR FRACTION ONE FIFTH +U+2156 ⅖ 0xe2 0x85 0x96 VULGAR FRACTION TWO FIFTHS +U+2157 ⅗ 0xe2 0x85 0x97 VULGAR FRACTION THREE FIFTHS +U+2158 ⅘ 0xe2 0x85 0x98 VULGAR FRACTION FOUR FIFTHS +U+2159 ⅙ 0xe2 0x85 0x99 VULGAR FRACTION ONE SIXTH +U+215A ⅚ 0xe2 0x85 0x9a VULGAR FRACTION FIVE SIXTHS +U+215B ⅛ 0xe2 0x85 0x9b VULGAR FRACTION ONE EIGHTH +U+215C ⅜ 0xe2 0x85 0x9c VULGAR FRACTION THREE EIGHTHS +U+215D ⅝ 0xe2 0x85 0x9d VULGAR FRACTION FIVE EIGHTHS +U+215E ⅞ 0xe2 0x85 0x9e VULGAR FRACTION SEVEN EIGHTHS +U+215F ⅟ 0xe2 0x85 0x9f FRACTION NUMERATOR ONE +U+2160 Ⅰ 0xe2 0x85 0xa0 ROMAN NUMERAL ONE +U+2161 Ⅱ 0xe2 0x85 0xa1 ROMAN NUMERAL TWO +U+2162 Ⅲ 0xe2 0x85 0xa2 ROMAN NUMERAL THREE +U+2163 Ⅳ 0xe2 0x85 0xa3 ROMAN NUMERAL FOUR +U+2164 Ⅴ 0xe2 0x85 0xa4 ROMAN NUMERAL FIVE +U+2165 Ⅵ 0xe2 0x85 0xa5 ROMAN NUMERAL SIX +U+2166 Ⅶ 0xe2 0x85 0xa6 ROMAN NUMERAL SEVEN +U+2167 Ⅷ 0xe2 0x85 0xa7 ROMAN NUMERAL EIGHT +U+2168 Ⅸ 0xe2 0x85 0xa8 ROMAN NUMERAL NINE +U+2169 Ⅹ 0xe2 0x85 0xa9 ROMAN NUMERAL TEN +U+216A Ⅺ 0xe2 0x85 0xaa ROMAN NUMERAL ELEVEN +U+216B Ⅻ 0xe2 0x85 0xab ROMAN NUMERAL TWELVE +U+216C Ⅼ 0xe2 0x85 0xac ROMAN NUMERAL FIFTY +U+216D Ⅽ 0xe2 0x85 0xad ROMAN NUMERAL ONE HUNDRED +U+216E Ⅾ 0xe2 0x85 0xae ROMAN NUMERAL FIVE HUNDRED +U+216F Ⅿ 0xe2 0x85 0xaf ROMAN NUMERAL ONE THOUSAND +U+2170 ⅰ 0xe2 0x85 0xb0 SMALL ROMAN NUMERAL ONE +U+2171 ⅱ 0xe2 0x85 0xb1 SMALL ROMAN NUMERAL TWO +U+2172 ⅲ 0xe2 0x85 0xb2 SMALL ROMAN NUMERAL THREE +U+2173 ⅳ 0xe2 0x85 0xb3 SMALL ROMAN NUMERAL FOUR +U+2174 ⅴ 0xe2 0x85 0xb4 SMALL ROMAN NUMERAL FIVE +U+2175 ⅵ 0xe2 0x85 0xb5 SMALL ROMAN NUMERAL SIX +U+2176 ⅶ 0xe2 0x85 0xb6 SMALL ROMAN NUMERAL SEVEN +U+2177 ⅷ 0xe2 0x85 0xb7 SMALL ROMAN NUMERAL EIGHT +U+2178 ⅸ 0xe2 0x85 0xb8 SMALL ROMAN NUMERAL NINE +U+2179 ⅹ 0xe2 0x85 0xb9 SMALL ROMAN NUMERAL TEN +U+217A ⅺ 0xe2 0x85 0xba SMALL ROMAN NUMERAL ELEVEN +U+217B ⅻ 0xe2 0x85 0xbb SMALL ROMAN NUMERAL TWELVE +U+217C ⅼ 0xe2 0x85 0xbc SMALL ROMAN NUMERAL FIFTY +U+217D ⅽ 0xe2 0x85 0xbd SMALL ROMAN NUMERAL ONE HUNDRED +U+217E ⅾ 0xe2 0x85 0xbe SMALL ROMAN NUMERAL FIVE HUNDRED +U+217F ⅿ 0xe2 0x85 0xbf SMALL ROMAN NUMERAL ONE THOUSAND +U+2180 ↀ 0xe2 0x86 0x80 ROMAN NUMERAL ONE THOUSAND C D +U+2181 ↁ 0xe2 0x86 0x81 ROMAN NUMERAL FIVE THOUSAND +U+2182 ↂ 0xe2 0x86 0x82 ROMAN NUMERAL TEN THOUSAND +U+2183 Ↄ 0xe2 0x86 0x83 ROMAN NUMERAL REVERSED ONE HUNDRED +U+2184 ↄ 0xe2 0x86 0x84 LATIN SMALL LETTER REVERSED C +U+2185 ↅ 0xe2 0x86 0x85 ROMAN NUMERAL SIX LATE FORM +U+2186 ↆ 0xe2 0x86 0x86 ROMAN NUMERAL FIFTY EARLY FORM +U+2187 ↇ 0xe2 0x86 0x87 ROMAN NUMERAL FIFTY THOUSAND +U+2188 ↈ 0xe2 0x86 0x88 ROMAN NUMERAL ONE HUNDRED THOUSAND +U+2189 ↉ 0xe2 0x86 0x89 VULGAR FRACTION ZERO THIRDS +U+218A ↊ 0xe2 0x86 0x8a TURNED DIGIT TWO +U+218B ↋ 0xe2 0x86 0x8b TURNED DIGIT THREE +U+218C ↌ 0xe2 0x86 0x8c +U+218D ↍ 0xe2 0x86 0x8d +U+218E ↎ 0xe2 0x86 0x8e +U+218F ↏ 0xe2 0x86 0x8f +U+2190 ← 0xe2 0x86 0x90 LEFTWARDS ARROW +U+2191 ↑ 0xe2 0x86 0x91 UPWARDS ARROW +U+2192 → 0xe2 0x86 0x92 RIGHTWARDS ARROW +U+2193 ↓ 0xe2 0x86 0x93 DOWNWARDS ARROW +U+2194 ↔ 0xe2 0x86 0x94 LEFT RIGHT ARROW +U+2195 ↕ 0xe2 0x86 0x95 UP DOWN ARROW +U+2196 ↖ 0xe2 0x86 0x96 NORTH WEST ARROW +U+2197 ↗ 0xe2 0x86 0x97 NORTH EAST ARROW +U+2198 ↘ 0xe2 0x86 0x98 SOUTH EAST ARROW +U+2199 ↙ 0xe2 0x86 0x99 SOUTH WEST ARROW +U+219A ↚ 0xe2 0x86 0x9a LEFTWARDS ARROW WITH STROKE +U+219B ↛ 0xe2 0x86 0x9b RIGHTWARDS ARROW WITH STROKE +U+219C ↜ 0xe2 0x86 0x9c LEFTWARDS WAVE ARROW +U+219D ↝ 0xe2 0x86 0x9d RIGHTWARDS WAVE ARROW +U+219E ↞ 0xe2 0x86 0x9e LEFTWARDS TWO HEADED ARROW +U+219F ↟ 0xe2 0x86 0x9f UPWARDS TWO HEADED ARROW +U+21A0 ↠ 0xe2 0x86 0xa0 RIGHTWARDS TWO HEADED ARROW +U+21A1 ↡ 0xe2 0x86 0xa1 DOWNWARDS TWO HEADED ARROW +U+21A2 ↢ 0xe2 0x86 0xa2 LEFTWARDS ARROW WITH TAIL +U+21A3 ↣ 0xe2 0x86 0xa3 RIGHTWARDS ARROW WITH TAIL +U+21A4 ↤ 0xe2 0x86 0xa4 LEFTWARDS ARROW FROM BAR +U+21A5 ↥ 0xe2 0x86 0xa5 UPWARDS ARROW FROM BAR +U+21A6 ↦ 0xe2 0x86 0xa6 RIGHTWARDS ARROW FROM BAR +U+21A7 ↧ 0xe2 0x86 0xa7 DOWNWARDS ARROW FROM BAR +U+21A8 ↨ 0xe2 0x86 0xa8 UP DOWN ARROW WITH BASE +U+21A9 ↩ 0xe2 0x86 0xa9 LEFTWARDS ARROW WITH HOOK +U+21AA ↪ 0xe2 0x86 0xaa RIGHTWARDS ARROW WITH HOOK +U+21AB ↫ 0xe2 0x86 0xab LEFTWARDS ARROW WITH LOOP +U+21AC ↬ 0xe2 0x86 0xac RIGHTWARDS ARROW WITH LOOP +U+21AD ↭ 0xe2 0x86 0xad LEFT RIGHT WAVE ARROW +U+21AE ↮ 0xe2 0x86 0xae LEFT RIGHT ARROW WITH STROKE +U+21AF ↯ 0xe2 0x86 0xaf DOWNWARDS ZIGZAG ARROW +U+21B0 ↰ 0xe2 0x86 0xb0 UPWARDS ARROW WITH TIP LEFTWARDS +U+21B1 ↱ 0xe2 0x86 0xb1 UPWARDS ARROW WITH TIP RIGHTWARDS +U+21B2 ↲ 0xe2 0x86 0xb2 DOWNWARDS ARROW WITH TIP LEFTWARDS +U+21B3 ↳ 0xe2 0x86 0xb3 DOWNWARDS ARROW WITH TIP RIGHTWARDS +U+21B4 ↴ 0xe2 0x86 0xb4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS +U+21B5 ↵ 0xe2 0x86 0xb5 DOWNWARDS ARROW WITH CORNER LEFTWARDS +U+21B6 ↶ 0xe2 0x86 0xb6 ANTICLOCKWISE TOP SEMICIRCLE ARROW +U+21B7 ↷ 0xe2 0x86 0xb7 CLOCKWISE TOP SEMICIRCLE ARROW +U+21B8 ↸ 0xe2 0x86 0xb8 NORTH WEST ARROW TO LONG BAR +U+21B9 ↹ 0xe2 0x86 0xb9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +U+21BA ↺ 0xe2 0x86 0xba ANTICLOCKWISE OPEN CIRCLE ARROW +U+21BB ↻ 0xe2 0x86 0xbb CLOCKWISE OPEN CIRCLE ARROW +U+21BC ↼ 0xe2 0x86 0xbc LEFTWARDS HARPOON WITH BARB UPWARDS +U+21BD ↽ 0xe2 0x86 0xbd LEFTWARDS HARPOON WITH BARB DOWNWARDS +U+21BE ↾ 0xe2 0x86 0xbe UPWARDS HARPOON WITH BARB RIGHTWARDS +U+21BF ↿ 0xe2 0x86 0xbf UPWARDS HARPOON WITH BARB LEFTWARDS +U+21C0 ⇀ 0xe2 0x87 0x80 RIGHTWARDS HARPOON WITH BARB UPWARDS +U+21C1 ⇁ 0xe2 0x87 0x81 RIGHTWARDS HARPOON WITH BARB DOWNWARDS +U+21C2 ⇂ 0xe2 0x87 0x82 DOWNWARDS HARPOON WITH BARB RIGHTWARDS +U+21C3 ⇃ 0xe2 0x87 0x83 DOWNWARDS HARPOON WITH BARB LEFTWARDS +U+21C4 ⇄ 0xe2 0x87 0x84 RIGHTWARDS ARROW OVER LEFTWARDS ARROW +U+21C5 ⇅ 0xe2 0x87 0x85 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +U+21C6 ⇆ 0xe2 0x87 0x86 LEFTWARDS ARROW OVER RIGHTWARDS ARROW +U+21C7 ⇇ 0xe2 0x87 0x87 LEFTWARDS PAIRED ARROWS +U+21C8 ⇈ 0xe2 0x87 0x88 UPWARDS PAIRED ARROWS +U+21C9 ⇉ 0xe2 0x87 0x89 RIGHTWARDS PAIRED ARROWS +U+21CA ⇊ 0xe2 0x87 0x8a DOWNWARDS PAIRED ARROWS +U+21CB ⇋ 0xe2 0x87 0x8b LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +U+21CC ⇌ 0xe2 0x87 0x8c RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +U+21CD ⇍ 0xe2 0x87 0x8d LEFTWARDS DOUBLE ARROW WITH STROKE +U+21CE ⇎ 0xe2 0x87 0x8e LEFT RIGHT DOUBLE ARROW WITH STROKE +U+21CF ⇏ 0xe2 0x87 0x8f RIGHTWARDS DOUBLE ARROW WITH STROKE \ No newline at end of file diff --git a/tests/utf-8/utf-8.dingbats.txt b/tests/utf-8/utf-8.dingbats.txt new file mode 100644 index 00000000..e0beb199 --- /dev/null +++ b/tests/utf-8/utf-8.dingbats.txt @@ -0,0 +1,258 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + +U+2700 ✀ e2 9c 80 BLACK SAFETY SCISSORS +U+2701 ✁ e2 9c 81 UPPER BLADE SCISSORS +U+2702 ✂ e2 9c 82 BLACK SCISSORS +U+2703 ✃ e2 9c 83 LOWER BLADE SCISSORS +U+2704 ✄ e2 9c 84 WHITE SCISSORS +U+2705 ✅ e2 9c 85 WHITE HEAVY CHECK MARK +U+2706 ✆ e2 9c 86 TELEPHONE LOCATION SIGN +U+2707 ✇ e2 9c 87 TAPE DRIVE +U+2708 ✈ e2 9c 88 AIRPLANE +U+2709 ✉ e2 9c 89 ENVELOPE +U+270A ✊ e2 9c 8a RAISED FIST +U+270B ✋ e2 9c 8b RAISED HAND +U+270C ✌ e2 9c 8c VICTORY HAND +U+270D ✍ e2 9c 8d WRITING HAND +U+270E ✎ e2 9c 8e LOWER RIGHT PENCIL +U+270F ✏ e2 9c 8f PENCIL +U+2710 ✐ e2 9c 90 UPPER RIGHT PENCIL +U+2711 ✑ e2 9c 91 WHITE NIB +U+2712 ✒ e2 9c 92 BLACK NIB +U+2713 ✓ e2 9c 93 CHECK MARK +U+2714 ✔ e2 9c 94 HEAVY CHECK MARK +U+2715 ✕ e2 9c 95 MULTIPLICATION X +U+2716 ✖ e2 9c 96 HEAVY MULTIPLICATION X +U+2717 ✗ e2 9c 97 BALLOT X +U+2718 ✘ e2 9c 98 HEAVY BALLOT X +U+2719 ✙ e2 9c 99 OUTLINED GREEK CROSS +U+271A ✚ e2 9c 9a HEAVY GREEK CROSS +U+271B ✛ e2 9c 9b OPEN CENTRE CROSS +U+271C ✜ e2 9c 9c HEAVY OPEN CENTRE CROSS +U+271D ✝ e2 9c 9d LATIN CROSS +U+271E ✞ e2 9c 9e SHADOWED WHITE LATIN CROSS +U+271F ✟ e2 9c 9f OUTLINED LATIN CROSS +U+2720 ✠ e2 9c a0 MALTESE CROSS +U+2721 ✡ e2 9c a1 STAR OF DAVID +U+2722 ✢ e2 9c a2 FOUR TEARDROP-SPOKED ASTERISK +U+2723 ✣ e2 9c a3 FOUR BALLOON-SPOKED ASTERISK +U+2724 ✤ e2 9c a4 HEAVY FOUR BALLOON-SPOKED ASTERISK +U+2725 ✥ e2 9c a5 FOUR CLUB-SPOKED ASTERISK +U+2726 ✦ e2 9c a6 BLACK FOUR POINTED STAR +U+2727 ✧ e2 9c a7 WHITE FOUR POINTED STAR +U+2728 ✨ e2 9c a8 SPARKLES +U+2729 ✩ e2 9c a9 STRESS OUTLINED WHITE STAR +U+272A ✪ e2 9c aa CIRCLED WHITE STAR +U+272B ✫ e2 9c ab OPEN CENTRE BLACK STAR +U+272C ✬ e2 9c ac BLACK CENTRE WHITE STAR +U+272D ✭ e2 9c ad OUTLINED BLACK STAR +U+272E ✮ e2 9c ae HEAVY OUTLINED BLACK STAR +U+272F ✯ e2 9c af PINWHEEL STAR +U+2730 ✰ e2 9c b0 SHADOWED WHITE STAR +U+2731 ✱ e2 9c b1 HEAVY ASTERISK +U+2732 ✲ e2 9c b2 OPEN CENTRE ASTERISK +U+2733 ✳ e2 9c b3 EIGHT SPOKED ASTERISK +U+2734 ✴ e2 9c b4 EIGHT POINTED BLACK STAR +U+2735 ✵ e2 9c b5 EIGHT POINTED PINWHEEL STAR +U+2736 ✶ e2 9c b6 SIX POINTED BLACK STAR +U+2737 ✷ e2 9c b7 EIGHT POINTED RECTILINEAR BLACK STAR +U+2738 ✸ e2 9c b8 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +U+2739 ✹ e2 9c b9 TWELVE POINTED BLACK STAR +U+273A ✺ e2 9c ba SIXTEEN POINTED ASTERISK +U+273B ✻ e2 9c bb TEARDROP-SPOKED ASTERISK +U+273C ✼ e2 9c bc OPEN CENTRE TEARDROP-SPOKED ASTERISK +U+273D ✽ e2 9c bd HEAVY TEARDROP-SPOKED ASTERISK +U+273E ✾ e2 9c be SIX PETALLED BLACK AND WHITE FLORETTE +U+273F ✿ e2 9c bf BLACK FLORETTE +U+2740 ❀ e2 9d 80 WHITE FLORETTE +U+2741 ❁ e2 9d 81 EIGHT PETALLED OUTLINED BLACK FLORETTE +U+2742 ❂ e2 9d 82 CIRCLED OPEN CENTRE EIGHT POINTED STAR +U+2743 ❃ e2 9d 83 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +U+2744 ❄ e2 9d 84 SNOWFLAKE +U+2745 ❅ e2 9d 85 TIGHT TRIFOLIATE SNOWFLAKE +U+2746 ❆ e2 9d 86 HEAVY CHEVRON SNOWFLAKE +U+2747 ❇ e2 9d 87 SPARKLE +U+2748 ❈ e2 9d 88 HEAVY SPARKLE +U+2749 ❉ e2 9d 89 BALLOON-SPOKED ASTERISK +U+274A ❊ e2 9d 8a EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +U+274B ❋ e2 9d 8b HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +U+274C ❌ e2 9d 8c CROSS MARK +U+274D ❍ e2 9d 8d SHADOWED WHITE CIRCLE +U+274E ❎ e2 9d 8e NEGATIVE SQUARED CROSS MARK +U+274F ❏ e2 9d 8f LOWER RIGHT DROP-SHADOWED WHITE SQUARE +U+2750 ❐ e2 9d 90 UPPER RIGHT DROP-SHADOWED WHITE SQUARE +U+2751 ❑ e2 9d 91 LOWER RIGHT SHADOWED WHITE SQUARE +U+2752 ❒ e2 9d 92 UPPER RIGHT SHADOWED WHITE SQUARE +U+2753 ❓ e2 9d 93 BLACK QUESTION MARK ORNAMENT +U+2754 ❔ e2 9d 94 WHITE QUESTION MARK ORNAMENT +U+2755 ❕ e2 9d 95 WHITE EXCLAMATION MARK ORNAMENT +U+2756 ❖ e2 9d 96 BLACK DIAMOND MINUS WHITE X +U+2757 ❗ e2 9d 97 HEAVY EXCLAMATION MARK SYMBOL +U+2758 ❘ e2 9d 98 LIGHT VERTICAL BAR +U+2759 ❙ e2 9d 99 MEDIUM VERTICAL BAR +U+275A ❚ e2 9d 9a HEAVY VERTICAL BAR +U+275B ❛ e2 9d 9b HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +U+275C ❜ e2 9d 9c HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +U+275D ❝ e2 9d 9d HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +U+275E ❞ e2 9d 9e HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +U+275F ❟ e2 9d 9f HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT +U+2760 ❠ e2 9d a0 HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +U+2761 ❡ e2 9d a1 CURVED STEM PARAGRAPH SIGN ORNAMENT +U+2762 ❢ e2 9d a2 HEAVY EXCLAMATION MARK ORNAMENT +U+2763 ❣ e2 9d a3 HEAVY HEART EXCLAMATION MARK ORNAMENT +U+2764 ❤ e2 9d a4 HEAVY BLACK HEART +U+2765 ❥ e2 9d a5 ROTATED HEAVY BLACK HEART BULLET +U+2766 ❦ e2 9d a6 FLORAL HEART +U+2767 ❧ e2 9d a7 ROTATED FLORAL HEART BULLET +U+2768 ❨ e2 9d a8 MEDIUM LEFT PARENTHESIS ORNAMENT +U+2769 ❩ e2 9d a9 MEDIUM RIGHT PARENTHESIS ORNAMENT +U+276A ❪ e2 9d aa MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +U+276B ❫ e2 9d ab MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +U+276C ❬ e2 9d ac MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +U+276D ❭ e2 9d ad MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +U+276E ❮ e2 9d ae HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +U+276F ❯ e2 9d af HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +U+2770 ❰ e2 9d b0 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +U+2771 ❱ e2 9d b1 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +U+2772 ❲ e2 9d b2 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +U+2773 ❳ e2 9d b3 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +U+2774 ❴ e2 9d b4 MEDIUM LEFT CURLY BRACKET ORNAMENT +U+2775 ❵ e2 9d b5 MEDIUM RIGHT CURLY BRACKET ORNAMENT +U+2776 ❶ e2 9d b6 DINGBAT NEGATIVE CIRCLED DIGIT ONE +U+2777 ❷ e2 9d b7 DINGBAT NEGATIVE CIRCLED DIGIT TWO +U+2778 ❸ e2 9d b8 DINGBAT NEGATIVE CIRCLED DIGIT THREE +U+2779 ❹ e2 9d b9 DINGBAT NEGATIVE CIRCLED DIGIT FOUR +U+277A ❺ e2 9d ba DINGBAT NEGATIVE CIRCLED DIGIT FIVE +U+277B ❻ e2 9d bb DINGBAT NEGATIVE CIRCLED DIGIT SIX +U+277C ❼ e2 9d bc DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +U+277D ❽ e2 9d bd DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +U+277E ❾ e2 9d be DINGBAT NEGATIVE CIRCLED DIGIT NINE +U+277F ❿ e2 9d bf DINGBAT NEGATIVE CIRCLED NUMBER TEN +U+2780 ➀ e2 9e 80 DINGBAT CIRCLED SANS-SERIF DIGIT ONE +U+2781 ➁ e2 9e 81 DINGBAT CIRCLED SANS-SERIF DIGIT TWO +U+2782 ➂ e2 9e 82 DINGBAT CIRCLED SANS-SERIF DIGIT THREE +U+2783 ➃ e2 9e 83 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +U+2784 ➄ e2 9e 84 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +U+2785 ➅ e2 9e 85 DINGBAT CIRCLED SANS-SERIF DIGIT SIX +U+2786 ➆ e2 9e 86 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +U+2787 ➇ e2 9e 87 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +U+2788 ➈ e2 9e 88 DINGBAT CIRCLED SANS-SERIF DIGIT NINE +U+2789 ➉ e2 9e 89 DINGBAT CIRCLED SANS-SERIF NUMBER TEN +U+278A ➊ e2 9e 8a DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +U+278B ➋ e2 9e 8b DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +U+278C ➌ e2 9e 8c DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +U+278D ➍ e2 9e 8d DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +U+278E ➎ e2 9e 8e DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +U+278F ➏ e2 9e 8f DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +U+2790 ➐ e2 9e 90 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +U+2791 ➑ e2 9e 91 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +U+2792 ➒ e2 9e 92 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +U+2793 ➓ e2 9e 93 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +U+2794 ➔ e2 9e 94 HEAVY WIDE-HEADED RIGHTWARDS ARROW +U+2795 ➕ e2 9e 95 HEAVY PLUS SIGN +U+2796 ➖ e2 9e 96 HEAVY MINUS SIGN +U+2797 ➗ e2 9e 97 HEAVY DIVISION SIGN +U+2798 ➘ e2 9e 98 HEAVY SOUTH EAST ARROW +U+2799 ➙ e2 9e 99 HEAVY RIGHTWARDS ARROW +U+279A ➚ e2 9e 9a HEAVY NORTH EAST ARROW +U+279B ➛ e2 9e 9b DRAFTING POINT RIGHTWARDS ARROW +U+279C ➜ e2 9e 9c HEAVY ROUND-TIPPED RIGHTWARDS ARROW +U+279D ➝ e2 9e 9d TRIANGLE-HEADED RIGHTWARDS ARROW +U+279E ➞ e2 9e 9e HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +U+279F ➟ e2 9e 9f DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +U+27A0 ➠ e2 9e a0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +U+27A1 ➡ e2 9e a1 BLACK RIGHTWARDS ARROW +U+27A2 ➢ e2 9e a2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +U+27A3 ➣ e2 9e a3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +U+27A4 ➤ e2 9e a4 BLACK RIGHTWARDS ARROWHEAD +U+27A5 ➥ e2 9e a5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +U+27A6 ➦ e2 9e a6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +U+27A7 ➧ e2 9e a7 SQUAT BLACK RIGHTWARDS ARROW +U+27A8 ➨ e2 9e a8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +U+27A9 ➩ e2 9e a9 RIGHT-SHADED WHITE RIGHTWARDS ARROW +U+27AA ➪ e2 9e aa LEFT-SHADED WHITE RIGHTWARDS ARROW +U+27AB ➫ e2 9e ab BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +U+27AC ➬ e2 9e ac FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +U+27AD ➭ e2 9e ad HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +U+27AE ➮ e2 9e ae HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +U+27AF ➯ e2 9e af NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +U+27B0 ➰ e2 9e b0 CURLY LOOP +U+27B1 ➱ e2 9e b1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +U+27B2 ➲ e2 9e b2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW +U+27B3 ➳ e2 9e b3 WHITE-FEATHERED RIGHTWARDS ARROW +U+27B4 ➴ e2 9e b4 BLACK-FEATHERED SOUTH EAST ARROW +U+27B5 ➵ e2 9e b5 BLACK-FEATHERED RIGHTWARDS ARROW +U+27B6 ➶ e2 9e b6 BLACK-FEATHERED NORTH EAST ARROW +U+27B7 ➷ e2 9e b7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW +U+27B8 ➸ e2 9e b8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +U+27B9 ➹ e2 9e b9 HEAVY BLACK-FEATHERED NORTH EAST ARROW +U+27BA ➺ e2 9e ba TEARDROP-BARBED RIGHTWARDS ARROW +U+27BB ➻ e2 9e bb HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +U+27BC ➼ e2 9e bc WEDGE-TAILED RIGHTWARDS ARROW +U+27BD ➽ e2 9e bd HEAVY WEDGE-TAILED RIGHTWARDS ARROW +U+27BE ➾ e2 9e be OPEN-OUTLINED RIGHTWARDS ARROW +U+27BF ➿ e2 9e bf DOUBLE CURLY LOOP +U+27C0 ⟀ e2 9f 80 THREE DIMENSIONAL ANGLE +U+27C1 ⟁ e2 9f 81 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +U+27C2 ⟂ e2 9f 82 PERPENDICULAR +U+27C3 ⟃ e2 9f 83 OPEN SUBSET +U+27C4 ⟄ e2 9f 84 OPEN SUPERSET +U+27C5 ⟅ e2 9f 85 LEFT S-SHAPED BAG DELIMITER +U+27C6 ⟆ e2 9f 86 RIGHT S-SHAPED BAG DELIMITER +U+27C7 ⟇ e2 9f 87 OR WITH DOT INSIDE +U+27C8 ⟈ e2 9f 88 REVERSE SOLIDUS PRECEDING SUBSET +U+27C9 ⟉ e2 9f 89 SUPERSET PRECEDING SOLIDUS +U+27CA ⟊ e2 9f 8a VERTICAL BAR WITH HORIZONTAL STROKE +U+27CB ⟋ e2 9f 8b MATHEMATICAL RISING DIAGONAL +U+27CC ⟌ e2 9f 8c LONG DIVISION +U+27CD ⟍ e2 9f 8d MATHEMATICAL FALLING DIAGONAL +U+27CE ⟎ e2 9f 8e SQUARED LOGICAL AND +U+27CF ⟏ e2 9f 8f SQUARED LOGICAL OR +U+27D0 ⟐ e2 9f 90 WHITE DIAMOND WITH CENTRED DOT +U+27D1 ⟑ e2 9f 91 AND WITH DOT +U+27D2 ⟒ e2 9f 92 ELEMENT OF OPENING UPWARDS +U+27D3 ⟓ e2 9f 93 LOWER RIGHT CORNER WITH DOT +U+27D4 ⟔ e2 9f 94 UPPER LEFT CORNER WITH DOT +U+27D5 ⟕ e2 9f 95 LEFT OUTER JOIN +U+27D6 ⟖ e2 9f 96 RIGHT OUTER JOIN +U+27D7 ⟗ e2 9f 97 FULL OUTER JOIN +U+27D8 ⟘ e2 9f 98 LARGE UP TACK +U+27D9 ⟙ e2 9f 99 LARGE DOWN TACK +U+27DA ⟚ e2 9f 9a LEFT AND RIGHT DOUBLE TURNSTILE +U+27DB ⟛ e2 9f 9b LEFT AND RIGHT TACK +U+27DC ⟜ e2 9f 9c LEFT MULTIMAP +U+27DD ⟝ e2 9f 9d LONG RIGHT TACK +U+27DE ⟞ e2 9f 9e LONG LEFT TACK +U+27DF ⟟ e2 9f 9f UP TACK WITH CIRCLE ABOVE +U+27E0 ⟠ e2 9f a0 LOZENGE DIVIDED BY HORIZONTAL RULE +U+27E1 ⟡ e2 9f a1 WHITE CONCAVE-SIDED DIAMOND +U+27E2 ⟢ e2 9f a2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +U+27E3 ⟣ e2 9f a3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +U+27E4 ⟤ e2 9f a4 WHITE SQUARE WITH LEFTWARDS TICK +U+27E5 ⟥ e2 9f a5 WHITE SQUARE WITH RIGHTWARDS TICK +U+27E6 ⟦ e2 9f a6 MATHEMATICAL LEFT WHITE SQUARE BRACKET +U+27E7 ⟧ e2 9f a7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET +U+27E8 ⟨ e2 9f a8 MATHEMATICAL LEFT ANGLE BRACKET +U+27E9 ⟩ e2 9f a9 MATHEMATICAL RIGHT ANGLE BRACKET +U+27EA ⟪ e2 9f aa MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +U+27EB ⟫ e2 9f ab MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +U+27EC ⟬ e2 9f ac MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +U+27ED ⟭ e2 9f ad MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +U+27EE ⟮ e2 9f ae MATHEMATICAL LEFT FLATTENED PARENTHESIS +U+27EF ⟯ e2 9f af MATHEMATICAL RIGHT FLATTENED PARENTHESIS +U+27F0 ⟰ e2 9f b0 UPWARDS QUADRUPLE ARROW +U+27F1 ⟱ e2 9f b1 DOWNWARDS QUADRUPLE ARROW +U+27F2 ⟲ e2 9f b2 ANTICLOCKWISE GAPPED CIRCLE ARROW +U+27F3 ⟳ e2 9f b3 CLOCKWISE GAPPED CIRCLE ARROW +U+27F4 ⟴ e2 9f b4 RIGHT ARROW WITH CIRCLED PLUS +U+27F5 ⟵ e2 9f b5 LONG LEFTWARDS ARROW +U+27F6 ⟶ e2 9f b6 LONG RIGHTWARDS ARROW +U+27F7 ⟷ e2 9f b7 LONG LEFT RIGHT ARROW +U+27F8 ⟸ e2 9f b8 LONG LEFTWARDS DOUBLE ARROW +U+27F9 ⟹ e2 9f b9 LONG RIGHTWARDS DOUBLE ARROW +U+27FA ⟺ e2 9f ba LONG LEFT RIGHT DOUBLE ARROW +U+27FB ⟻ e2 9f bb LONG LEFTWARDS ARROW FROM BAR +U+27FC ⟼ e2 9f bc LONG RIGHTWARDS ARROW FROM BAR +U+27FD ⟽ e2 9f bd LONG LEFTWARDS DOUBLE ARROW FROM BAR +U+27FE ⟾ e2 9f be LONG RIGHTWARDS DOUBLE ARROW FROM BAR +U+27FF ⟿ e2 9f bf LONG RIGHTWARDS SQUIGGLE ARROW \ No newline at end of file diff --git a/tests/utf-8/utf-8.emoticons.txt b/tests/utf-8/utf-8.emoticons.txt index baac0906..f18045a9 100644 --- a/tests/utf-8/utf-8.emoticons.txt +++ b/tests/utf-8/utf-8.emoticons.txt @@ -1,3 +1,4 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl U+1F600 😀 f0 9f 98 80 GRINNING FACE U+1F601 😁 f0 9f 98 81 GRINNING FACE WITH SMILING EYES diff --git a/tests/utf-8/utf-8.geom.shapes.txt b/tests/utf-8/utf-8.geom.shapes.txt new file mode 100644 index 00000000..3059cb79 --- /dev/null +++ b/tests/utf-8/utf-8.geom.shapes.txt @@ -0,0 +1,258 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + +U+25A0 ■ e2 96 a0 BLACK SQUARE +U+25A1 □ e2 96 a1 WHITE SQUARE +U+25A2 ▢ e2 96 a2 WHITE SQUARE WITH ROUNDED CORNERS +U+25A3 ▣ e2 96 a3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +U+25A4 ▤ e2 96 a4 SQUARE WITH HORIZONTAL FILL +U+25A5 ▥ e2 96 a5 SQUARE WITH VERTICAL FILL +U+25A6 ▦ e2 96 a6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +U+25A7 ▧ e2 96 a7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +U+25A8 ▨ e2 96 a8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +U+25A9 ▩ e2 96 a9 SQUARE WITH DIAGONAL CROSSHATCH FILL +U+25AA ▪ e2 96 aa BLACK SMALL SQUARE +U+25AB ▫ e2 96 ab WHITE SMALL SQUARE +U+25AC ▬ e2 96 ac BLACK RECTANGLE +U+25AD ▭ e2 96 ad WHITE RECTANGLE +U+25AE ▮ e2 96 ae BLACK VERTICAL RECTANGLE +U+25AF ▯ e2 96 af WHITE VERTICAL RECTANGLE +U+25B0 ▰ e2 96 b0 BLACK PARALLELOGRAM +U+25B1 ▱ e2 96 b1 WHITE PARALLELOGRAM +U+25B2 ▲ e2 96 b2 BLACK UP-POINTING TRIANGLE +U+25B3 △ e2 96 b3 WHITE UP-POINTING TRIANGLE +U+25B4 ▴ e2 96 b4 BLACK UP-POINTING SMALL TRIANGLE +U+25B5 ▵ e2 96 b5 WHITE UP-POINTING SMALL TRIANGLE +U+25B6 ▶ e2 96 b6 BLACK RIGHT-POINTING TRIANGLE +U+25B7 ▷ e2 96 b7 WHITE RIGHT-POINTING TRIANGLE +U+25B8 ▸ e2 96 b8 BLACK RIGHT-POINTING SMALL TRIANGLE +U+25B9 ▹ e2 96 b9 WHITE RIGHT-POINTING SMALL TRIANGLE +U+25BA ► e2 96 ba BLACK RIGHT-POINTING POINTER +U+25BB ▻ e2 96 bb WHITE RIGHT-POINTING POINTER +U+25BC ▼ e2 96 bc BLACK DOWN-POINTING TRIANGLE +U+25BD ▽ e2 96 bd WHITE DOWN-POINTING TRIANGLE +U+25BE ▾ e2 96 be BLACK DOWN-POINTING SMALL TRIANGLE +U+25BF ▿ e2 96 bf WHITE DOWN-POINTING SMALL TRIANGLE +U+25C0 ◀ e2 97 80 BLACK LEFT-POINTING TRIANGLE +U+25C1 ◁ e2 97 81 WHITE LEFT-POINTING TRIANGLE +U+25C2 ◂ e2 97 82 BLACK LEFT-POINTING SMALL TRIANGLE +U+25C3 ◃ e2 97 83 WHITE LEFT-POINTING SMALL TRIANGLE +U+25C4 ◄ e2 97 84 BLACK LEFT-POINTING POINTER +U+25C5 ◅ e2 97 85 WHITE LEFT-POINTING POINTER +U+25C6 ◆ e2 97 86 BLACK DIAMOND +U+25C7 ◇ e2 97 87 WHITE DIAMOND +U+25C8 ◈ e2 97 88 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +U+25C9 ◉ e2 97 89 FISHEYE +U+25CA ◊ e2 97 8a LOZENGE +U+25CB ○ e2 97 8b WHITE CIRCLE +U+25CC ◌ e2 97 8c DOTTED CIRCLE +U+25CD ◍ e2 97 8d CIRCLE WITH VERTICAL FILL +U+25CE ◎ e2 97 8e BULLSEYE +U+25CF ● e2 97 8f BLACK CIRCLE +U+25D0 ◐ e2 97 90 CIRCLE WITH LEFT HALF BLACK +U+25D1 ◑ e2 97 91 CIRCLE WITH RIGHT HALF BLACK +U+25D2 ◒ e2 97 92 CIRCLE WITH LOWER HALF BLACK +U+25D3 ◓ e2 97 93 CIRCLE WITH UPPER HALF BLACK +U+25D4 ◔ e2 97 94 CIRCLE WITH UPPER RIGHT QUADRANT BLACK +U+25D5 ◕ e2 97 95 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +U+25D6 ◖ e2 97 96 LEFT HALF BLACK CIRCLE +U+25D7 ◗ e2 97 97 RIGHT HALF BLACK CIRCLE +U+25D8 ◘ e2 97 98 INVERSE BULLET +U+25D9 ◙ e2 97 99 INVERSE WHITE CIRCLE +U+25DA ◚ e2 97 9a UPPER HALF INVERSE WHITE CIRCLE +U+25DB ◛ e2 97 9b LOWER HALF INVERSE WHITE CIRCLE +U+25DC ◜ e2 97 9c UPPER LEFT QUADRANT CIRCULAR ARC +U+25DD ◝ e2 97 9d UPPER RIGHT QUADRANT CIRCULAR ARC +U+25DE ◞ e2 97 9e LOWER RIGHT QUADRANT CIRCULAR ARC +U+25DF ◟ e2 97 9f LOWER LEFT QUADRANT CIRCULAR ARC +U+25E0 ◠ e2 97 a0 UPPER HALF CIRCLE +U+25E1 ◡ e2 97 a1 LOWER HALF CIRCLE +U+25E2 ◢ e2 97 a2 BLACK LOWER RIGHT TRIANGLE +U+25E3 ◣ e2 97 a3 BLACK LOWER LEFT TRIANGLE +U+25E4 ◤ e2 97 a4 BLACK UPPER LEFT TRIANGLE +U+25E5 ◥ e2 97 a5 BLACK UPPER RIGHT TRIANGLE +U+25E6 ◦ e2 97 a6 WHITE BULLET +U+25E7 ◧ e2 97 a7 SQUARE WITH LEFT HALF BLACK +U+25E8 ◨ e2 97 a8 SQUARE WITH RIGHT HALF BLACK +U+25E9 ◩ e2 97 a9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +U+25EA ◪ e2 97 aa SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +U+25EB ◫ e2 97 ab WHITE SQUARE WITH VERTICAL BISECTING LINE +U+25EC ◬ e2 97 ac WHITE UP-POINTING TRIANGLE WITH DOT +U+25ED ◭ e2 97 ad UP-POINTING TRIANGLE WITH LEFT HALF BLACK +U+25EE ◮ e2 97 ae UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +U+25EF ◯ e2 97 af LARGE CIRCLE +U+25F0 ◰ e2 97 b0 WHITE SQUARE WITH UPPER LEFT QUADRANT +U+25F1 ◱ e2 97 b1 WHITE SQUARE WITH LOWER LEFT QUADRANT +U+25F2 ◲ e2 97 b2 WHITE SQUARE WITH LOWER RIGHT QUADRANT +U+25F3 ◳ e2 97 b3 WHITE SQUARE WITH UPPER RIGHT QUADRANT +U+25F4 ◴ e2 97 b4 WHITE CIRCLE WITH UPPER LEFT QUADRANT +U+25F5 ◵ e2 97 b5 WHITE CIRCLE WITH LOWER LEFT QUADRANT +U+25F6 ◶ e2 97 b6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT +U+25F7 ◷ e2 97 b7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT +U+25F8 ◸ e2 97 b8 UPPER LEFT TRIANGLE +U+25F9 ◹ e2 97 b9 UPPER RIGHT TRIANGLE +U+25FA ◺ e2 97 ba LOWER LEFT TRIANGLE +U+25FB ◻ e2 97 bb WHITE MEDIUM SQUARE +U+25FC ◼ e2 97 bc BLACK MEDIUM SQUARE +U+25FD ◽ e2 97 bd WHITE MEDIUM SMALL SQUARE +U+25FE ◾ e2 97 be BLACK MEDIUM SMALL SQUARE +U+25FF ◿ e2 97 bf LOWER RIGHT TRIANGLE +U+2600 ☀ e2 98 80 BLACK SUN WITH RAYS +U+2601 ☁ e2 98 81 CLOUD +U+2602 ☂ e2 98 82 UMBRELLA +U+2603 ☃ e2 98 83 SNOWMAN +U+2604 ☄ e2 98 84 COMET +U+2605 ★ e2 98 85 BLACK STAR +U+2606 ☆ e2 98 86 WHITE STAR +U+2607 ☇ e2 98 87 LIGHTNING +U+2608 ☈ e2 98 88 THUNDERSTORM +U+2609 ☉ e2 98 89 SUN +U+260A ☊ e2 98 8a ASCENDING NODE +U+260B ☋ e2 98 8b DESCENDING NODE +U+260C ☌ e2 98 8c CONJUNCTION +U+260D ☍ e2 98 8d OPPOSITION +U+260E ☎ e2 98 8e BLACK TELEPHONE +U+260F ☏ e2 98 8f WHITE TELEPHONE +U+2610 ☐ e2 98 90 BALLOT BOX +U+2611 ☑ e2 98 91 BALLOT BOX WITH CHECK +U+2612 ☒ e2 98 92 BALLOT BOX WITH X +U+2613 ☓ e2 98 93 SALTIRE +U+2614 ☔ e2 98 94 UMBRELLA WITH RAIN DROPS +U+2615 ☕ e2 98 95 HOT BEVERAGE +U+2616 ☖ e2 98 96 WHITE SHOGI PIECE +U+2617 ☗ e2 98 97 BLACK SHOGI PIECE +U+2618 ☘ e2 98 98 SHAMROCK +U+2619 ☙ e2 98 99 REVERSED ROTATED FLORAL HEART BULLET +U+261A ☚ e2 98 9a BLACK LEFT POINTING INDEX +U+261B ☛ e2 98 9b BLACK RIGHT POINTING INDEX +U+261C ☜ e2 98 9c WHITE LEFT POINTING INDEX +U+261D ☝ e2 98 9d WHITE UP POINTING INDEX +U+261E ☞ e2 98 9e WHITE RIGHT POINTING INDEX +U+261F ☟ e2 98 9f WHITE DOWN POINTING INDEX +U+2620 ☠ e2 98 a0 SKULL AND CROSSBONES +U+2621 ☡ e2 98 a1 CAUTION SIGN +U+2622 ☢ e2 98 a2 RADIOACTIVE SIGN +U+2623 ☣ e2 98 a3 BIOHAZARD SIGN +U+2624 ☤ e2 98 a4 CADUCEUS +U+2625 ☥ e2 98 a5 ANKH +U+2626 ☦ e2 98 a6 ORTHODOX CROSS +U+2627 ☧ e2 98 a7 CHI RHO +U+2628 ☨ e2 98 a8 CROSS OF LORRAINE +U+2629 ☩ e2 98 a9 CROSS OF JERUSALEM +U+262A ☪ e2 98 aa STAR AND CRESCENT +U+262B ☫ e2 98 ab FARSI SYMBOL +U+262C ☬ e2 98 ac ADI SHAKTI +U+262D ☭ e2 98 ad HAMMER AND SICKLE +U+262E ☮ e2 98 ae PEACE SYMBOL +U+262F ☯ e2 98 af YIN YANG +U+2630 ☰ e2 98 b0 TRIGRAM FOR HEAVEN +U+2631 ☱ e2 98 b1 TRIGRAM FOR LAKE +U+2632 ☲ e2 98 b2 TRIGRAM FOR FIRE +U+2633 ☳ e2 98 b3 TRIGRAM FOR THUNDER +U+2634 ☴ e2 98 b4 TRIGRAM FOR WIND +U+2635 ☵ e2 98 b5 TRIGRAM FOR WATER +U+2636 ☶ e2 98 b6 TRIGRAM FOR MOUNTAIN +U+2637 ☷ e2 98 b7 TRIGRAM FOR EARTH +U+2638 ☸ e2 98 b8 WHEEL OF DHARMA +U+2639 ☹ e2 98 b9 WHITE FROWNING FACE +U+263A ☺ e2 98 ba WHITE SMILING FACE +U+263B ☻ e2 98 bb BLACK SMILING FACE +U+263C ☼ e2 98 bc WHITE SUN WITH RAYS +U+263D ☽ e2 98 bd FIRST QUARTER MOON +U+263E ☾ e2 98 be LAST QUARTER MOON +U+263F ☿ e2 98 bf MERCURY +U+2640 ♀ e2 99 80 FEMALE SIGN +U+2641 ♁ e2 99 81 EARTH +U+2642 ♂ e2 99 82 MALE SIGN +U+2643 ♃ e2 99 83 JUPITER +U+2644 ♄ e2 99 84 SATURN +U+2645 ♅ e2 99 85 URANUS +U+2646 ♆ e2 99 86 NEPTUNE +U+2647 ♇ e2 99 87 PLUTO +U+2648 ♈ e2 99 88 ARIES +U+2649 ♉ e2 99 89 TAURUS +U+264A ♊ e2 99 8a GEMINI +U+264B ♋ e2 99 8b CANCER +U+264C ♌ e2 99 8c LEO +U+264D ♍ e2 99 8d VIRGO +U+264E ♎ e2 99 8e LIBRA +U+264F ♏ e2 99 8f SCORPIUS +U+2650 ♐ e2 99 90 SAGITTARIUS +U+2651 ♑ e2 99 91 CAPRICORN +U+2652 ♒ e2 99 92 AQUARIUS +U+2653 ♓ e2 99 93 PISCES +U+2654 ♔ e2 99 94 WHITE CHESS KING +U+2655 ♕ e2 99 95 WHITE CHESS QUEEN +U+2656 ♖ e2 99 96 WHITE CHESS ROOK +U+2657 ♗ e2 99 97 WHITE CHESS BISHOP +U+2658 ♘ e2 99 98 WHITE CHESS KNIGHT +U+2659 ♙ e2 99 99 WHITE CHESS PAWN +U+265A ♚ e2 99 9a BLACK CHESS KING +U+265B ♛ e2 99 9b BLACK CHESS QUEEN +U+265C ♜ e2 99 9c BLACK CHESS ROOK +U+265D ♝ e2 99 9d BLACK CHESS BISHOP +U+265E ♞ e2 99 9e BLACK CHESS KNIGHT +U+265F ♟ e2 99 9f BLACK CHESS PAWN +U+2660 ♠ e2 99 a0 BLACK SPADE SUIT +U+2661 ♡ e2 99 a1 WHITE HEART SUIT +U+2662 ♢ e2 99 a2 WHITE DIAMOND SUIT +U+2663 ♣ e2 99 a3 BLACK CLUB SUIT +U+2664 ♤ e2 99 a4 WHITE SPADE SUIT +U+2665 ♥ e2 99 a5 BLACK HEART SUIT +U+2666 ♦ e2 99 a6 BLACK DIAMOND SUIT +U+2667 ♧ e2 99 a7 WHITE CLUB SUIT +U+2668 ♨ e2 99 a8 HOT SPRINGS +U+2669 ♩ e2 99 a9 QUARTER NOTE +U+266A ♪ e2 99 aa EIGHTH NOTE +U+266B ♫ e2 99 ab BEAMED EIGHTH NOTES +U+266C ♬ e2 99 ac BEAMED SIXTEENTH NOTES +U+266D ♭ e2 99 ad MUSIC FLAT SIGN +U+266E ♮ e2 99 ae MUSIC NATURAL SIGN +U+266F ♯ e2 99 af MUSIC SHARP SIGN +U+2670 ♰ e2 99 b0 WEST SYRIAC CROSS +U+2671 ♱ e2 99 b1 EAST SYRIAC CROSS +U+2672 ♲ e2 99 b2 UNIVERSAL RECYCLING SYMBOL +U+2673 ♳ e2 99 b3 RECYCLING SYMBOL FOR TYPE-1 PLASTICS +U+2674 ♴ e2 99 b4 RECYCLING SYMBOL FOR TYPE-2 PLASTICS +U+2675 ♵ e2 99 b5 RECYCLING SYMBOL FOR TYPE-3 PLASTICS +U+2676 ♶ e2 99 b6 RECYCLING SYMBOL FOR TYPE-4 PLASTICS +U+2677 ♷ e2 99 b7 RECYCLING SYMBOL FOR TYPE-5 PLASTICS +U+2678 ♸ e2 99 b8 RECYCLING SYMBOL FOR TYPE-6 PLASTICS +U+2679 ♹ e2 99 b9 RECYCLING SYMBOL FOR TYPE-7 PLASTICS +U+267A ♺ e2 99 ba RECYCLING SYMBOL FOR GENERIC MATERIALS +U+267B ♻ e2 99 bb BLACK UNIVERSAL RECYCLING SYMBOL +U+267C ♼ e2 99 bc RECYCLED PAPER SYMBOL +U+267D ♽ e2 99 bd PARTIALLY-RECYCLED PAPER SYMBOL +U+267E ♾ e2 99 be PERMANENT PAPER SIGN +U+267F ♿ e2 99 bf WHEELCHAIR SYMBOL +U+2680 ⚀ e2 9a 80 DIE FACE-1 +U+2681 ⚁ e2 9a 81 DIE FACE-2 +U+2682 ⚂ e2 9a 82 DIE FACE-3 +U+2683 ⚃ e2 9a 83 DIE FACE-4 +U+2684 ⚄ e2 9a 84 DIE FACE-5 +U+2685 ⚅ e2 9a 85 DIE FACE-6 +U+2686 ⚆ e2 9a 86 WHITE CIRCLE WITH DOT RIGHT +U+2687 ⚇ e2 9a 87 WHITE CIRCLE WITH TWO DOTS +U+2688 ⚈ e2 9a 88 BLACK CIRCLE WITH WHITE DOT RIGHT +U+2689 ⚉ e2 9a 89 BLACK CIRCLE WITH TWO WHITE DOTS +U+268A ⚊ e2 9a 8a MONOGRAM FOR YANG +U+268B ⚋ e2 9a 8b MONOGRAM FOR YIN +U+268C ⚌ e2 9a 8c DIGRAM FOR GREATER YANG +U+268D ⚍ e2 9a 8d DIGRAM FOR LESSER YIN +U+268E ⚎ e2 9a 8e DIGRAM FOR LESSER YANG +U+268F ⚏ e2 9a 8f DIGRAM FOR GREATER YIN +U+2690 ⚐ e2 9a 90 WHITE FLAG +U+2691 ⚑ e2 9a 91 BLACK FLAG +U+2692 ⚒ e2 9a 92 HAMMER AND PICK +U+2693 ⚓ e2 9a 93 ANCHOR +U+2694 ⚔ e2 9a 94 CROSSED SWORDS +U+2695 ⚕ e2 9a 95 STAFF OF AESCULAPIUS +U+2696 ⚖ e2 9a 96 SCALES +U+2697 ⚗ e2 9a 97 ALEMBIC +U+2698 ⚘ e2 9a 98 FLOWER +U+2699 ⚙ e2 9a 99 GEAR +U+269A ⚚ e2 9a 9a STAFF OF HERMES +U+269B ⚛ e2 9a 9b ATOM SYMBOL +U+269C ⚜ e2 9a 9c FLEUR-DE-LIS +U+269D ⚝ e2 9a 9d OUTLINED WHITE STAR +U+269E ⚞ e2 9a 9e THREE LINES CONVERGING RIGHT +U+269F ⚟ e2 9a 9f THREE LINES CONVERGING LEFT \ No newline at end of file diff --git a/tests/utf-8/utf-8.misc.symbols.pictographs.txt b/tests/utf-8/utf-8.misc.symbols.pictographs.txt index 2c799ec1..ae58b767 100644 --- a/tests/utf-8/utf-8.misc.symbols.pictographs.txt +++ b/tests/utf-8/utf-8.misc.symbols.pictographs.txt @@ -1,3 +1,5 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + U+1F300 🌀 f0 9f 8c 80 CYCLONE U+1F301 🌁 f0 9f 8c 81 FOGGY U+1F302 🌂 f0 9f 8c 82 CLOSED UMBRELLA diff --git a/tests/utf-8/utf-8.misc.tech.txt b/tests/utf-8/utf-8.misc.tech.txt index 7d9e9f68..b6b3e78a 100644 --- a/tests/utf-8/utf-8.misc.tech.txt +++ b/tests/utf-8/utf-8.misc.tech.txt @@ -1,3 +1,5 @@ +from: https://www.utf8-chartable.de/unicode-utf8-table.pl + U+2300 ⌀ e2 8c 80 DIAMETER SIGN U+2301 ⌁ e2 8c 81 ELECTRIC ARROW U+2302 ⌂ e2 8c 82 HOUSE