From 74cba6c3b218fbffada1db5df2cb44fce2ddca6b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 5 Jul 2021 13:44:17 -0400 Subject: Add a simple Javascript example This shows how to use a layout manager in a widget, implemented in javascript. The example sets up the environment for running from the toplevel dir, assuming that the build dir is called 'build'. --- examples/labels.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 examples/labels.js diff --git a/examples/labels.js b/examples/labels.js new file mode 100755 index 0000000000..562153e587 --- /dev/null +++ b/examples/labels.js @@ -0,0 +1,50 @@ +#!/usr/bin/env -S GI_TYPELIB_PATH=${PWD}/build/gtk:${GI_TYPELIB_PATH} LD_PRELOAD=${LD_PRELOAD}:${PWD}/build/gtk/libgtk-4.so gjs + +imports.gi.versions['Gtk'] = '4.0'; + +const GObject = imports.gi.GObject; +const Gtk = imports.gi.Gtk; + +const DemoWidget = GObject.registerClass({ + GTypeName: 'DemoWidget', + }, class DemoWidget extends Gtk.Widget { + + _init(params = {}) { + super._init(params); + + let layout_manager = new Gtk.GridLayout (); + this.set_layout_manager (layout_manager); + this.label1 = new Gtk.Label({ label: "Red", + hexpand: true, + vexpand: true }); + this.label1.set_parent (this); + let child1 = layout_manager.get_layout_child (this.label1); + child1.set_row (0); + child1.set_column (0); + + this.label2 = new Gtk.Label({ label: "Green", + hexpand: true, + vexpand: true }); + this.label2.set_parent (this); + let child2 = layout_manager.get_layout_child (this.label2); + child2.set_row (0); + child2.set_column (1); + } +}); + +// Create a new application +let app = new Gtk.Application({ application_id: 'org.gtk.exampleapp' }); + +// When the application is launched… +app.connect('activate', () => { + // … create a new window … + let win = new Gtk.ApplicationWindow({ application: app }); + // … with a button in it … + let widget = new DemoWidget(); + win.set_child(widget); + win.present(); +}); + +// Run the application +app.run([]); + -- cgit v1.2.1 From da3ca6604bb4b25bd0812f9625b73f1a7af1a9d4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 5 Jul 2021 19:31:54 -0400 Subject: gtk-demo: Add a slider to the menu example This is a fun way to show that we can scale fast. --- demos/gtk-demo/menu.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/demos/gtk-demo/menu.c b/demos/gtk-demo/menu.c index cdcfd0ed20..d7db025910 100644 --- a/demos/gtk-demo/menu.c +++ b/demos/gtk-demo/menu.c @@ -21,8 +21,10 @@ do_menu (GtkWidget *do_widget) if (!window) { + GtkWidget *box; GtkWidget *sw; GtkWidget *widget; + GtkWidget *scale; window = gtk_window_new (); gtk_window_set_title (GTK_WINDOW (window), "Menu"); @@ -31,11 +33,23 @@ do_menu (GtkWidget *do_widget) gtk_widget_get_display (do_widget)); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_window_set_child (GTK_WINDOW (window), box); + sw = gtk_scrolled_window_new (); - gtk_window_set_child (GTK_WINDOW (window), sw); + gtk_widget_set_vexpand (sw, TRUE); + gtk_box_append (GTK_BOX (box), sw); widget = demo3_widget_new ("/transparent/portland-rose.jpg"); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), widget); + + scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0.01, 10.0, 0.1); + gtk_range_set_value (GTK_RANGE (scale), 1.0); + gtk_box_append (GTK_BOX (box), scale); + + g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value", + widget, "scale", + G_BINDING_BIDIRECTIONAL); } if (!gtk_widget_get_visible (window)) -- cgit v1.2.1 From d25557a5ef346e3b1a4dead8f71f19706f151335 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 09:46:26 -0400 Subject: Clean up the GtkComposeTable api Keep the list of composetables private to GtkIMContextSimple, and just have an api that creates new GtkComposeTables, either from a file or from data. Update tests to use the new api. --- gtk/gtkcomposetable.c | 88 +++++++++++++++++++------------------------- gtk/gtkcomposetable.h | 8 ++-- gtk/gtkimcontextsimple.c | 86 +++++++++++++++++++++++++++++++------------ testsuite/gtk/composetable.c | 18 ++------- 4 files changed, 106 insertions(+), 94 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 7aa9792e3b..3e8b663860 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -458,7 +458,7 @@ gtk_compose_data_compare (gpointer a, /* Implemented from g_str_hash() */ static guint32 -gtk_compose_table_data_hash (gconstpointer v, int length) +data_hash (gconstpointer v, int length) { const guint16 *p, *head; unsigned char c; @@ -475,6 +475,24 @@ gtk_compose_table_data_hash (gconstpointer v, int length) return h; } +guint32 +gtk_compose_table_data_hash (const guint16 *data, + int max_seq_len, + int n_seqs) +{ + gsize n_index_stride; + gsize length; + + n_index_stride = max_seq_len + 2; + if (!g_size_checked_mul (&length, n_index_stride, n_seqs)) + { + g_critical ("Overflow in the compose sequences"); + return 0; + } + + return data_hash (data, length); +} + static char * gtk_compose_hash_get_cache_path (guint32 hash) { @@ -551,15 +569,6 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table, return contents; } -static int -gtk_compose_table_find (gconstpointer data1, - gconstpointer data2) -{ - const GtkComposeTable *compose_table = (const GtkComposeTable *) data1; - guint32 hash = (guint32) GPOINTER_TO_INT (data2); - return compose_table->id != hash; -} - static GtkComposeTable * gtk_compose_table_load_cache (const char *compose_file) { @@ -782,6 +791,10 @@ gtk_compose_table_new_with_file (const char *compose_file) g_assert (compose_file != NULL); + compose_table = gtk_compose_table_load_cache (compose_file); + if (compose_table != NULL) + return compose_table; + compose_list = gtk_compose_list_parse_file (compose_file); if (compose_list == NULL) return NULL; @@ -803,39 +816,36 @@ gtk_compose_table_new_with_file (const char *compose_file) max_compose_len, n_index_stride, g_str_hash (compose_file)); + g_list_free_full (compose_list, (GDestroyNotify) gtk_compose_list_element_free); + + gtk_compose_table_save_cache (compose_table); + return compose_table; } -GSList * -gtk_compose_table_list_add_array (GSList *compose_tables, - const guint16 *data, - int max_seq_len, - int n_seqs) +GtkComposeTable * +gtk_compose_table_new_with_data (const guint16 *data, + int max_seq_len, + int n_seqs) { - guint32 hash; GtkComposeTable *compose_table; gsize n_index_stride; gsize length; int i; guint16 *gtk_compose_seqs = NULL; - g_return_val_if_fail (data != NULL, compose_tables); - g_return_val_if_fail (max_seq_len >= 0, compose_tables); - g_return_val_if_fail (n_seqs >= 0, compose_tables); + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (max_seq_len >= 0, NULL); + g_return_val_if_fail (n_seqs >= 0, NULL); n_index_stride = max_seq_len + 2; if (!g_size_checked_mul (&length, n_index_stride, n_seqs)) { g_critical ("Overflow in the compose sequences"); - return compose_tables; + return NULL; } - hash = gtk_compose_table_data_hash (data, length); - - if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL) - return compose_tables; - gtk_compose_seqs = g_new0 (guint16, length); for (i = 0; i < length; i++) gtk_compose_seqs[i] = data[i]; @@ -844,35 +854,11 @@ gtk_compose_table_list_add_array (GSList *compose_tables, compose_table->data = gtk_compose_seqs; compose_table->max_seq_len = max_seq_len; compose_table->n_seqs = n_seqs; - compose_table->id = hash; + compose_table->id = data_hash (data, length); compose_table->char_data = NULL; compose_table->n_chars = 0; - return g_slist_prepend (compose_tables, compose_table); -} - -GSList * -gtk_compose_table_list_add_file (GSList *compose_tables, - const char *compose_file) -{ - guint32 hash; - GtkComposeTable *compose_table; - - g_return_val_if_fail (compose_file != NULL, compose_tables); - - hash = g_str_hash (compose_file); - if (g_slist_find_custom (compose_tables, GINT_TO_POINTER (hash), gtk_compose_table_find) != NULL) - return compose_tables; - - compose_table = gtk_compose_table_load_cache (compose_file); - if (compose_table != NULL) - return g_slist_prepend (compose_tables, compose_table); - - if ((compose_table = gtk_compose_table_new_with_file (compose_file)) == NULL) - return compose_tables; - - gtk_compose_table_save_cache (compose_table); - return g_slist_prepend (compose_tables, compose_table); + return compose_table; } static int diff --git a/gtk/gtkcomposetable.h b/gtk/gtkcomposetable.h index 101aa94359..1f28f83e73 100644 --- a/gtk/gtkcomposetable.h +++ b/gtk/gtkcomposetable.h @@ -45,12 +45,9 @@ struct _GtkComposeTableCompact }; GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file); -GSList * gtk_compose_table_list_add_array (GSList *compose_tables, - const guint16 *data, +GtkComposeTable * gtk_compose_table_new_with_data (const guint16 *data, int max_seq_len, int n_seqs); -GSList * gtk_compose_table_list_add_file (GSList *compose_tables, - const char *compose_file); gboolean gtk_compose_table_check (const GtkComposeTable *table, const guint16 *compose_buffer, @@ -70,6 +67,9 @@ gboolean gtk_check_algorithmically (const guint16 int n_compose, gunichar *output); +guint32 gtk_compose_table_data_hash (const guint16 *data, + int max_seq_len, + int n_seqs); G_END_DECLS diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 2ff3fe03b9..4e160ab048 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -163,6 +163,59 @@ get_x11_compose_file_dir (void) return compose_file_dir; } +static int +gtk_compose_table_find (gconstpointer data1, + gconstpointer data2) +{ + const GtkComposeTable *compose_table = (const GtkComposeTable *) data1; + guint32 hash = (guint32) GPOINTER_TO_INT (data2); + return compose_table->id != hash; +} + +static void +add_compose_table_from_file (const char *compose_file) +{ + guint hash; + + G_LOCK (global_tables); + + hash = g_str_hash (compose_file); + if (!g_slist_find_custom (global_tables, GINT_TO_POINTER (hash), gtk_compose_table_find)) + { + GtkComposeTable *table; + + table = gtk_compose_table_new_with_file (compose_file); + + if (table) + global_tables = g_slist_prepend (global_tables, table); + } + + G_UNLOCK (global_tables); +} + +static void +add_compose_table_from_data (const guint16 *data, + int max_seq_len, + int n_seqs) +{ + guint hash; + + G_LOCK (global_tables); + + hash = gtk_compose_table_data_hash (data, max_seq_len, n_seqs); + if (!g_slist_find_custom (global_tables, GINT_TO_POINTER (hash), gtk_compose_table_find)) + { + GtkComposeTable *table; + + table = gtk_compose_table_new_with_data (data, max_seq_len, n_seqs); + + if (table) + global_tables = g_slist_prepend (global_tables, table); + } + + G_UNLOCK (global_tables); +} + static void gtk_im_context_simple_init_compose_table (void) { @@ -178,10 +231,7 @@ gtk_im_context_simple_init_compose_table (void) path = g_build_filename (g_get_user_config_dir (), "gtk-4.0", "Compose", NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) { - G_LOCK (global_tables); - global_tables = gtk_compose_table_list_add_file (global_tables, path); - G_UNLOCK (global_tables); - + add_compose_table_from_file (path); g_free (path); return; } @@ -194,9 +244,7 @@ gtk_im_context_simple_init_compose_table (void) path = g_build_filename (home, ".XCompose", NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) { - G_LOCK (global_tables); - global_tables = gtk_compose_table_list_add_file (global_tables, path); - G_UNLOCK (global_tables); + add_compose_table_from_file (path); g_free (path); return; } @@ -240,12 +288,9 @@ gtk_im_context_simple_init_compose_table (void) g_strfreev (langs); if (path != NULL) - { - G_LOCK (global_tables); - global_tables = gtk_compose_table_list_add_file (global_tables, path); - G_UNLOCK (global_tables); - } - g_clear_pointer (&path, g_free); + add_compose_table_from_file (path); + + g_free (path); } static void @@ -1210,14 +1255,11 @@ gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple, int max_seq_len, int n_seqs) { - g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); - - G_LOCK (global_tables); + GtkComposeTable *table; - global_tables = gtk_compose_table_list_add_array (global_tables, - data, max_seq_len, n_seqs); + g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); - G_UNLOCK (global_tables); + add_compose_table_from_data (data, max_seq_len, n_seqs); } /** @@ -1233,9 +1275,5 @@ gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple, { g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); - G_LOCK (global_tables); - - global_tables = gtk_compose_table_list_add_file (global_tables, compose_file); - - G_UNLOCK (global_tables); + add_compose_table_from_file (compose_file); } diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index ea17e7a6a0..4348dfbea0 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -77,12 +77,10 @@ gtk_compose_table_print (GtkComposeTable *table) static void generate_output (const char *file) { - GSList *tables = NULL; GtkComposeTable *table; char *output; - tables = gtk_compose_table_list_add_file (tables, file); - table = tables->data; + table = gtk_compose_table_new_with_file (file); output = gtk_compose_table_print (table); g_print ("%s", output); @@ -92,7 +90,6 @@ static void compose_table_compare (gconstpointer data) { const char *basename = data; - GSList *tables = NULL; GtkComposeTable *table; char *file; char *expected; @@ -103,11 +100,7 @@ compose_table_compare (gconstpointer data) file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", basename, NULL); expected = g_strconcat (file, ".expected", NULL); - tables = gtk_compose_table_list_add_file (tables, file); - - g_assert_true (g_slist_length (tables) == 1); - - table = tables->data; + table = gtk_compose_table_new_with_file (file); output = gtk_compose_table_print (table); diff = diff_with_file (expected, output, -1, &error); @@ -128,7 +121,6 @@ compose_table_compare (gconstpointer data) static void compose_table_match (void) { - GSList *tables = NULL; GtkComposeTable *table; char *file; guint16 buffer[8] = { 0, }; @@ -139,11 +131,7 @@ compose_table_match (void) file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "match", NULL); - tables = gtk_compose_table_list_add_file (tables, file); - - g_assert_true (g_slist_length (tables) == 1); - - table = tables->data; + table = gtk_compose_table_new_with_file (file); buffer[0] = GDK_KEY_Multi_key; buffer[1] = 0; -- cgit v1.2.1 From bee58fd09daa4deaebb51f8f123e1b7789e37b8c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 09:56:34 -0400 Subject: composetable: Introduce a parser struct This will be used in the following commits to beef up Compose file parsing. --- gtk/gtkcomposetable.c | 62 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 3e8b663860..f053ce8741 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -39,7 +39,6 @@ typedef struct { char *value; } GtkComposeData; - static void gtk_compose_data_free (GtkComposeData *compose_data) { @@ -48,10 +47,27 @@ gtk_compose_data_free (GtkComposeData *compose_data) g_slice_free (GtkComposeData, compose_data); } +typedef struct { + GList *sequences; +} GtkComposeParser; + +static GtkComposeParser * +parser_new (void) +{ + GtkComposeParser *parser; + + parser = g_new (GtkComposeParser, 1); + + parser->sequences = NULL; + + return parser; +} + static void -gtk_compose_list_element_free (GtkComposeData *compose_data, gpointer data) +parser_free (GtkComposeParser *parser) { - gtk_compose_data_free (compose_data); + g_list_free_full (parser->sequences, (GDestroyNotify) gtk_compose_data_free); + g_free (parser); } static gboolean @@ -784,43 +800,49 @@ gtk_compose_table_new_with_list (GList *compose_list, GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file) { - GList *compose_list = NULL; + GtkComposeParser *parser; GtkComposeTable *compose_table; int max_compose_len = 0; int n_index_stride = 0; g_assert (compose_file != NULL); + compose_table = NULL; + compose_table = gtk_compose_table_load_cache (compose_file); if (compose_table != NULL) return compose_table; - compose_list = gtk_compose_list_parse_file (compose_file); - if (compose_list == NULL) - return NULL; - compose_list = gtk_compose_list_check_duplicated (compose_list); - compose_list = gtk_compose_list_check_uint16 (compose_list); - compose_list = gtk_compose_list_format_for_gtk (compose_list, - &max_compose_len, - &n_index_stride); - compose_list = g_list_sort_with_data (compose_list, - (GCompareDataFunc) gtk_compose_data_compare, - GINT_TO_POINTER (max_compose_len)); - if (compose_list == NULL) + parser = parser_new (); + + parser->sequences = gtk_compose_list_parse_file (compose_file); + if (parser->sequences == NULL) + goto out; + + parser->sequences = gtk_compose_list_check_duplicated (parser->sequences); + parser->sequences = gtk_compose_list_check_uint16 (parser->sequences); + parser->sequences = gtk_compose_list_format_for_gtk (parser->sequences, + &max_compose_len, + &n_index_stride); + parser->sequences = g_list_sort_with_data (parser->sequences, + (GCompareDataFunc) gtk_compose_data_compare, + GINT_TO_POINTER (max_compose_len)); + if (parser->sequences == NULL) { g_warning ("compose file %s does not include any keys besides keys in en-us compose file", compose_file); - return NULL; + goto out; } - compose_table = gtk_compose_table_new_with_list (compose_list, + compose_table = gtk_compose_table_new_with_list (parser->sequences, max_compose_len, n_index_stride, g_str_hash (compose_file)); - g_list_free_full (compose_list, (GDestroyNotify) gtk_compose_list_element_free); - gtk_compose_table_save_cache (compose_table); +out: + parser_free (parser); + return compose_table; } -- cgit v1.2.1 From 8464b0484fa1b0e351ed80067b9e470cd12a1c37 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 10:07:10 -0400 Subject: composetable: Move code into the parser This is just code reshuffling. --- gtk/gtkcomposetable.c | 91 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 37 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index f053ce8741..0c1f2d83f1 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -49,6 +49,7 @@ gtk_compose_data_free (GtkComposeData *compose_data) typedef struct { GList *sequences; + const char *compose_file; } GtkComposeParser; static GtkComposeParser * @@ -59,6 +60,7 @@ parser_new (void) parser = g_new (GtkComposeParser, 1); parser->sequences = NULL; + parser->compose_file = NULL; return parser; } @@ -247,8 +249,8 @@ fail: } static void -parse_compose_line (GList **compose_list, - const char *line) +parser_parse_line (GtkComposeParser *parser, + const char *line) { char **components = NULL; GtkComposeData *compose_data = NULL; @@ -277,7 +279,7 @@ parse_compose_line (GList **compose_list, g_strfreev (components); - *compose_list = g_list_append (*compose_list, compose_data); + parser->sequences = g_list_append (parser->sequences, compose_data); return; @@ -289,30 +291,28 @@ fail: extern const GtkComposeTableCompact gtk_compose_table_compact; -static GList * -gtk_compose_list_parse_file (const char *compose_file) +static void +parser_read_file (GtkComposeParser *parser, + const char *compose_file) { char *contents = NULL; char **lines = NULL; gsize length = 0; GError *error = NULL; - GList *compose_list = NULL; - int i; if (!g_file_get_contents (compose_file, &contents, &length, &error)) { g_warning ("%s", error->message); g_error_free (error); - return NULL; + return; } lines = g_strsplit (contents, "\n", -1); - g_free (contents); - for (i = 0; lines[i] != NULL; i++) - parse_compose_line (&compose_list, lines[i]); - g_strfreev (lines); + for (int i = 0; lines[i] != NULL; i++) + parser_parse_line (parser, lines[i]); - return compose_list; + g_strfreev (lines); + g_free (contents); } static GList * @@ -797,27 +797,25 @@ gtk_compose_table_new_with_list (GList *compose_list, return retval; } -GtkComposeTable * -gtk_compose_table_new_with_file (const char *compose_file) +static void +parser_parse_file (GtkComposeParser *parser, + const char *compose_file) { - GtkComposeParser *parser; - GtkComposeTable *compose_table; - int max_compose_len = 0; - int n_index_stride = 0; - - g_assert (compose_file != NULL); + // stash the name for the table hash + if (parser->compose_file == NULL) + parser->compose_file = compose_file; - compose_table = NULL; - - compose_table = gtk_compose_table_load_cache (compose_file); - if (compose_table != NULL) - return compose_table; + parser_read_file (parser, compose_file); +} - parser = parser_new (); +static GtkComposeTable * +parser_get_compose_table (GtkComposeParser *parser) +{ + int max_compose_len = 0; + int n_index_stride = 0; - parser->sequences = gtk_compose_list_parse_file (compose_file); if (parser->sequences == NULL) - goto out; + return NULL; parser->sequences = gtk_compose_list_check_duplicated (parser->sequences); parser->sequences = gtk_compose_list_check_uint16 (parser->sequences); @@ -829,20 +827,39 @@ gtk_compose_table_new_with_file (const char *compose_file) GINT_TO_POINTER (max_compose_len)); if (parser->sequences == NULL) { - g_warning ("compose file %s does not include any keys besides keys in en-us compose file", compose_file); - goto out; + g_warning ("compose file %s does not include any keys besides keys in en-us compose file", parser->compose_file); + return NULL; } - compose_table = gtk_compose_table_new_with_list (parser->sequences, - max_compose_len, - n_index_stride, - g_str_hash (compose_file)); + return gtk_compose_table_new_with_list (parser->sequences, + max_compose_len, + n_index_stride, + g_str_hash (parser->compose_file)); +} + +GtkComposeTable * +gtk_compose_table_new_with_file (const char *compose_file) +{ + GtkComposeParser *parser; + GtkComposeTable *compose_table; + + g_assert (compose_file != NULL); + + compose_table = gtk_compose_table_load_cache (compose_file); + if (compose_table != NULL) + return compose_table; + + parser = parser_new (); + + parser_parse_file (parser, compose_file); - gtk_compose_table_save_cache (compose_table); + compose_table = parser_get_compose_table (parser); -out: parser_free (parser); + if (compose_table != NULL) + gtk_compose_table_save_cache (compose_table); + return compose_table; } -- cgit v1.2.1 From fb6c8cd466de50a7cc8b9e7642f7296a887a90a5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 10:47:17 -0400 Subject: composetable: Handle includes This adds the mechanics for parsing include lines in Compose files. We do detect and prevent cycles. Tests included. --- gtk/gtkcomposetable.c | 90 +++++++++++++++++++++++++++++++++- testsuite/gtk/compose/cycle | 3 ++ testsuite/gtk/compose/include | 3 ++ testsuite/gtk/compose/include.expected | 4 ++ testsuite/gtk/compose/included | 1 + testsuite/gtk/compose/nofile | 3 ++ testsuite/gtk/composetable.c | 47 ++++++++++++++++++ 7 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 testsuite/gtk/compose/cycle create mode 100644 testsuite/gtk/compose/include create mode 100644 testsuite/gtk/compose/include.expected create mode 100644 testsuite/gtk/compose/included create mode 100644 testsuite/gtk/compose/nofile diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 0c1f2d83f1..b8561aa161 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -49,6 +49,7 @@ gtk_compose_data_free (GtkComposeData *compose_data) typedef struct { GList *sequences; + GList *files; const char *compose_file; } GtkComposeParser; @@ -60,6 +61,7 @@ parser_new (void) parser = g_new (GtkComposeParser, 1); parser->sequences = NULL; + parser->files = NULL; parser->compose_file = NULL; return parser; @@ -69,6 +71,7 @@ static void parser_free (GtkComposeParser *parser) { g_list_free_full (parser->sequences, (GDestroyNotify) gtk_compose_data_free); + g_list_free_full (parser->files, g_free); g_free (parser); } @@ -248,6 +251,57 @@ fail: return FALSE; } +static void parser_parse_file (GtkComposeParser *parser, + const char *path); + +static void +parser_handle_include (GtkComposeParser *parser, + const char *line) +{ + const char *p; + const char *start, *end; + char *path; + + p = line + strlen ("include "); + + while (g_ascii_isspace (*p)) + p++; + + if (*p != '"') + goto error; + + p++; + + start = p; + + while (*p && *p != '"') + p++; + + if (*p != '"') + goto error; + + end = p; + + p++; + + while (g_ascii_isspace (*p)) + p++; + + if (*p && *p != '#') + goto error; + + path = g_strndup (start, end - start); + + parser_parse_file (parser, path); + + g_free (path); + + return; + +error: + g_warning ("Could not parse include: %s", line); +} + static void parser_parse_line (GtkComposeParser *parser, const char *line) @@ -259,7 +313,10 @@ parser_parse_line (GtkComposeParser *parser, return; if (g_str_has_prefix (line, "include ")) - return; + { + parser_handle_include (parser, line); + return; + } components = g_strsplit (line, ":", 2); @@ -797,15 +854,44 @@ gtk_compose_table_new_with_list (GList *compose_list, return retval; } +static char * +canonicalize_filename (const char *path) +{ + GFile *file; + char *retval; + + file = g_file_new_for_path (path); + retval = g_file_get_path (file); + + g_object_unref (file); + + return retval; +} + static void parser_parse_file (GtkComposeParser *parser, const char *compose_file) { + char *path; + // stash the name for the table hash if (parser->compose_file == NULL) parser->compose_file = compose_file; - parser_read_file (parser, compose_file); + path = canonicalize_filename (compose_file); + + if (g_list_find_custom (parser->files, path, (GCompareFunc)strcmp)) + { + g_warning ("include cycle detected: %s", compose_file); + g_free (path); + return; + } + + parser->files = g_list_prepend (parser->files, path); + + parser_read_file (parser, path); + + parser->files = g_list_remove (parser->files, path); } static GtkComposeTable * diff --git a/testsuite/gtk/compose/cycle b/testsuite/gtk/compose/cycle new file mode 100644 index 0000000000..b65eca834f --- /dev/null +++ b/testsuite/gtk/compose/cycle @@ -0,0 +1,3 @@ +include "testsuite/gtk/compose/cycle" # create an include cycle + + : "!" diff --git a/testsuite/gtk/compose/include b/testsuite/gtk/compose/include new file mode 100644 index 0000000000..a4769355a4 --- /dev/null +++ b/testsuite/gtk/compose/include @@ -0,0 +1,3 @@ +include "testsuite/gtk/compose/included" # see if this works + + : "!" diff --git a/testsuite/gtk/compose/include.expected b/testsuite/gtk/compose/include.expected new file mode 100644 index 0000000000..10fbc4418c --- /dev/null +++ b/testsuite/gtk/compose/include.expected @@ -0,0 +1,4 @@ +# n_seqs: 2 +# max_seq_len: 4 + : "\"\\" + : "!" # U21 diff --git a/testsuite/gtk/compose/included b/testsuite/gtk/compose/included new file mode 100644 index 0000000000..0d29359189 --- /dev/null +++ b/testsuite/gtk/compose/included @@ -0,0 +1 @@ + : "\"\\" diff --git a/testsuite/gtk/compose/nofile b/testsuite/gtk/compose/nofile new file mode 100644 index 0000000000..0b676e16d6 --- /dev/null +++ b/testsuite/gtk/compose/nofile @@ -0,0 +1,3 @@ +include "testsuite/gtk/compose/nosuchfile" # this file does not exist + + : "!" diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index 4348dfbea0..1414a7c99f 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -117,6 +117,50 @@ compose_table_compare (gconstpointer data) g_free (expected); } +static void +compose_table_cycle (void) +{ + if (g_test_subprocess ()) + { + char *file; + GtkComposeTable *table; + + file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "cycle", NULL); + + table = gtk_compose_table_new_with_file (file); + g_assert_nonnull (table); + g_free (file); + + return; + } + + g_test_trap_subprocess (NULL, 0, 0); + g_test_trap_assert_stderr ("*include cycle detected*"); + g_test_trap_assert_failed (); +} + +static void +compose_table_nofile (void) +{ + if (g_test_subprocess ()) + { + char *file; + GtkComposeTable *table; + + file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "nofile", NULL); + + table = gtk_compose_table_new_with_file (file); + g_assert_nonnull (table); + g_free (file); + + return; + } + + g_test_trap_subprocess (NULL, 0, 0); + g_test_trap_assert_stderr ("*No such file or directory*"); + g_test_trap_assert_failed (); +} + /* Check matching against a small table */ static void compose_table_match (void) @@ -360,6 +404,9 @@ main (int argc, char *argv[]) g_test_add_data_func ("/compose-table/codepoint", "codepoint", compose_table_compare); g_test_add_data_func ("/compose-table/multi", "multi", compose_table_compare); g_test_add_data_func ("/compose-table/strings", "strings", compose_table_compare); + g_test_add_data_func ("/compose-table/include", "include", compose_table_compare); + g_test_add_func ("/compose-table/include-cycle", compose_table_cycle); + g_test_add_func ("/compose-table/include-nofile", compose_table_nofile); g_test_add_func ("/compose-table/match", compose_table_match); g_test_add_func ("/compose-table/match-compact", compose_table_match_compact); g_test_add_func ("/compose-table/match-algorithmic", match_algorithmic); -- cgit v1.2.1 From ff4f07d76fc0cb253abc44856139fd8cf65699fd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 13:56:19 -0400 Subject: composetable: Handle substitutions in includes Hande the %H, %L, %S substitutions that are described in Compose(7). Test included. --- gtk/gtkcomposetable.c | 46 ++- testsuite/gtk/compose/system | 1 + testsuite/gtk/compose/system.expected | 587 ++++++++++++++++++++++++++++++++++ testsuite/gtk/composetable.c | 2 + 4 files changed, 635 insertions(+), 1 deletion(-) create mode 100644 testsuite/gtk/compose/system create mode 100644 testsuite/gtk/compose/system.expected diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index b8561aa161..af064d7461 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -254,6 +254,50 @@ fail: static void parser_parse_file (GtkComposeParser *parser, const char *path); +/* Substitute %H, %L and %S */ +static char * +handle_substitutions (const char *start, + int length) +{ + GString *s; + const char *locale_name; + const char *p; + + s = g_string_new (""); + + locale_name = getenv ("LANG"); + + for (p = start; *p && p < start + length; p++) + { + if (*p != '%') + { + g_string_append_c (s, *p); + } + else + { + switch (p[1]) + { + case 'H': + p++; + g_string_append (s, g_get_home_dir ()); + break; + case 'L': + p++; + g_string_append_printf (s, "/usr/share/X11/locale/%s/Compose", locale_name); + break; + case 'S': + p++; + g_string_append (s, "/usr/share/X11/locale"); + break; + default: ; + /* do nothing, next iteration handles p[1] */ + } + } + } + + return g_string_free (s, FALSE); +} + static void parser_handle_include (GtkComposeParser *parser, const char *line) @@ -290,7 +334,7 @@ parser_handle_include (GtkComposeParser *parser, if (*p && *p != '#') goto error; - path = g_strndup (start, end - start); + path = handle_substitutions (start, end - start); parser_parse_file (parser, path); diff --git a/testsuite/gtk/compose/system b/testsuite/gtk/compose/system new file mode 100644 index 0000000000..28fe1f1616 --- /dev/null +++ b/testsuite/gtk/compose/system @@ -0,0 +1 @@ +include "%L" diff --git a/testsuite/gtk/compose/system.expected b/testsuite/gtk/compose/system.expected new file mode 100644 index 0000000000..6fdf4fab29 --- /dev/null +++ b/testsuite/gtk/compose/system.expected @@ -0,0 +1,587 @@ +# n_seqs: 585 +# max_seq_len: 5 + : "ុះ" + : "ុំ" + : "េះ" + : "ោះ" + : "ាំ" + : "M̀" + : "m̀" + : "Ɔ̀" + : "Ǝ̀" + : "Ɛ̀" + : "Ɩ̀" + : "Ʊ̀" + : "Ʋ̀" + : "ǝ̀" + : "ɔ̀" + : "ɛ̀" + : "ɩ̀" + : "ʊ̀" + : "ʋ̀" + : "Ŋ̀" + : "ŋ̀" + : "а̀" + : "о̀" + : "р̀" + : "у̀" + : "А̀" + : "О̀" + : "Р̀" + : "У̀" + : "ἂ" # U1f02 + : "ἃ" # U1f03 + : "Ἂ" # U1f0a + : "Ἃ" # U1f0b + : "ἒ" # U1f12 + : "ἓ" # U1f13 + : "Ἒ" # U1f1a + : "Ἓ" # U1f1b + : "ἢ" # U1f22 + : "ἣ" # U1f23 + : "Ἢ" # U1f2a + : "Ἣ" # U1f2b + : "ἲ" # U1f32 + : "ἳ" # U1f33 + : "Ἲ" # U1f3a + : "Ἳ" # U1f3b + : "ὂ" # U1f42 + : "ὃ" # U1f43 + : "Ὂ" # U1f4a + : "Ὃ" # U1f4b + : "ὒ" # U1f52 + : "ὓ" # U1f53 + : "Ὓ" # U1f5b + : "ὢ" # U1f62 + : "ὣ" # U1f63 + : "Ὢ" # U1f6a + : "Ὣ" # U1f6b + : "Ã̀" + : "Ẽ̀" + : "Ĩ̀" + : "Õ̀" + : "Ũ̀" + : "ã̀" + : "ẽ̀" + : "ĩ̀" + : "õ̀" + : "ũ̀" + : "Ɔ̃̀" + : "Ǝ̃̀" + : "Ɛ̃̀" + : "ǝ̃̀" + : "ɔ̃̀" + : "ɛ̃̀" + : "J́" + : "j́" + : "Ɔ́" + : "Ǝ́" + : "Ɛ́" + : "Ɩ́" + : "Ʊ́" + : "Ʋ́" + : "ǝ́" + : "ɔ́" + : "ɛ́" + : "ɩ́" + : "ʊ́" + : "ʋ́" + : "Ŋ́" + : "ŋ́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "Ã́" + : "Ẽ́" + : "Ĩ́" + : "ã́" + : "ẽ́" + : "ĩ́" + : "Ɔ̃́" + : "Ǝ̃́" + : "Ɛ̃́" + : "ǝ̃́" + : "ɔ̃́" + : "ɛ̃́" + : "Ɔ̂" + : "Ǝ̂" + : "Ɛ̂" + : "Ɩ̂" + : "Ʊ̂" + : "Ʋ̂" + : "ǝ̂" + : "ɔ̂" + : "ɛ̂" + : "ɩ̂" + : "ʊ̂" + : "ʋ̂" + : "а̂" + : "е̂" + : "и̂" + : "о̂" + : "р̂" + : "у̂" + : "А̂" + : "Е̂" + : "И̂" + : "О̂" + : "Р̂" + : "У̂" + : "Ậ" # U1eac + : "ậ" # U1ead + : "Ệ" # U1ec6 + : "ệ" # U1ec7 + : "Ộ" # U1ed8 + : "ộ" # U1ed9 + : "Ɔ̃" + : "Ǝ̃" + : "Ɛ̃" + : "ǝ̃" + : "ɔ̃" + : "ɛ̃" + : "Ɔ̄" + : "Ǝ̄" + : "Ɛ̄" + : "Ɩ̄" + : "Ʊ̄" + : "Ʋ̄" + : "ǝ̄" + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "ɔ̄" + : "ɛ̄" + : "ɩ̄" + : "ʊ̄" + : "ʋ̄" + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c + : "ṝ" # U1e5d + : "Ǖ" # U1d5 + : "ǖ" # U1d6 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "ẛ" # U1e9b + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ȫ" # U22a + : "Ӛ" # U4da + : "ӛ" # U4db + : "Ӫ" # U4ea + : "ӫ" # U4eb + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ɔ̌" + : "Ǝ̌" + : "Ɛ̌" + : "Ɩ̌" + : "Ʊ̌" + : "Ʋ̌" + : "ǝ̌" + : "ɔ̌" + : "ɛ̌" + : "ɩ̌" + : "ʊ̌" + : "ʋ̌" + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ᾀ" # U1f80 + : "ᾁ" # U1f81 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾈ" # U1f88 + : "ᾉ" # U1f89 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾐ" # U1f90 + : "ᾑ" # U1f91 + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾘ" # U1f98 + : "ᾙ" # U1f99 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾠ" # U1fa0 + : "ᾡ" # U1fa1 + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾨ" # U1fa8 + : "ᾩ" # U1fa9 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ゔ" # U3094 + : "が" # U304c + : "ぎ" # U304e + : "ぐ" # U3050 + : "げ" # U3052 + : "ご" # U3054 + : "ざ" # U3056 + : "じ" # U3058 + : "ず" # U305a + : "ぜ" # U305c + : "ぞ" # U305e + : "だ" # U3060 + : "ぢ" # U3062 + : "づ" # U3065 + : "で" # U3067 + : "ど" # U3069 + : "ば" # U3070 + : "び" # U3073 + : "ぶ" # U3076 + : "べ" # U3079 + : "ぼ" # U307c + : "ゞ" # U309e + : "ヸ" # U30f8 + : "ヹ" # U30f9 + : "ヾ" # U30fe + : "ぱ" # U3071 + : "ぴ" # U3074 + : "ぷ" # U3077 + : "ぺ" # U307a + : "ぽ" # U307d + : "≮" # U226e + : "≠" # U2260 + : "≯" # U226f + : "Ѷ" # U476 + : "ѷ" # U477 + : "а̏" + : "е̏" + : "и̏" + : "о̏" + : "р̏" + : "у̏" + : "А̏" + : "Е̏" + : "И̏" + : "О̏" + : "Р̏" + : "У̏" + : "Ȃ" # U202 + : "Ȇ" # U206 + : "Ȋ" # U20a + : "Ȏ" # U20e + : "Ȓ" # U212 + : "Ȗ" # U216 + : "ȃ" # U203 + : "ȇ" # U207 + : "ȋ" # U20b + : "ȏ" # U20f + : "ȓ" # U213 + : "ȗ" # U217 + : "а̑" + : "е̑" + : "и̑" + : "о̑" + : "р̑" + : "у̑" + : "А̑" + : "Е̑" + : "И̑" + : "О̑" + : "Р̑" + : "У̑" + : "لآ" + : "لأ" + : "لإ" + : "لا" + : "̈́" # U344 + : "J́" + : "j́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "㊿" # U32bf + : "㊿" # U32bf + : "⍟" # U235f + : "Ā" # U100 + : "Ō" # U14c + : "⊖" # U2296 + : "⊙" # U2299 + : "Ā" # U100 + : "Ā" # U100 + : "🖕" # U1f595 + : "J́" + : "J́" + : "₤" # U20a4 + : "🖖" # U1f596 + : "Ō" # U14c + : "Ō" # U14c + : "🙌" # U1f64c + : "⍉" # U2349 + : "а̂" + : "е̂" + : "и̂" + : "о̂" + : "р̂" + : "у̂" + : "А̂" + : "Е̂" + : "И̂" + : "О̂" + : "Р̂" + : "У̂" + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "⊆" # U2286 + : "⊇" # U2287 + : "⍊" # U234a + : "⍜" # U235c + : "а̏" + : "е̏" + : "и̏" + : "о̏" + : "р̏" + : "у̏" + : "А̏" + : "Е̏" + : "И̏" + : "О̏" + : "Р̏" + : "У̏" + : "а̀" + : "о̀" + : "р̀" + : "у̀" + : "А̀" + : "О̀" + : "Р̀" + : "У̀" + : "ā" # U101 + : "j́" + : "j́" + : "ō" # U14d + : "💩" # U1f4a9 + : "⍋" # U234b + : "⍒" # U2352 + : "⍦" # U2366 + : "⍧" # U2367 + : "⌽" # U233d + : "⍡" # U2361 + : "⍥" # U2365 + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "ṝ" # U1e5d + : "⍑" # U2351 + : "J́" + : "j́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ᾧ" # U1fa7 + : "⍝" # U235d + : "⍕" # U2355 + : "⍎" # U234e + : "⌻" # U233b + : "⌾" # U233e + : "⍦" # U2366 + : "⊆" # U2286 + : "⍧" # U2367 + : "⊇" # U2287 + : "⊈" # U2288 + : "⊉" # U2289 + : "⋢" # U22e2 + : "⋣" # U22e3 + : "⍡" # U2361 + : "⍑" # U2351 + : "⍕" # U2355 + : "⌶" # U2336 + : "⍊" # U234a + : "⍎" # U234e + : "⌶" # U2336 + : "⋪" # U22ea + : "⋫" # U22eb + : "⋬" # U22ec + : "⋭" # U22ed + : "⍚" # U235a + : "⌺" # U233a + : "⍸" # U2378 + : "⍹" # U2379 + : "⍶" # U2376 + : "⍞" # U235e + : "⍁" # U2341 + : "⍠" # U2360 + : "⍃" # U2343 + : "⌸" # U2338 + : "⍄" # U2344 + : "⍰" # U2370 + : "⍂" # U2342 + : "⌹" # U2339 + : "⍇" # U2347 + : "⍐" # U2350 + : "⍈" # U2348 + : "⍗" # U2357 + : "⍍" # U234d + : "⍔" # U2354 + : "⌻" # U233b + : "⍓" # U2353 + : "⍌" # U234c + : "⍯" # U236f + : "⌺" # U233a + : "⌼" # U233c + : "⍟" # U235f + : "⊖" # U2296 + : "⊙" # U2299 + : "⍉" # U2349 + : "⍜" # U235c + : "⌽" # U233d + : "⍥" # U2365 + : "⌾" # U233e + : "⌼" # U233c diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index 1414a7c99f..f2875c46c1 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -383,6 +383,7 @@ main (int argc, char *argv[]) { char *dir; + g_setenv ("LC_ALL", "en_US.UTF-8", TRUE); dir = g_dir_make_tmp ("composetableXXXXXX", NULL); g_setenv ("XDG_CACHE_HOME", dir, TRUE); g_free (dir); @@ -405,6 +406,7 @@ main (int argc, char *argv[]) g_test_add_data_func ("/compose-table/multi", "multi", compose_table_compare); g_test_add_data_func ("/compose-table/strings", "strings", compose_table_compare); g_test_add_data_func ("/compose-table/include", "include", compose_table_compare); + g_test_add_data_func ("/compose-table/system", "system", compose_table_compare); g_test_add_func ("/compose-table/include-cycle", compose_table_cycle); g_test_add_func ("/compose-table/include-nofile", compose_table_nofile); g_test_add_func ("/compose-table/match", compose_table_match); -- cgit v1.2.1 From 3b4b1c68781aad61fc6b91c9dff75b5790b4d8e4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 14:52:11 -0400 Subject: composetable: Reinterpret %L When we see include "%L" in a Compose file, use the builtin sequences. We no longer filter out duplicates wrt. to the builtin sequences. --- gtk/gtkcomposetable.c | 68 +- testsuite/gtk/compose/system.expected | 4973 +++++++++++++++++++++++++++++---- 2 files changed, 4480 insertions(+), 561 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index af064d7461..abb9d7f15e 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -30,6 +30,8 @@ #define GTK_COMPOSE_TABLE_MAGIC "GtkComposeTable" #define GTK_COMPOSE_TABLE_VERSION (2) +extern const GtkComposeTableCompact gtk_compose_table_compact; + /* Maximum length of sequences we parse */ #define MAX_COMPOSE_LEN 20 @@ -298,6 +300,40 @@ handle_substitutions (const char *start, return g_string_free (s, FALSE); } +static void +parser_add_default_sequences (GtkComposeParser *parser) +{ + const GtkComposeTableCompact *table = >k_compose_table_compact; + GtkComposeData *data; + + for (int idx = 0; idx < table->n_index_size; idx++) + { + const guint16 *seq_index = table->data + (idx * table->n_index_stride); + + for (int i = 1; i < table->max_seq_len; i++) + { + int row_stride = i + 1; + + for (int j = seq_index[i]; j < seq_index[i + 1]; j += row_stride) + { + char buf[8] = { 0, }; + + data = g_slice_new0 (GtkComposeData); + data->sequence = g_new0 (gunichar, row_stride + 2); + data->sequence[0] = seq_index[0]; + for (int k = 0; k < i; k++) + data->sequence[1 + k] = table->data[j + k]; + data->sequence[1 + i] = 0; + + g_unichar_to_utf8 (table->data[j + i], buf); + data->value = g_strdup (buf); + + parser->sequences = g_list_append (parser->sequences, data); + } + } + } +} + static void parser_handle_include (GtkComposeParser *parser, const char *line) @@ -334,11 +370,17 @@ parser_handle_include (GtkComposeParser *parser, if (*p && *p != '#') goto error; - path = handle_substitutions (start, end - start); - - parser_parse_file (parser, path); - - g_free (path); + if (end - start == 2 && + strncmp ("%L", start, end - start) == 0) + { + parser_add_default_sequences (parser); + } + else + { + path = handle_substitutions (start, end - start); + parser_parse_file (parser, path); + g_free (path); + } return; @@ -390,8 +432,6 @@ fail: gtk_compose_data_free (compose_data); } -extern const GtkComposeTableCompact gtk_compose_table_compact; - static void parser_read_file (GtkComposeParser *parser, const char *compose_file) @@ -428,7 +468,6 @@ gtk_compose_list_check_duplicated (GList *compose_list) static guint16 keysyms[MAX_COMPOSE_LEN + 1]; int i; int n_compose = 0; - gboolean compose_finish; gunichar output_char; char buf[8] = { 0, }; @@ -448,18 +487,7 @@ gtk_compose_list_check_duplicated (GList *compose_list) n_compose++; } - if (gtk_compose_table_compact_check (>k_compose_table_compact, - keysyms, n_compose, - &compose_finish, - NULL, - &output_char) && - compose_finish) - { - g_unichar_to_utf8 (output_char, buf); - if (strcmp (compose_data->value, buf) == 0) - removed_list = g_list_prepend (removed_list, compose_data); - } - else if (gtk_check_algorithmically (keysyms, n_compose, &output_char)) + if (gtk_check_algorithmically (keysyms, n_compose, &output_char)) { g_unichar_to_utf8 (output_char, buf); if (strcmp (compose_data->value, buf) == 0) diff --git a/testsuite/gtk/compose/system.expected b/testsuite/gtk/compose/system.expected index 6fdf4fab29..92a4710596 100644 --- a/testsuite/gtk/compose/system.expected +++ b/testsuite/gtk/compose/system.expected @@ -1,537 +1,4411 @@ -# n_seqs: 585 +# n_seqs: 4476 # max_seq_len: 5 - : "ុះ" - : "ុំ" - : "េះ" - : "ោះ" - : "ាំ" - : "M̀" - : "m̀" - : "Ɔ̀" - : "Ǝ̀" - : "Ɛ̀" - : "Ɩ̀" - : "Ʊ̀" - : "Ʋ̀" - : "ǝ̀" - : "ɔ̀" - : "ɛ̀" - : "ɩ̀" - : "ʊ̀" - : "ʋ̀" - : "Ŋ̀" - : "ŋ̀" - : "а̀" - : "о̀" - : "р̀" - : "у̀" - : "А̀" - : "О̀" - : "Р̀" - : "У̀" - : "ἂ" # U1f02 - : "ἃ" # U1f03 - : "Ἂ" # U1f0a - : "Ἃ" # U1f0b - : "ἒ" # U1f12 - : "ἓ" # U1f13 - : "Ἒ" # U1f1a - : "Ἓ" # U1f1b - : "ἢ" # U1f22 - : "ἣ" # U1f23 - : "Ἢ" # U1f2a - : "Ἣ" # U1f2b - : "ἲ" # U1f32 - : "ἳ" # U1f33 - : "Ἲ" # U1f3a - : "Ἳ" # U1f3b - : "ὂ" # U1f42 - : "ὃ" # U1f43 - : "Ὂ" # U1f4a - : "Ὃ" # U1f4b - : "ὒ" # U1f52 - : "ὓ" # U1f53 - : "Ὓ" # U1f5b - : "ὢ" # U1f62 - : "ὣ" # U1f63 - : "Ὢ" # U1f6a - : "Ὣ" # U1f6b - : "Ã̀" - : "Ẽ̀" - : "Ĩ̀" - : "Õ̀" - : "Ũ̀" - : "ã̀" - : "ẽ̀" - : "ĩ̀" - : "õ̀" - : "ũ̀" - : "Ɔ̃̀" - : "Ǝ̃̀" - : "Ɛ̃̀" - : "ǝ̃̀" - : "ɔ̃̀" - : "ɛ̃̀" - : "J́" - : "j́" - : "Ɔ́" - : "Ǝ́" - : "Ɛ́" - : "Ɩ́" - : "Ʊ́" - : "Ʋ́" - : "ǝ́" - : "ɔ́" - : "ɛ́" - : "ɩ́" - : "ʊ́" - : "ʋ́" - : "Ŋ́" - : "ŋ́" - : "ю́" - : "а́" - : "е́" - : "и́" - : "о́" - : "я́" - : "р́" - : "у́" - : "ы́" - : "э́" - : "Ю́́" - : "А́" - : "Е́" - : "И́" - : "О́" - : "Я́" - : "Р́" - : "У́" - : "Ы́" - : "Э́" - : "ἄ" # U1f04 - : "ἅ" # U1f05 - : "Ἄ" # U1f0c - : "Ἅ" # U1f0d - : "ἔ" # U1f14 - : "ἕ" # U1f15 - : "Ἔ" # U1f1c - : "Ἕ" # U1f1d - : "ἤ" # U1f24 - : "ἥ" # U1f25 - : "Ἤ" # U1f2c - : "Ἥ" # U1f2d - : "ἴ" # U1f34 - : "ἵ" # U1f35 - : "Ἴ" # U1f3c - : "Ἵ" # U1f3d - : "ὄ" # U1f44 - : "ὅ" # U1f45 - : "Ὄ" # U1f4c - : "Ὅ" # U1f4d - : "ὔ" # U1f54 - : "ὕ" # U1f55 - : "Ὕ" # U1f5d - : "ὤ" # U1f64 - : "ὥ" # U1f65 - : "Ὤ" # U1f6c - : "Ὥ" # U1f6d - : "Ã́" - : "Ẽ́" - : "Ĩ́" - : "ã́" - : "ẽ́" - : "ĩ́" - : "Ɔ̃́" - : "Ǝ̃́" - : "Ɛ̃́" - : "ǝ̃́" - : "ɔ̃́" - : "ɛ̃́" - : "Ɔ̂" - : "Ǝ̂" - : "Ɛ̂" - : "Ɩ̂" - : "Ʊ̂" - : "Ʋ̂" - : "ǝ̂" - : "ɔ̂" - : "ɛ̂" - : "ɩ̂" - : "ʊ̂" - : "ʋ̂" - : "а̂" - : "е̂" - : "и̂" - : "о̂" - : "р̂" - : "у̂" - : "А̂" - : "Е̂" - : "И̂" - : "О̂" - : "Р̂" - : "У̂" - : "Ậ" # U1eac - : "ậ" # U1ead - : "Ệ" # U1ec6 - : "ệ" # U1ec7 - : "Ộ" # U1ed8 - : "ộ" # U1ed9 - : "Ɔ̃" - : "Ǝ̃" - : "Ɛ̃" - : "ǝ̃" - : "ɔ̃" - : "ɛ̃" - : "Ɔ̄" - : "Ǝ̄" - : "Ɛ̄" - : "Ɩ̄" - : "Ʊ̄" - : "Ʋ̄" - : "ǝ̄" - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ǡ" # U1e0 - : "ǡ" # U1e1 - : "Ȱ" # U230 - : "ȱ" # U231 - : "ɔ̄" - : "ɛ̄" - : "ɩ̄" - : "ʊ̄" - : "ʋ̄" - : "а̄" - : "е̄" - : "о̄" - : "р̄" - : "А̄" - : "Е̄" - : "О̄" - : "Р̄" - : "Ḹ" # U1e38 - : "ḹ" # U1e39 - : "Ṝ" # U1e5c - : "ṝ" # U1e5d - : "Ǖ" # U1d5 - : "ǖ" # U1d6 - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "ẛ" # U1e9b - : "Ṩ" # U1e68 - : "ṩ" # U1e69 - : "Ȫ" # U22a - : "Ӛ" # U4da - : "ӛ" # U4db - : "Ӫ" # U4ea - : "ӫ" # U4eb - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "Ɔ̌" - : "Ǝ̌" - : "Ɛ̌" - : "Ɩ̌" - : "Ʊ̌" - : "Ʋ̌" - : "ǝ̌" - : "ɔ̌" - : "ɛ̌" - : "ɩ̌" - : "ʊ̌" - : "ʋ̌" - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "ᾀ" # U1f80 - : "ᾁ" # U1f81 - : "ᾂ" # U1f82 - : "ᾃ" # U1f83 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾆ" # U1f86 - : "ᾇ" # U1f87 - : "ᾈ" # U1f88 - : "ᾉ" # U1f89 - : "ᾊ" # U1f8a - : "ᾋ" # U1f8b - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾎ" # U1f8e - : "ᾏ" # U1f8f - : "ᾐ" # U1f90 - : "ᾑ" # U1f91 - : "ᾒ" # U1f92 - : "ᾓ" # U1f93 - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾖ" # U1f96 - : "ᾗ" # U1f97 - : "ᾘ" # U1f98 - : "ᾙ" # U1f99 - : "ᾚ" # U1f9a - : "ᾛ" # U1f9b - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾞ" # U1f9e - : "ᾟ" # U1f9f - : "ᾠ" # U1fa0 - : "ᾡ" # U1fa1 - : "ᾢ" # U1fa2 - : "ᾣ" # U1fa3 - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾦ" # U1fa6 - : "ᾧ" # U1fa7 - : "ᾨ" # U1fa8 - : "ᾩ" # U1fa9 - : "ᾪ" # U1faa - : "ᾫ" # U1fab - : "ᾬ" # U1fac - : "ᾭ" # U1fad - : "ᾮ" # U1fae - : "ᾯ" # U1faf - : "ᾲ" # U1fb2 - : "ῂ" # U1fc2 - : "ῲ" # U1ff2 - : "ᾷ" # U1fb7 - : "ῇ" # U1fc7 - : "ῷ" # U1ff7 - : "ᾂ" # U1f82 - : "ᾃ" # U1f83 - : "ᾊ" # U1f8a - : "ᾋ" # U1f8b - : "ᾒ" # U1f92 - : "ᾓ" # U1f93 - : "ᾚ" # U1f9a - : "ᾛ" # U1f9b - : "ᾢ" # U1fa2 - : "ᾣ" # U1fa3 - : "ᾪ" # U1faa - : "ᾫ" # U1fab - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾬ" # U1fac - : "ᾭ" # U1fad - : "ゔ" # U3094 - : "が" # U304c - : "ぎ" # U304e - : "ぐ" # U3050 - : "げ" # U3052 - : "ご" # U3054 - : "ざ" # U3056 - : "じ" # U3058 - : "ず" # U305a - : "ぜ" # U305c - : "ぞ" # U305e - : "だ" # U3060 - : "ぢ" # U3062 - : "づ" # U3065 - : "で" # U3067 - : "ど" # U3069 - : "ば" # U3070 - : "び" # U3073 - : "ぶ" # U3076 - : "べ" # U3079 - : "ぼ" # U307c - : "ゞ" # U309e - : "ヸ" # U30f8 - : "ヹ" # U30f9 - : "ヾ" # U30fe - : "ぱ" # U3071 - : "ぴ" # U3074 - : "ぷ" # U3077 - : "ぺ" # U307a - : "ぽ" # U307d - : "≮" # U226e - : "≠" # U2260 - : "≯" # U226f - : "Ѷ" # U476 - : "ѷ" # U477 - : "а̏" - : "е̏" - : "и̏" - : "о̏" - : "р̏" - : "у̏" - : "А̏" - : "Е̏" - : "И̏" - : "О̏" - : "Р̏" - : "У̏" - : "Ȃ" # U202 - : "Ȇ" # U206 - : "Ȋ" # U20a - : "Ȏ" # U20e - : "Ȓ" # U212 - : "Ȗ" # U216 - : "ȃ" # U203 - : "ȇ" # U207 - : "ȋ" # U20b - : "ȏ" # U20f - : "ȓ" # U213 - : "ȗ" # U217 - : "а̑" - : "е̑" - : "и̑" - : "о̑" - : "р̑" - : "у̑" - : "А̑" - : "Е̑" - : "И̑" - : "О̑" - : "Р̑" - : "У̑" - : "لآ" - : "لأ" - : "لإ" - : "لا" + : "ΐ" # U390 + : "ΰ" # U3b0 + : "`" # U60 + : "Ǜ" # U1db + : "ǜ" # U1dc + : "̀" # U300 + : "`" # U60 + : "Ǜ" # U1db + : "ǜ" # U1dc + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ἃ" # U1f0b + : "Ἓ" # U1f1b + : "Ἣ" # U1f2b + : "Ἳ" # U1f3b + : "Ὃ" # U1f4b + : "Ὓ" # U1f5b + : "Ὣ" # U1f6b + : "ἃ" # U1f03 + : "ἓ" # U1f13 + : "ἣ" # U1f23 + : "ἳ" # U1f33 + : "ὃ" # U1f43 + : "ὓ" # U1f53 + : "ὣ" # U1f63 + : "Ἂ" # U1f0a + : "Ἒ" # U1f1a + : "Ἢ" # U1f2a + : "Ἲ" # U1f3a + : "Ὂ" # U1f4a + : "Ὢ" # U1f6a + : "ἂ" # U1f02 + : "ἒ" # U1f12 + : "ἢ" # U1f22 + : "ἲ" # U1f32 + : "ὂ" # U1f42 + : "ὒ" # U1f52 + : "ὢ" # U1f62 + : "Ờ" # U1edc + : "Ừ" # U1eea + : "ờ" # U1edd + : "ừ" # U1eeb + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "'" # U27 + : "Ǘ" # U1d7 + : "ǘ" # U1d8 + : "́" # U301 + : "´" # Ub4 + : "΅" # U385 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "^" # U5e + : "⁽" # U207d + : "⁾" # U207e + : "⁺" # U207a + : "⁻" # U207b + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "̂" # U302 + : "Ầ" # U1ea6 + : "Ấ" # U1ea4 + : "Ẫ" # U1eaa + : "Ề" # U1ec0 + : "Ế" # U1ebe + : "Ồ" # U1ed2 + : "Ố" # U1ed0 + : "Ỗ" # U1ed6 + : "ầ" # U1ea7 + : "ấ" # U1ea5 + : "ẫ" # U1eab + : "ề" # U1ec1 + : "ế" # U1ebf + : "ồ" # U1ed3 + : "ố" # U1ed1 + : "ỗ" # U1ed7 + : "⁻" # U207b + : "㆒" # U3192 + : "㆜" # U319c + : "㆔" # U3194 + : "㆖" # U3196 + : "㆘" # U3198 + : "㆛" # U319b + : "㆗" # U3197 + : "㆚" # U319a + : "㆓" # U3193 + : "㆟" # U319f + : "㆕" # U3195 + : "㆞" # U319e + : "㆝" # U319d + : "㆙" # U3199 + : "^" # U5e + : "Ậ" # U1eac + : "Ệ" # U1ec6 + : "Ộ" # U1ed8 + : "ậ" # U1ead + : "ệ" # U1ec7 + : "ộ" # U1ed9 + : "℠" # U2120 + : "℠" # U2120 + : "™" # U2122 + : "™" # U2122 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "℠" # U2120 + : "℠" # U2120 + : "™" # U2122 + : "™" # U2122 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "²" # Ub2 + : "⁺" # U207a + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "~" # U7e + : "≲" # U2272 + : "≃" # U2243 + : "≳" # U2273 + : "̃" # U303 + : "Ṍ" # U1e4c + : "Ṏ" # U1e4e + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṏ" # U1e4f + : "ṹ" # U1e79 + : "Ȭ" # U22c + : "ȭ" # U22d + : "ἆ" # U1f06 + : "ἇ" # U1f07 + : "Ἆ" # U1f0e + : "Ἇ" # U1f0f + : "ἦ" # U1f26 + : "ἧ" # U1f27 + : "Ἦ" # U1f2e + : "Ἧ" # U1f2f + : "ἶ" # U1f36 + : "ἷ" # U1f37 + : "Ἶ" # U1f3e + : "Ἷ" # U1f3f + : "ὖ" # U1f56 + : "ὗ" # U1f57 + : "Ὗ" # U1f5f + : "ὦ" # U1f66 + : "ὧ" # U1f67 + : "Ὦ" # U1f6e + : "Ὧ" # U1f6f + : "~" # U7e + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "Ἇ" # U1f0f + : "Ἧ" # U1f2f + : "Ἷ" # U1f3f + : "Ὗ" # U1f5f + : "Ὧ" # U1f6f + : "ἇ" # U1f07 + : "ἧ" # U1f27 + : "ἷ" # U1f37 + : "ὗ" # U1f57 + : "ὧ" # U1f67 + : "Ἆ" # U1f0e + : "Ἦ" # U1f2e + : "Ἶ" # U1f3e + : "Ὦ" # U1f6e + : "ἆ" # U1f06 + : "ἦ" # U1f26 + : "ἶ" # U1f36 + : "ὖ" # U1f56 + : "ὦ" # U1f66 + : "Ỡ" # U1ee0 + : "Ữ" # U1eee + : "ỡ" # U1ee1 + : "ữ" # U1eef + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "¯" # Uaf + : "Ǖ" # U1d5 + : "ǖ" # U1d6 + : "̄" # U304 + : "Ḕ" # U1e14 + : "Ḗ" # U1e16 + : "Ṑ" # U1e50 + : "Ṓ" # U1e52 + : "ḕ" # U1e15 + : "ḗ" # U1e17 + : "ṑ" # U1e51 + : "ṓ" # U1e53 + : "¯" # Uaf + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ȭ" # U22c + : "ȭ" # U22d + : "˘" # U2d8 + : "̆" # U306 + : "Ằ" # U1eb0 + : "Ắ" # U1eae + : "Ẵ" # U1eb4 + : "ằ" # U1eb1 + : "ắ" # U1eaf + : "ẵ" # U1eb5 + : "˘" # U2d8 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "˙" # U2d9 + : "Ŀ" # U13f + : "ı" # U131 + : "ȷ" # U237 + : "ŀ" # U140 + : "̇" # U307 + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "˙" # U2d9 + : "ɟ" # U25f + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "Ṧ" # U1e66 + : "ṧ" # U1e67 + : "ẛ" # U1e9b + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : """ # U22 + : "̈́" # U344 + : "̈" # U308 + : "̈́" # U344 + : "Ḯ" # U1e2e + : "Ǜ" # U1db + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǜ" # U1dc + : "ǘ" # U1d8 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "Ǟ" # U1de + : "ǟ" # U1df + : "ȫ" # U22b + : "΅" # U385 + : "¨" # Ua8 + : "⩷" # U2a77 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "°" # Ub0 + : "̊" # U30a + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "°" # Ub0 + : "˝" # U2dd + : "̋" # U30b + : "˝" # U2dd + : "ˇ" # U2c7 + : "₍" # U208d + : "₎" # U208e + : "₊" # U208a + : "₋" # U208b + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "̌" # U30c + : "Dž" # U1c5 + : "ˇ" # U2c7 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "¸" # Ub8 + : "̧" # U327 + : "₵" # U20b5 + : "¸" # Ub8 + : "₵" # U20b5 + : "₵" # U20b5 + : "˛" # U2db + : "̨" # U328 + : "˛" # U2db + : "ͺ" # U37a + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ͺ" # U37a + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾉ" # U1f89 + : "ᾙ" # U1f99 + : "ᾩ" # U1fa9 + : "ᾁ" # U1f81 + : "ᾑ" # U1f91 + : "ᾡ" # U1fa1 + : "ᾈ" # U1f88 + : "ᾘ" # U1f98 + : "ᾨ" # U1fa8 + : "ᾀ" # U1f80 + : "ᾐ" # U1f90 + : "ᾠ" # U1fa0 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "̣" # U323 + : "⨥" # U2a25 + : "⨪" # U2a2a + : "⩦" # U2a66 + : "̣" # U323 + : "̣" # U323 + : "Ợ" # U1ee2 + : "Ự" # U1ef0 + : "ợ" # U1ee3 + : "ự" # U1ef1 + : "̉" # U309 + : "Ɓ" # U181 + : "Ƈ" # U187 + : "Ɗ" # U18a + : "Ƒ" # U191 + : "Ɠ" # U193 + : "Ƙ" # U198 + : "Ɱ" # U2c6e + : "Ɲ" # U19d + : "Ƥ" # U1a4 + : "Ƭ" # U1ac + : "Ʋ" # U1b2 + : "Ⱳ" # U2c72 + : "Ȥ" # U224 + : "ɓ" # U253 + : "ƈ" # U188 + : "ɗ" # U257 + : "ƒ" # U192 + : "ɠ" # U260 + : "ɦ" # U266 + : "ƙ" # U199 + : "ɱ" # U271 + : "ɲ" # U272 + : "ƥ" # U1a5 + : "ʠ" # U2a0 + : "ɼ" # U27c + : "ʂ" # U282 + : "ƭ" # U1ad + : "ʋ" # U28b + : "ⱳ" # U2c73 + : "ȥ" # U225 + : "̉" # U309 + : "ᶑ" # U1d91 + : "ɝ" # U25d + : "ʄ" # U284 + : "ɻ" # U27b + : "̉" # U309 + : "ϒ" # U3d2 + : "Ở" # U1ede + : "Ử" # U1eec + : "ở" # U1edf + : "ử" # U1eed + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "̛" # U31b + : "̛" # U31b + : "̛" # U31b + : "/" # U2f + : "ƻ" # U1bb + : "Ⱥ" # U23a + : "Ƀ" # U243 + : "Ȼ" # U23b + : "Đ" # U110 + : "Ɇ" # U246 + : "Ǥ" # U1e4 + : "Ħ" # U126 + : "Ɨ" # U197 + : "Ɉ" # U248 + : "Ł" # U141 + : "Ø" # Ud8 + : "Ᵽ" # U2c63 + : "Ɍ" # U24c + : "Ŧ" # U166 + : "Ʉ" # U244 + : "Ɏ" # U24e + : "Ƶ" # U1b5 + : "ⱥ" # U2c65 + : "ƀ" # U180 + : "ȼ" # U23c + : "đ" # U111 + : "ɇ" # U247 + : "ǥ" # U1e5 + : "ħ" # U127 + : "ɨ" # U268 + : "ɉ" # U249 + : "ł" # U142 + : "ø" # Uf8 + : "ᵽ" # U1d7d + : "ɍ" # U24d + : "ŧ" # U167 + : "ʉ" # U289 + : "ɏ" # U24f + : "ƶ" # U1b6 + : "̸" # U338 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "ɟ" # U25f + : "ᵼ" # U1d7c + : "≰" # U2270 + : "≱" # U2271 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "ɟ" # U25f + : "/" # U2f + : "ϼ" # U3fc + : "⫰" # U2af0 + : "⨦" # U2a26 + : "⩷" # U2a77 + : "," # U2c + : "̦" # U326 + : "," # U2c + : "¤" # Ua4 + : "₳" # U20b3 + : "₱" # U20b1 + : "₡" # U20a1 + : "₯" # U20af + : "₠" # U20a0 + : "₣" # U20a3 + : "₲" # U20b2 + : "₴" # U20b4 + : "៛" # U17db + : "₭" # U20ad + : "₤" # U20a4 + : "ℳ" # U2133 + : "₦" # U20a6 + : "૱" # Uaf1 + : "₧" # U20a7 + : "₨" # U20a8 + : "$" # U24 + : "₮" # U20ae + : "圓" # U5713 + : "₩" # U20a9 + : "円" # U5186 + : "؋" # U60b + : "฿" # Ue3f + : "¢" # Ua2 + : "₫" # U20ab + : "€" # U20ac + : "ƒ" # U192 + : "₲" # U20b2 + : "₴" # U20b4 + : "﷼" # Ufdfc + : "₭" # U20ad + : "£" # Ua3 + : "₥" # U20a5 + : "₦" # U20a6 + : "௹" # Ubf9 + : "₰" # U20b0 + : "₢" # U20a2 + : "₪" # U20aa + : "৳" # U9f3 + : "元" # U5143 + : "₩" # U20a9 + : "¥" # Ua5 + : "¤" # Ua4 + : "₵" # U20b5 + : "৲" # U9f2 + : "₵" # U20b5 + : "৲" # U9f2 + : "₵" # U20b5 + : "₵" # U20b5 + : "¤" # Ua4 + : "µ" # Ub5 + : "Α" # U391 + : "Β" # U392 + : "Δ" # U394 + : "Ε" # U395 + : "Φ" # U3a6 + : "Γ" # U393 + : "Η" # U397 + : "Ι" # U399 + : "Θ" # U398 + : "Κ" # U39a + : "Λ" # U39b + : "Μ" # U39c + : "Ν" # U39d + : "Ο" # U39f + : "Π" # U3a0 + : "Χ" # U3a7 + : "Ρ" # U3a1 + : "Σ" # U3a3 + : "Τ" # U3a4 + : "Υ" # U3a5 + : "Ω" # U3a9 + : "Ξ" # U39e + : "Ψ" # U3a8 + : "Ζ" # U396 + : "α" # U3b1 + : "β" # U3b2 + : "δ" # U3b4 + : "ε" # U3b5 + : "φ" # U3c6 + : "γ" # U3b3 + : "η" # U3b7 + : "ι" # U3b9 + : "θ" # U3b8 + : "κ" # U3ba + : "λ" # U3bb + : "μ" # U3bc + : "ν" # U3bd + : "ο" # U3bf + : "π" # U3c0 + : "χ" # U3c7 + : "ρ" # U3c1 + : "σ" # U3c3 + : "τ" # U3c4 + : "υ" # U3c5 + : "ω" # U3c9 + : "ξ" # U3be + : "ψ" # U3c8 + : "ζ" # U3b6 + : "µ" # Ub5 + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "ϒ" # U3d2 + : "ϼ" # U3fc + : "µ" # Ub5 + : " " # Ua0 + : "'" # U27 + : "˘" # U2d8 + : "¸" # Ub8 + : "~" # U7e + : " " # U2008 + : "ˇ" # U2c7 + : "^" # U5e + : "^" # U5e + : "`" # U60 + : "~" # U7e + : "¡" # Ua1 + : "Ợ" # U1ee2 + : "Ự" # U1ef0 + : "ợ" # U1ee3 + : "ự" # U1ef1 + : "‽" # U203d + : "Ạ" # U1ea0 + : "Ḅ" # U1e04 + : "Ḍ" # U1e0c + : "Ẹ" # U1eb8 + : "Ḥ" # U1e24 + : "Ị" # U1eca + : "Ḳ" # U1e32 + : "Ḷ" # U1e36 + : "Ṃ" # U1e42 + : "Ṇ" # U1e46 + : "Ọ" # U1ecc + : "¶" # Ub6 + : "Ṛ" # U1e5a + : "Ṣ" # U1e62 + : "Ṭ" # U1e6c + : "Ụ" # U1ee4 + : "Ṿ" # U1e7e + : "Ẉ" # U1e88 + : "Ỵ" # U1ef4 + : "Ẓ" # U1e92 + : "¦" # Ua6 + : "ạ" # U1ea1 + : "ḅ" # U1e05 + : "ḍ" # U1e0d + : "ẹ" # U1eb9 + : "ḥ" # U1e25 + : "ị" # U1ecb + : "ḳ" # U1e33 + : "ḷ" # U1e37 + : "ṃ" # U1e43 + : "ṇ" # U1e47 + : "ọ" # U1ecd + : "¶" # Ub6 + : "ṛ" # U1e5b + : "ṣ" # U1e63 + : "ṭ" # U1e6d + : "ụ" # U1ee5 + : "ṿ" # U1e7f + : "ẉ" # U1e89 + : "ỵ" # U1ef5 + : "ẓ" # U1e93 + : "Ợ" # U1ee2 + : "Ự" # U1ef0 + : "ợ" # U1ee3 + : "ự" # U1ef1 + : "¨" # Ua8 : "̈́" # U344 - : "J́" - : "j́" - : "ю́" - : "а́" - : "е́" - : "и́" - : "о́" - : "я́" - : "р́" - : "у́" - : "ы́" - : "э́" - : "Ю́́" - : "А́" - : "Е́" - : "И́" - : "О́" - : "Я́" - : "Р́" - : "У́" - : "Ы́" - : "Э́" - : "㊿" # U32bf - : "㊿" # U32bf - : "⍟" # U235f - : "Ā" # U100 - : "Ō" # U14c - : "⊖" # U2296 - : "⊙" # U2299 - : "Ā" # U100 - : "Ā" # U100 - : "🖕" # U1f595 - : "J́" - : "J́" - : "₤" # U20a4 - : "🖖" # U1f596 - : "Ō" # U14c - : "Ō" # U14c - : "🙌" # U1f64c - : "⍉" # U2349 - : "а̂" - : "е̂" - : "и̂" - : "о̂" - : "р̂" - : "у̂" - : "А̂" - : "Е̂" - : "И̂" - : "О̂" - : "Р̂" - : "У̂" - : "а̄" - : "е̄" - : "о̄" - : "р̄" - : "А̄" - : "Е̄" - : "О̄" - : "Р̄" + : "΅" # U385 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "„" # U201e + : "“" # U201c + : "”" # U201d + : "Ä" # Uc4 + : "Ë" # Ucb + : "Ḧ" # U1e26 + : "Ï" # Ucf + : "Ö" # Ud6 + : "Ü" # Udc + : "Ẅ" # U1e84 + : "Ẍ" # U1e8c + : "Ÿ" # U178 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "ä" # Ue4 + : "ë" # Ueb + : "ḧ" # U1e27 + : "ï" # Uef + : "ö" # Uf6 + : "ẗ" # U1e97 + : "ü" # Ufc + : "ẅ" # U1e85 + : "ẍ" # U1e8d + : "ÿ" # Uff + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "̈́" # U344 + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "ϔ" # U3d4 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ӛ" # U4da + : "ӛ" # U4db + : "Ӫ" # U4ea + : "ӫ" # U4eb + : "ї" # U457 + : "Ї" # U407 + : "ӓ" # U4d3 + : "ё" # U451 + : "ӥ" # U4e5 + : "ӧ" # U4e7 + : "ӱ" # U4f1 + : "ӝ" # U4dd + : "ӹ" # U4f9 + : "ӟ" # U4df + : "ӭ" # U4ed + : "ӵ" # U4f5 + : "Ӓ" # U4d2 + : "Ё" # U401 + : "Ӥ" # U4e4 + : "Ӧ" # U4e6 + : "Ӱ" # U4f0 + : "Ӝ" # U4dc + : "Ӹ" # U4f8 + : "Ӟ" # U4de + : "Ӭ" # U4ec + : "Ӵ" # U4f4 + : "Ϊ" # U3aa + : "Ϋ" # U3ab + : "ϊ" # U3ca + : "ϋ" # U3cb + : "̈́" # U344 + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "♯" # U266f + : "♫" # U266b + : "♬" # U266c + : "♭" # U266d + : "♪" # U266a + : "♮" # U266e + : "♩" # U2669 + : "‰" # U2030 + : "'" # U27 + : "΅" # U385 + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "´" # Ub4 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "‚" # U201a + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "‘" # U2018 + : "’" # U2019 + : "Á" # Uc1 + : "Ć" # U106 + : "É" # Uc9 + : "Ǵ" # U1f4 + : "Í" # Ucd + : "Ḱ" # U1e30 + : "Ĺ" # U139 + : "Ḿ" # U1e3e + : "Ń" # U143 + : "Ó" # Ud3 + : "Ṕ" # U1e54 + : "Ŕ" # U154 + : "Ś" # U15a + : "Ú" # Uda + : "Ẃ" # U1e82 + : "Ý" # Udd + : "Ź" # U179 + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "á" # Ue1 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "ć" # U107 + : "é" # Ue9 + : "ǵ" # U1f5 + : "í" # Ued + : "ḱ" # U1e31 + : "ĺ" # U13a + : "ḿ" # U1e3f + : "ń" # U144 + : "ó" # Uf3 + : "ṕ" # U1e55 + : "ŕ" # U155 + : "ś" # U15b + : "ú" # Ufa + : "ẃ" # U1e83 + : "ý" # Ufd + : "ź" # U17a + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ấ" # U1ea4 + : "Ǻ" # U1fa + : "Ǽ" # U1fc + : "Ḉ" # U1e08 + : "Ế" # U1ebe + : "Ḯ" # U1e2e + : "Ố" # U1ed0 + : "Ṍ" # U1e4c + : "Ǿ" # U1fe + : "Ǘ" # U1d7 + : "ấ" # U1ea5 + : "ǻ" # U1fb + : "ǽ" # U1fd + : "ḉ" # U1e09 + : "ế" # U1ebf + : "ḯ" # U1e2f + : "ố" # U1ed1 + : "ṍ" # U1e4d + : "ǿ" # U1ff + : "ǘ" # U1d8 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḗ" # U1e16 + : "ḗ" # U1e17 + : "Ṓ" # U1e52 + : "Ṹ" # U1e78 + : "ṓ" # U1e53 + : "ṹ" # U1e79 + : "ѓ" # U453 + : "ќ" # U45c + : "Ѓ" # U403 + : "Ќ" # U40c + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ά" # U386 + : "Έ" # U388 + : "Ή" # U389 + : "Ί" # U38a + : "Ό" # U38c + : "Ύ" # U38e + : "Ώ" # U38f + : "ά" # U3ac + : "έ" # U3ad + : "ή" # U3ae + : "ί" # U3af + : "ό" # U3cc + : "ύ" # U3cd + : "ώ" # U3ce + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "⍞" # U235e + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "˘" # U2d8 + : "[" # U5b + : "{" # U7b + : "⓪" # U24ea + : "①" # U2460 + : "⑩" # U2469 + : "⑪" # U246a + : "⑫" # U246b + : "⑬" # U246c + : "⑭" # U246d + : "⑮" # U246e + : "⑯" # U246f + : "⑰" # U2470 + : "⑱" # U2471 + : "⑲" # U2472 + : "⑫" # U246b + : "⑩" # U2469 + : "⑪" # U246a + : "⑫" # U246b + : "⑬" # U246c + : "⑭" # U246d + : "⑮" # U246e + : "⑯" # U246f + : "⑰" # U2470 + : "⑱" # U2471 + : "⑲" # U2472 + : "②" # U2461 + : "⑳" # U2473 + : "㉑" # U3251 + : "㉒" # U3252 + : "㉓" # U3253 + : "㉔" # U3254 + : "㉕" # U3255 + : "㉖" # U3256 + : "㉗" # U3257 + : "㉘" # U3258 + : "㉙" # U3259 + : "㉒" # U3252 + : "⑳" # U2473 + : "㉑" # U3251 + : "㉒" # U3252 + : "㉓" # U3253 + : "㉔" # U3254 + : "㉕" # U3255 + : "㉖" # U3256 + : "㉗" # U3257 + : "㉘" # U3258 + : "㉙" # U3259 + : "③" # U2462 + : "㉚" # U325a + : "㉛" # U325b + : "㉜" # U325c + : "㉝" # U325d + : "㉞" # U325e + : "㉟" # U325f + : "㊱" # U32b1 + : "㊲" # U32b2 + : "㊳" # U32b3 + : "㊴" # U32b4 + : "㉜" # U325c + : "㉚" # U325a + : "㉛" # U325b + : "㉜" # U325c + : "㉝" # U325d + : "㉞" # U325e + : "㉟" # U325f + : "㊱" # U32b1 + : "㊲" # U32b2 + : "㊳" # U32b3 + : "㊴" # U32b4 + : "④" # U2463 + : "㊵" # U32b5 + : "㊶" # U32b6 + : "㊷" # U32b7 + : "㊸" # U32b8 + : "㊹" # U32b9 + : "㊺" # U32ba + : "㊻" # U32bb + : "㊼" # U32bc + : "㊽" # U32bd + : "㊾" # U32be + : "㊷" # U32b7 + : "㊵" # U32b5 + : "㊶" # U32b6 + : "㊷" # U32b7 + : "㊸" # U32b8 + : "㊹" # U32b9 + : "㊺" # U32ba + : "㊻" # U32bb + : "㊼" # U32bc + : "㊽" # U32bd + : "㊾" # U32be + : "⑤" # U2464 + : "㊿" # U32bf + : "⑥" # U2465 + : "⑦" # U2466 + : "⑧" # U2467 + : "⑨" # U2468 + : "Ă" # U102 + : "Ⓐ" # U24b6 + : "Ⓑ" # U24b7 + : "Ⓒ" # U24b8 + : "Ⓓ" # U24b9 + : "Ⓔ" # U24ba + : "Ⓕ" # U24bb + : "Ğ" # U11e + : "Ⓖ" # U24bc + : "Ⓗ" # U24bd + : "Ⓘ" # U24be + : "Ⓙ" # U24bf + : "Ⓚ" # U24c0 + : "Ⓛ" # U24c1 + : "Ⓜ" # U24c2 + : "Ⓝ" # U24c3 + : "Ⓞ" # U24c4 + : "Ⓟ" # U24c5 + : "Ⓠ" # U24c6 + : "Ⓡ" # U24c7 + : "Ⓢ" # U24c8 + : "Ⓣ" # U24c9 + : "Ⓤ" # U24ca + : "Ⓥ" # U24cb + : "Ⓦ" # U24cc + : "Ⓧ" # U24cd + : "Ⓨ" # U24ce + : "Ⓩ" # U24cf + : "ă" # U103 + : "ⓐ" # U24d0 + : "ⓑ" # U24d1 + : "©" # Ua9 + : "ⓒ" # U24d2 + : "ⓓ" # U24d3 + : "ⓔ" # U24d4 + : "ⓕ" # U24d5 + : "ğ" # U11f + : "ⓖ" # U24d6 + : "ⓗ" # U24d7 + : "ⓘ" # U24d8 + : "ⓙ" # U24d9 + : "ⓚ" # U24da + : "ⓛ" # U24db + : "ⓜ" # U24dc + : "ⓝ" # U24dd + : "ⓞ" # U24de + : "ⓟ" # U24df + : "ⓠ" # U24e0 + : "®" # Uae + : "ⓡ" # U24e1 + : "ⓢ" # U24e2 + : "ⓣ" # U24e3 + : "ⓤ" # U24e4 + : "ⓥ" # U24e5 + : "ⓦ" # U24e6 + : "ⓧ" # U24e7 + : "ⓨ" # U24e8 + : "ⓩ" # U24e9 + : "㋾" # U32fe + : "㋐" # U32d0 + : "㋑" # U32d1 + : "㋒" # U32d2 + : "㋓" # U32d3 + : "㋔" # U32d4 + : "㋕" # U32d5 + : "㋖" # U32d6 + : "㋗" # U32d7 + : "㋘" # U32d8 + : "㋙" # U32d9 + : "㋚" # U32da + : "㋛" # U32db + : "㋜" # U32dc + : "㋝" # U32dd + : "㋞" # U32de + : "㋟" # U32df + : "㋠" # U32e0 + : "㋡" # U32e1 + : "㋢" # U32e2 + : "㋣" # U32e3 + : "㋤" # U32e4 + : "㋥" # U32e5 + : "㋦" # U32e6 + : "㋧" # U32e7 + : "㋨" # U32e8 + : "㋩" # U32e9 + : "㋪" # U32ea + : "㋫" # U32eb + : "㋬" # U32ec + : "㋭" # U32ed + : "㋮" # U32ee + : "㋯" # U32ef + : "㋰" # U32f0 + : "㋱" # U32f1 + : "㋲" # U32f2 + : "㋳" # U32f3 + : "㋴" # U32f4 + : "㋵" # U32f5 + : "㋶" # U32f6 + : "㋷" # U32f7 + : "㋸" # U32f8 + : "㋹" # U32f9 + : "㋺" # U32fa + : "㋻" # U32fb + : "Ἁ" # U1f09 + : "Ἑ" # U1f19 + : "Ἡ" # U1f29 + : "Ἱ" # U1f39 + : "Ὁ" # U1f49 + : "Ῥ" # U1fec + : "Ὑ" # U1f59 + : "Ὡ" # U1f69 + : "ἁ" # U1f01 + : "ἑ" # U1f11 + : "ἡ" # U1f21 + : "ἱ" # U1f31 + : "ὁ" # U1f41 + : "ῥ" # U1fe5 + : "ὑ" # U1f51 + : "ὡ" # U1f61 + : "㉠" # U3260 + : "㉮" # U326e + : "㉡" # U3261 + : "㉯" # U326f + : "㉢" # U3262 + : "㉰" # U3270 + : "㉣" # U3263 + : "㉱" # U3271 + : "㉤" # U3264 + : "㉲" # U3272 + : "㉥" # U3265 + : "㉳" # U3273 + : "㉦" # U3266 + : "㉴" # U3274 + : "㉧" # U3267 + : "㉵" # U3275 + : "㉨" # U3268 + : "㉶" # U3276 + : "㉩" # U3269 + : "㉷" # U3277 + : "㉪" # U326a + : "㉸" # U3278 + : "㉫" # U326b + : "㉹" # U3279 + : "㉬" # U326c + : "㉺" # U327a + : "㉭" # U326d + : "㉻" # U327b + : "㋼" # U32fc + : "㋽" # U32fd + : "㊀" # U3280 + : "㊆" # U3286 + : "㊂" # U3282 + : "㊤" # U32a4 + : "㊦" # U32a6 + : "㊥" # U32a5 + : "㊈" # U3288 + : "㊁" # U3281 + : "㊄" # U3284 + : "㊭" # U32ad + : "㊡" # U32a1 + : "㊝" # U329d + : "㊇" # U3287 + : "㊅" # U3285 + : "㊢" # U32a2 + : "㊘" # U3298 + : "㊩" # U32a9 + : "㊉" # U3289 + : "㊯" # U32af + : "㊞" # U329e + : "㊨" # U32a8 + : "㊔" # U3294 + : "㊃" # U3283 + : "㊏" # U328f + : "㊰" # U32b0 + : "㊛" # U329b + : "㊫" # U32ab + : "㊪" # U32aa + : "㊧" # U32a7 + : "㊐" # U3290 + : "㊊" # U328a + : "㊒" # U3292 + : "㊍" # U328d + : "㊑" # U3291 + : "㊣" # U32a3 + : "㊌" # U328c + : "㊟" # U329f + : "㊋" # U328b + : "㊕" # U3295 + : "㊚" # U329a + : "㊬" # U32ac + : "㊓" # U3293 + : "㊗" # U3297 + : "㊙" # U3299 + : "㊖" # U3296 + : "㊮" # U32ae + : "㊜" # U329c + : "㊎" # U328e + : "㊠" # U32a0 + : "②" # U2461 + : "⑳" # U2473 + : "㉑" # U3251 + : "㉒" # U3252 + : "㉓" # U3253 + : "㉔" # U3254 + : "㉕" # U3255 + : "㉖" # U3256 + : "㉗" # U3257 + : "㉘" # U3258 + : "㉙" # U3259 + : "㉒" # U3252 + : "⑳" # U2473 + : "㉑" # U3251 + : "㉒" # U3252 + : "㉓" # U3253 + : "㉔" # U3254 + : "㉕" # U3255 + : "㉖" # U3256 + : "㉗" # U3257 + : "㉘" # U3258 + : "㉙" # U3259 + : "⓪" # U24ea + : "①" # U2460 + : "⑩" # U2469 + : "⑪" # U246a + : "⑫" # U246b + : "⑬" # U246c + : "⑭" # U246d + : "⑮" # U246e + : "⑯" # U246f + : "⑰" # U2470 + : "⑱" # U2471 + : "⑲" # U2472 + : "⑫" # U246b + : "⑩" # U2469 + : "⑪" # U246a + : "⑫" # U246b + : "⑬" # U246c + : "⑭" # U246d + : "⑮" # U246e + : "⑯" # U246f + : "⑰" # U2470 + : "⑱" # U2471 + : "⑲" # U2472 + : "②" # U2461 + : "⑳" # U2473 + : "㉑" # U3251 + : "㉒" # U3252 + : "㉓" # U3253 + : "㉔" # U3254 + : "㉕" # U3255 + : "㉖" # U3256 + : "㉗" # U3257 + : "㉘" # U3258 + : "㉙" # U3259 + : "㉒" # U3252 + : "⑳" # U2473 + : "㉑" # U3251 + : "㉒" # U3252 + : "㉓" # U3253 + : "㉔" # U3254 + : "㉕" # U3255 + : "㉖" # U3256 + : "㉗" # U3257 + : "㉘" # U3258 + : "㉙" # U3259 + : "③" # U2462 + : "㉚" # U325a + : "㉛" # U325b + : "㉜" # U325c + : "㉝" # U325d + : "㉞" # U325e + : "㉟" # U325f + : "㊱" # U32b1 + : "㊲" # U32b2 + : "㊳" # U32b3 + : "㊴" # U32b4 + : "㉜" # U325c + : "㉚" # U325a + : "㉛" # U325b + : "㉜" # U325c + : "㉝" # U325d + : "㉞" # U325e + : "㉟" # U325f + : "㊱" # U32b1 + : "㊲" # U32b2 + : "㊳" # U32b3 + : "㊴" # U32b4 + : "④" # U2463 + : "㊵" # U32b5 + : "㊶" # U32b6 + : "㊷" # U32b7 + : "㊸" # U32b8 + : "㊹" # U32b9 + : "㊺" # U32ba + : "㊻" # U32bb + : "㊼" # U32bc + : "㊽" # U32bd + : "㊾" # U32be + : "㊷" # U32b7 + : "㊵" # U32b5 + : "㊶" # U32b6 + : "㊷" # U32b7 + : "㊸" # U32b8 + : "㊹" # U32b9 + : "㊺" # U32ba + : "㊻" # U32bb + : "㊼" # U32bc + : "㊽" # U32bd + : "㊾" # U32be + : "⑤" # U2464 + : "㊿" # U32bf + : "⑥" # U2465 + : "⑦" # U2466 + : "⑧" # U2467 + : "⑨" # U2468 + : "]" # U5d + : "}" # U7d + : "Ἀ" # U1f08 + : "Ἐ" # U1f18 + : "Ἠ" # U1f28 + : "Ἰ" # U1f38 + : "Ὀ" # U1f48 + : "Ὠ" # U1f68 + : "ἀ" # U1f00 + : "ἐ" # U1f10 + : "ἠ" # U1f20 + : "ἰ" # U1f30 + : "ὀ" # U1f40 + : "ῤ" # U1fe4 + : "ὐ" # U1f50 + : "ὠ" # U1f60 + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "°" # Ub0 + : "Å" # Uc5 + : "Ů" # U16e + : "å" # Ue5 + : "ů" # U16f + : "⍣" # U2363 + : "⍟" # U235f + : "#" # U23 + : "±" # Ub1 + : "Ơ" # U1a0 + : "Ư" # U1af + : "ơ" # U1a1 + : "ư" # U1b0 + : "¸" # Ub8 + : "„" # U201e + : "‚" # U201a + : "¸" # Ub8 + : "¬" # Uac + : "Ą" # U104 + : "Ç" # Uc7 + : "Ḑ" # U1e10 + : "Ę" # U118 + : "Ģ" # U122 + : "Ḩ" # U1e28 + : "Į" # U12e + : "Ķ" # U136 + : "Ļ" # U13b + : "Ņ" # U145 + : "Ǫ" # U1ea + : "Ŗ" # U156 + : "Ş" # U15e + : "Ţ" # U162 + : "Ų" # U172 + : "ą" # U105 + : "ç" # Ue7 + : "ḑ" # U1e11 + : "ę" # U119 + : "ģ" # U123 + : "ḩ" # U1e29 + : "į" # U12f + : "ķ" # U137 + : "ļ" # U13c + : "ņ" # U146 + : "ǫ" # U1eb + : "ŗ" # U157 + : "ş" # U15f + : "ţ" # U163 + : "ų" # U173 + : "~" # U7e + : "{" # U7b + : "}" # U7d + : "±" # Ub1 + : "¬" # Uac + : "­" # Uad + : "—" # U2014 + : "–" # U2013 + : "⌿" # U233f + : "÷" # Uf7 + : "→" # U2192 + : "Ã" # Uc3 + : "Đ" # U110 + : "Ē" # U112 + : "Ī" # U12a + : "£" # Ua3 + : "Ñ" # Ud1 + : "Õ" # Ud5 + : "Ū" # U16a + : "¥" # Ua5 + : "⍀" # U2340 + : "¯" # Uaf + : "ā" # U101 + : "đ" # U111 + : "ē" # U113 + : "ī" # U12b + : "£" # Ua3 + : "ñ" # Uf1 + : "ō" # U14d + : "ū" # U16b + : "¥" # Ua5 + : "⊖" # U2296 + : "⍏" # U234f + : "⍖" # U2356 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "·" # Ub7 + : "…" # U2026 + : "∵" # U2235 + : "‹" # U2039 + : "•" # U2022 + : "›" # U203a + : "Ȧ" # U226 + : "Ḃ" # U1e02 + : "Ċ" # U10a + : "Ḋ" # U1e0a + : "Ė" # U116 + : "Ḟ" # U1e1e + : "Ġ" # U120 + : "Ḣ" # U1e22 + : "İ" # U130 + : "Ṁ" # U1e40 + : "Ṅ" # U1e44 + : "Ȯ" # U22e + : "Ṗ" # U1e56 + : "Ṙ" # U1e58 + : "Ṡ" # U1e60 + : "Ṫ" # U1e6a + : "Ẇ" # U1e86 + : "Ẋ" # U1e8a + : "Ẏ" # U1e8e + : "Ż" # U17b + : "·" # Ub7 + : "ȧ" # U227 + : "ḃ" # U1e03 + : "ċ" # U10b + : "ḋ" # U1e0b + : "ė" # U117 + : "ḟ" # U1e1f + : "ġ" # U121 + : "ḣ" # U1e23 + : "ı" # U131 + : "ṁ" # U1e41 + : "ṅ" # U1e45 + : "ȯ" # U22f + : "ṗ" # U1e57 + : "ṙ" # U1e59 + : "ṡ" # U1e61 + : "ṫ" # U1e6b + : "ẇ" # U1e87 + : "ẋ" # U1e8b + : "ẏ" # U1e8f + : "ż" # U17c + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "ẛ" # U1e9b + : "Ṥ" # U1e64 + : "Ṧ" # U1e66 + : "ṥ" # U1e65 + : "ṧ" # U1e67 + : "⊙" # U2299 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "Ṧ" # U1e66 + : "ṧ" # U1e67 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "⌿" # U233f + : "\" # U5c + : "\" # U5c + : "≠" # U2260 + : "₡" # U20a1 + : "Đ" # U110 + : "Ǥ" # U1e4 + : "Ħ" # U126 + : "Ɨ" # U197 + : "Ł" # U141 + : "Ø" # Ud8 + : "Ŧ" # U166 + : "µ" # Ub5 + : "Ƶ" # U1b5 + : "|" # U7c + : "ƀ" # U180 + : "¢" # Ua2 + : "đ" # U111 + : "ǥ" # U1e5 + : "ħ" # U127 + : "ɨ" # U268 + : "ł" # U142 + : "₥" # U20a5 + : "ø" # Uf8 + : "ŧ" # U167 + : "µ" # Ub5 + : "√" # U221a + : "ƶ" # U1b6 + : "ʡ" # U2a1 + : "Ұ" # U4b0 + : "ұ" # U4b1 + : "ғ" # U493 + : "ҟ" # U49f + : "Ғ" # U492 + : "Ҟ" # U49e + : "↚" # U219a + : "↛" # U219b + : "↮" # U21ae + : "⍁" # U2341 + : "°" # Ub0 + : "↉" # U2189 + : "©" # Ua9 + : "§" # Ua7 + : "¤" # Ua4 + : "°" # Ub0 + : "©" # Ua9 + : "§" # Ua7 + : "¤" # Ua4 + : "⍬" # U236c + : "⅒" # U2152 + : "½" # Ubd + : "⅓" # U2153 + : "¼" # Ubc + : "⅕" # U2155 + : "⅙" # U2159 + : "⅐" # U2150 + : "⅛" # U215b + : "⅑" # U2151 + : "¹" # Ub9 + : "¹" # Ub9 + : "¹" # Ub9 + : "⅔" # U2154 + : "⅖" # U2156 + : "²" # Ub2 + : "²" # Ub2 + : "²" # Ub2 + : "¾" # Ube + : "⅗" # U2157 + : "⅜" # U215c + : "³" # Ub3 + : "³" # Ub3 + : "³" # Ub3 + : "⅘" # U2158 + : "⅚" # U215a + : "⅝" # U215d + : "⅞" # U215e + : "∞" # U221e + : "☹" # U2639 + : "☺" # U263a + : "÷" # Uf7 + : "∴" # U2234 + : "⍠" # U2360 + : "Ą" # U104 + : "Ę" # U118 + : "Į" # U12e + : "Ǫ" # U1ea + : "Ș" # U218 + : "Ț" # U21a + : "Ų" # U172 + : "⍮" # U236e + : "ą" # U105 + : "ę" # U119 + : "į" # U12f + : "ǫ" # U1eb + : "ș" # U219 + : "ț" # U21b + : "ų" # U173 + : "ˇ" # U2c7 + : "“" # U201c + : "‘" # U2018 + : "←" # U2190 + : "\" # U5c + : "♥" # U2665 + : "«" # Uab + : "≤" # U2264 + : "⋄" # U22c4 + : "Č" # U10c + : "Ď" # U10e + : "Ě" # U11a + : "Ľ" # U13d + : "Ň" # U147 + : "Ř" # U158 + : "Š" # U160 + : "Ť" # U164 + : "Ž" # U17d + : "≤" # U2264 + : "č" # U10d + : "ď" # U10f + : "ě" # U11b + : "ľ" # U13e + : "ň" # U148 + : "ř" # U159 + : "š" # U161 + : "ť" # U165 + : "ž" # U17e + : "≮" # U226e + : "⍃" # U2343 + : "≠" # U2260 + : "⇒" # U21d2 + : "€" # U20ac + : "€" # U20ac + : "₤" # U20a4 + : "₦" # U20a6 + : "Ő" # U150 + : "₽" # U20bd + : "₹" # U20b9 + : "Ű" # U170 + : "₩" # U20a9 + : "¥" # Ua5 + : "≡" # U2261 + : "€" # U20ac + : "₫" # U20ab + : "€" # U20ac + : "£" # Ua3 + : "ő" # U151 + : "₽" # U20bd + : "₹" # U20b9 + : "ű" # U171 + : "¥" # Ua5 + : "≠" # U2260 + : "ӳ" # U4f3 + : "₽" # U20bd + : "€" # U20ac + : "€" # U20ac + : "Ӳ" # U4f2 + : "₽" # U20bd + : "⌸" # U2338 + : "^" # U5e + : "”" # U201d + : "’" # U2019 + : "⋄" # U22c4 + : "≥" # U2265 + : "»" # Ubb + : "Â" # Uc2 + : "Ê" # Uca + : "Î" # Uce + : "Ô" # Ud4 + : "Û" # Udb + : "≥" # U2265 + : "â" # Ue2 + : "ê" # Uea + : "î" # Uee + : "ô" # Uf4 + : "û" # Ufb + : "⍩" # U2369 + : "≯" # U226f + : "⍄" # U2344 + : "⸘" # U2e18 + : "Ở" # U1ede + : "Ử" # U1eec + : "ở" # U1edf + : "ử" # U1eed + : "¿" # Ubf + : "Ả" # U1ea2 + : "Ẻ" # U1eba + : "Ỉ" # U1ec8 + : "Ỏ" # U1ece + : "Ủ" # U1ee6 + : "Ỷ" # U1ef6 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "ả" # U1ea3 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "ẻ" # U1ebb + : "ỉ" # U1ec9 + : "ỏ" # U1ecf + : "ủ" # U1ee7 + : "ỷ" # U1ef7 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "⍰" # U2370 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "Ở" # U1ede + : "Ử" # U1eec + : "ở" # U1edf + : "ử" # U1eed + : "Ä" # Uc4 + : "Á" # Uc1 + : "Ă" # U102 + : "Å" # Uc5 + : "Ą" # U104 + : "Ã" # Uc3 + : "Ą" # U104 + : "Â" # Uc2 + : "Å" # Uc5 + : "Æ" # Uc6 + : "@" # U40 + : "Â" # Uc2 + : "ª" # Uaa + : "À" # Uc0 + : "Ã" # Uc3 + : "Ä" # Uc4 + : "Á" # Uc1 + : "Ḃ" # U1e02 + : "Ć" # U106 + : "Ç" # Uc7 + : "Ċ" # U10a + : "₡" # U20a1 + : "©" # Ua9 + : "Č" # U10c + : "€" # U20ac + : "☭" # U262d + : "₠" # U20a0 + : "©" # Ua9 + : "©" # Ua9 + : "₢" # U20a2 + : "¢" # Ua2 + : "Ḑ" # U1e10 + : "Đ" # U110 + : "Ḋ" # U1e0a + : "Ď" # U10e + : "Ð" # Ud0 + : "Ë" # Ucb + : "É" # Uc9 + : "Ę" # U118 + : "Ē" # U112 + : "Ė" # U116 + : "Ę" # U118 + : "Ě" # U11a + : "€" # U20ac + : "Ê" # Uca + : "Ê" # Uca + : "Ē" # U112 + : "È" # Uc8 + : "Ë" # Ucb + : "É" # Uc9 + : "Ḟ" # U1e1e + : "ffi" # Ufb03 + : "ffl" # Ufb04 + : "₣" # U20a3 + : "Ğ" # U11e + : "Ģ" # U122 + : "Ġ" # U120 + : ">" # U3e + : "Ğ" # U11e + : "Ğ" # U11e + : "Ğ" # U11e + : "Ḩ" # U1e28 + : "Ï" # Ucf + : "Í" # Ucd + : "Į" # U12e + : "Ī" # U12a + : "İ" # U130 + : "Į" # U12e + : "Î" # Uce + : "IJ" # U132 + : "Î" # Uce + : "Ī" # U12a + : "Ì" # Ucc + : "IJ" # U132 + : "Ĩ" # U128 + : "Ï" # Ucf + : "Í" # Ucd + : "Ķ" # U136 + : "Ĺ" # U139 + : "Ļ" # U13b + : "£" # Ua3 + : "Ł" # U141 + : "Ľ" # U13d + : "£" # Ua3 + : "<" # U3c + : "|" # U7c + : "Ṁ" # U1e40 + : "Ń" # U143 + : "Ņ" # U145 + : "Ñ" # Ud1 + : "Ň" # U147 + : "₦" # U20a6 + : "Ŋ" # U14a + : "№" # U2116 + : "№" # U2116 + : "Ñ" # Ud1 + : "Ö" # Ud6 + : "Ó" # Ud3 + : "Ǫ" # U1ea + : "Õ" # Ud5 + : "Ø" # Ud8 + : "Ǫ" # U1ea + : "Ô" # Ud4 + : "Ⓐ" # U24b6 + : "©" # Ua9 + : "Œ" # U152 + : "®" # Uae + : "§" # Ua7 + : "¤" # Ua4 + : "Ô" # Ud4 + : "º" # Uba + : "Ò" # Ud2 + : "©" # Ua9 + : "®" # Uae + : "¤" # Ua4 + : "Õ" # Ud5 + : "Ö" # Ud6 + : "Ó" # Ud3 + : "¶" # Ub6 + : "Ṗ" # U1e56 + : "₽" # U20bd + : "¶" # Ub6 + : "₧" # U20a7 + : "Ŕ" # U154 + : "Ŗ" # U156 + : "Ř" # U158 + : "₹" # U20b9 + : "®" # Uae + : "®" # Uae + : "₨" # U20a8 + : "§" # Ua7 + : "Ś" # U15a + : "Ş" # U15e + : "Ṡ" # U1e60 + : "§" # Ua7 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "Ș" # U218 + : "Š" # U160 + : "℠" # U2120 + : "§" # Ua7 + : "ẞ" # U1e9e + : "℠" # U2120 + : "Ş" # U15e + : "Ţ" # U162 + : "Ŧ" # U166 + : "Ṫ" # U1e6a + : "Ŧ" # U166 + : "Ț" # U21a + : "Ť" # U164 + : "Þ" # Ude + : "™" # U2122 + : "™" # U2122 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ü" # Udc + : "Ú" # Uda + : "Ů" # U16e + : "Ų" # U172 + : "Ū" # U16a + : "µ" # Ub5 + : "Ų" # U172 + : "Û" # Udb + : "Ă" # U102 + : "Ĕ" # U114 + : "Ğ" # U11e + : "Ĭ" # U12c + : "Ŏ" # U14e + : "Ŭ" # U16c + : "Û" # Udb + : "Ū" # U16a + : "Ù" # Ud9 + : "ă" # U103 + : "ĕ" # U115 + : "ğ" # U11f + : "ĭ" # U12d + : "ŏ" # U14f + : "ŭ" # U16d + : "Ũ" # U168 + : "Ü" # Udc + : "Ú" # Uda + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ӑ" # U4d1 + : "ӗ" # U4d7 + : "й" # U439 + : "ў" # U45e + : "ӂ" # U4c2 + : "Ӑ" # U4d0 + : "Ӗ" # U4d6 + : "Й" # U419 + : "Ў" # U40e + : "Ӂ" # U4c1 + : "Ᾰ" # U1fb8 + : "Ῐ" # U1fd8 + : "Ῠ" # U1fe8 + : "ᾰ" # U1fb0 + : "ῐ" # U1fd0 + : "ῠ" # U1fe0 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "|" # U7c + : "₩" # U20a9 + : "Ŵ" # U174 + : "¤" # Ua4 + : "¤" # Ua4 + : "¤" # Ua4 + : "Ÿ" # U178 + : "Ý" # Udd + : "¥" # Ua5 + : "¥" # Ua5 + : "Ŷ" # U176 + : "Ÿ" # U178 + : "Ý" # Udd + : "Ź" # U179 + : "Ż" # U17b + : "Ž" # U17d + : "⌷" # U2337 + : "⍀" # U2340 + : "⍉" # U2349 + : "⍂" # U2342 + : "⌷" # U2337 + : "^" # U5e + : "Ậ" # U1eac + : "Ệ" # U1ec6 + : "Ộ" # U1ed8 + : "ậ" # U1ead + : "ệ" # U1ec7 + : "ộ" # U1ed9 + : "⁽" # U207d + : "⁾" # U207e + : "⁺" # U207a + : "¯" # Uaf + : "·" # Ub7 + : "|" # U7c + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "Â" # Uc2 + : "Ĉ" # U108 + : "Ê" # Uca + : "Ĝ" # U11c + : "Ĥ" # U124 + : "Î" # Uce + : "Ĵ" # U134 + : "Ô" # Ud4 + : "Ŝ" # U15c + : "Û" # Udb + : "Ŵ" # U174 + : "Ŷ" # U176 + : "Ẑ" # U1e90 + : "¯" # Uaf + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "â" # Ue2 + : "ĉ" # U109 + : "ê" # Uea + : "ĝ" # U11d + : "ĥ" # U125 + : "î" # Uee + : "ĵ" # U135 + : "ô" # Uf4 + : "ŝ" # U15d + : "û" # Ufb + : "ŵ" # U175 + : "ŷ" # U177 + : "ẑ" # U1e91 + : "↑" # U2191 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "Ậ" # U1eac + : "ậ" # U1ead + : "Ệ" # U1ec6 + : "ệ" # U1ec7 + : "Ộ" # U1ed8 + : "ộ" # U1ed9 + : "⁻" # U207b + : "㆒" # U3192 + : "㆜" # U319c + : "㆔" # U3194 + : "㆖" # U3196 + : "㆘" # U3198 + : "㆛" # U319b + : "㆗" # U3197 + : "㆚" # U319a + : "㆓" # U3193 + : "㆟" # U319f + : "㆕" # U3195 + : "㆞" # U319e + : "㆝" # U319d + : "㆙" # U3199 + : "Ậ" # U1eac + : "Ệ" # U1ec6 + : "Ộ" # U1ed8 + : "ậ" # U1ead + : "ệ" # U1ec7 + : "ộ" # U1ed9 + : "²" # Ub2 + : "⁺" # U207a + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "⍘" # U2358 + : "₍" # U208d + : "₎" # U208e + : "₊" # U208a + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "≤" # U2264 + : "₌" # U208c + : "≥" # U2265 + : "Ā" # U100 + : "Ē" # U112 + : "Ḡ" # U1e20 + : "Ī" # U12a + : "Ō" # U14c + : "Ū" # U16a + : "Ȳ" # U232 + : "¯" # Uaf + : "¯" # Uaf + : "ā" # U101 + : "ē" # U113 + : "ḡ" # U1e21 + : "ī" # U12b + : "ō" # U14d + : "ū" # U16b + : "ȳ" # U233 + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ǟ" # U1de + : "Ǣ" # U1e2 + : "Ȭ" # U22c + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ǣ" # U1e3 + : "ȭ" # U22d + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "ӣ" # U4e3 + : "ӯ" # U4ef + : "Ӣ" # U4e2 + : "Ӯ" # U4ee + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "⍜" # U235c + : "⍊" # U234a + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c + : "ṝ" # U1e5d + : "⍙" # U2359 + : "⍷" # U2377 + : "₋" # U208b + : "⍛" # U235b + : "≢" # U2262 : "⊆" # U2286 : "⊇" # U2287 - : "⍊" # U234a - : "⍜" # U235c - : "а̏" - : "е̏" - : "и̏" - : "о̏" - : "р̏" - : "у̏" - : "А̏" - : "Е̏" - : "И̏" - : "О̏" - : "Р̏" - : "У̏" - : "а̀" - : "о̀" - : "р̀" - : "у̀" - : "А̀" - : "О̀" - : "Р̀" - : "У̀" - : "ā" # U101 - : "j́" - : "j́" - : "ō" # U14d - : "💩" # U1f4a9 + : "⍚" # U235a + : "⍸" # U2378 + : "⍹" # U2379 + : "⍶" # U2376 + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "₂" # U2082 + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "`" # U60 + : "Ǜ" # U1db + : "ǜ" # U1dc + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ἃ" # U1f0b + : "Ἓ" # U1f1b + : "Ἣ" # U1f2b + : "Ἳ" # U1f3b + : "Ὃ" # U1f4b + : "Ὓ" # U1f5b + : "Ὣ" # U1f6b + : "ἃ" # U1f03 + : "ἓ" # U1f13 + : "ἣ" # U1f23 + : "ἳ" # U1f33 + : "ὃ" # U1f43 + : "ὓ" # U1f53 + : "ὣ" # U1f63 + : "Ἂ" # U1f0a + : "Ἒ" # U1f1a + : "Ἢ" # U1f2a + : "Ἲ" # U1f3a + : "Ὂ" # U1f4a + : "Ὢ" # U1f6a + : "ἂ" # U1f02 + : "ἒ" # U1f12 + : "ἢ" # U1f22 + : "ἲ" # U1f32 + : "ὂ" # U1f42 + : "ὒ" # U1f52 + : "ὢ" # U1f62 + : "Ờ" # U1edc + : "Ừ" # U1eea + : "ờ" # U1edd + : "ừ" # U1eeb + : "À" # Uc0 + : "È" # Uc8 + : "Ì" # Ucc + : "Ǹ" # U1f8 + : "Ò" # Ud2 + : "Ù" # Ud9 + : "Ẁ" # U1e80 + : "Ỳ" # U1ef2 + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "à" # Ue0 + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "è" # Ue8 + : "ì" # Uec + : "ǹ" # U1f9 + : "ò" # Uf2 + : "ù" # Uf9 + : "ẁ" # U1e81 + : "ỳ" # U1ef3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "Ǜ" # U1db + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "ǜ" # U1dc + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ḕ" # U1e14 + : "ḕ" # U1e15 + : "Ṑ" # U1e50 + : "ṑ" # U1e51 + : "ѐ" # U450 + : "ѝ" # U45d + : "Ѐ" # U400 + : "Ѝ" # U40d + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ὰ" # U1fba + : "Ὲ" # U1fc8 + : "Ὴ" # U1fca + : "Ὶ" # U1fda + : "Ὸ" # U1ff8 + : "Ὺ" # U1fea + : "Ὼ" # U1ffa + : "ὰ" # U1f70 + : "ὲ" # U1f72 + : "ὴ" # U1f74 + : "ὶ" # U1f76 + : "ὸ" # U1f78 + : "ὺ" # U1f7a + : "ὼ" # U1f7c + : "ἂ" # U1f02 + : "ἃ" # U1f03 + : "Ἂ" # U1f0a + : "Ἃ" # U1f0b + : "ἒ" # U1f12 + : "ἓ" # U1f13 + : "Ἒ" # U1f1a + : "Ἓ" # U1f1b + : "ἢ" # U1f22 + : "ἣ" # U1f23 + : "Ἢ" # U1f2a + : "Ἣ" # U1f2b + : "ἲ" # U1f32 + : "ἳ" # U1f33 + : "Ἲ" # U1f3a + : "Ἳ" # U1f3b + : "ὂ" # U1f42 + : "ὃ" # U1f43 + : "Ὂ" # U1f4a + : "Ὃ" # U1f4b + : "ὒ" # U1f52 + : "ὓ" # U1f53 + : "Ὓ" # U1f5b + : "ὢ" # U1f62 + : "ὣ" # U1f63 + : "Ὢ" # U1f6a + : "Ὣ" # U1f6b + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ǜ" # U1db + : "ǜ" # U1dc + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ờ" # U1edc + : "Ừ" # U1eea + : "ờ" # U1edd + : "ừ" # U1eeb + : "Ἂ" # U1f0a + : "Ἒ" # U1f1a + : "Ἢ" # U1f2a + : "Ἲ" # U1f3a + : "Ὂ" # U1f4a + : "Ὢ" # U1f6a + : "ἂ" # U1f02 + : "ἒ" # U1f12 + : "ἢ" # U1f22 + : "ἲ" # U1f32 + : "ὂ" # U1f42 + : "ὒ" # U1f52 + : "ὢ" # U1f62 + : "Ἃ" # U1f0b + : "Ἓ" # U1f1b + : "Ἣ" # U1f2b + : "Ἳ" # U1f3b + : "Ὃ" # U1f4b + : "Ὓ" # U1f5b + : "Ὣ" # U1f6b + : "ἃ" # U1f03 + : "ἓ" # U1f13 + : "ἣ" # U1f23 + : "ἳ" # U1f33 + : "ὃ" # U1f43 + : "ὓ" # U1f53 + : "ὣ" # U1f63 + : "ä" # Ue4 + : "á" # Ue1 + : "ă" # U103 + : "å" # Ue5 + : "ą" # U105 + : "ā" # U101 + : "ą" # U105 + : "â" # Ue2 + : "â" # Ue2 + : "ª" # Uaa + : "à" # Ue0 + : "å" # Ue5 + : "æ" # Ue6 + : "ã" # Ue3 + : "ä" # Ue4 + : "á" # Ue1 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ḃ" # U1e03 + : "Ă" # U102 + : "Ĕ" # U114 + : "Ğ" # U11e + : "Ĭ" # U12c + : "Ŏ" # U14e + : "Ŭ" # U16c + : "ă" # U103 + : "ĕ" # U115 + : "ğ" # U11f + : "ĭ" # U12d + : "ŏ" # U14f + : "ŭ" # U16d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ӑ" # U4d1 + : "ӗ" # U4d7 + : "й" # U439 + : "ў" # U45e + : "ӂ" # U4c2 + : "Ӑ" # U4d0 + : "Ӗ" # U4d6 + : "Й" # U419 + : "Ў" # U40e + : "Ӂ" # U4c1 + : "Ᾰ" # U1fb8 + : "Ῐ" # U1fd8 + : "Ῠ" # U1fe8 + : "ᾰ" # U1fb0 + : "ῐ" # U1fd0 + : "ῠ" # U1fe0 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "ć" # U107 + : "ç" # Ue7 + : "ċ" # U10b + : "¢" # Ua2 + : "©" # Ua9 + : "č" # U10d + : "€" # U20ac + : "Ǎ" # U1cd + : "Č" # U10c + : "Ď" # U10e + : "Ě" # U11a + : "Ǧ" # U1e6 + : "Ȟ" # U21e + : "Ǐ" # U1cf + : "Ǩ" # U1e8 + : "Ľ" # U13d + : "Ň" # U147 + : "Ǒ" # U1d1 + : "Ř" # U158 + : "Š" # U160 + : "Ť" # U164 + : "Ǔ" # U1d3 + : "Ž" # U17d + : "ǎ" # U1ce + : "č" # U10d + : "ď" # U10f + : "ě" # U11b + : "ǧ" # U1e7 + : "ȟ" # U21f + : "ǐ" # U1d0 + : "ǰ" # U1f0 + : "ǩ" # U1e9 + : "ľ" # U13e + : "ň" # U148 + : "ǒ" # U1d2 + : "ř" # U159 + : "š" # U161 + : "ť" # U165 + : "ǔ" # U1d4 + : "ž" # U17e + : "¢" # Ua2 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "ḑ" # U1e11 + : "đ" # U111 + : "ḋ" # U1e0b + : "ď" # U10f + : "₫" # U20ab + : "ð" # Uf0 + : "⌀" # U2300 + : "ë" # Ueb + : "é" # Ue9 + : "ę" # U119 + : "ē" # U113 + : "ė" # U117 + : "ę" # U119 + : "ě" # U11b + : "€" # U20ac + : "ê" # Uea + : "ê" # Uea + : "ē" # U113 + : "è" # Ue8 + : "ə" # U259 + : "ë" # Ueb + : "é" # Ue9 + : "ḟ" # U1e1f + : "ſ" # U17f + : "ff" # Ufb00 + : "fi" # Ufb01 + : "fl" # Ufb02 + : "ſ" # U17f + : "ğ" # U11f + : "ģ" # U123 + : "ġ" # U121 + : "ğ" # U11f + : ">" # U3e + : "ğ" # U11f + : "ğ" # U11f + : "ḩ" # U1e29 + : "ï" # Uef + : "í" # Ued + : "į" # U12f + : "ī" # U12b + : "ı" # U131 + : "į" # U12f + : "î" # Uee + : "î" # Uee + : "ī" # U12b + : "ì" # Uec + : "ij" # U133 + : "ĩ" # U129 + : "ï" # Uef + : "í" # Ued + : "ķ" # U137 + : "ĸ" # U138 + : "ĺ" # U13a + : "ļ" # U13c + : "£" # Ua3 + : "ł" # U142 + : "ľ" # U13e + : "£" # Ua3 + : "<" # U3c + : "|" # U7c + : "ṁ" # U1e41 + : "₥" # U20a5 + : "µ" # Ub5 + : "ń" # U144 + : "ņ" # U146 + : "ñ" # Uf1 + : "ň" # U148 + : "ŋ" # U14b + : "ñ" # Uf1 + : "ö" # Uf6 + : "ó" # Uf3 + : "ǫ" # U1eb + : "ō" # U14d + : "ø" # Uf8 + : "ǫ" # U1eb + : "ô" # Uf4 + : "Å" # Uc5 + : "©" # Ua9 + : "®" # Uae + : "Ů" # U16e + : "¤" # Ua4 + : "ô" # Uf4 + : "º" # Uba + : "ò" # Uf2 + : "å" # Ue5 + : "©" # Ua9 + : "œ" # U153 + : "°" # Ub0 + : "®" # Uae + : "§" # Ua7 + : "ů" # U16f + : "ẘ" # U1e98 + : "¤" # Ua4 + : "ẙ" # U1e99 + : "õ" # Uf5 + : "ö" # Uf6 + : "ó" # Uf3 + : "¶" # Ub6 + : "ṗ" # U1e57 + : "₽" # U20bd + : "ŕ" # U155 + : "ŗ" # U157 + : "ř" # U159 + : "₹" # U20b9 + : "§" # Ua7 + : "ś" # U15b + : "ş" # U15f + : "ṡ" # U1e61 + : "§" # Ua7 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "ș" # U219 + : "š" # U161 + : "℠" # U2120 + : "℠" # U2120 + : "§" # Ua7 + : "ß" # Udf + : "ş" # U15f + : "ţ" # U163 + : "ŧ" # U167 + : "ṫ" # U1e6b + : "ŧ" # U167 + : "ț" # U21b + : "ť" # U165 + : "™" # U2122 + : "þ" # Ufe + : "™" # U2122 + : "ü" # Ufc + : "ú" # Ufa + : "ů" # U16f + : "ų" # U173 + : "ū" # U16b + : "µ" # Ub5 + : "ų" # U173 + : "û" # Ufb + : "Ă" # U102 + : "Ĕ" # U114 + : "Ğ" # U11e + : "Ĭ" # U12c + : "Ŏ" # U14e + : "Ŭ" # U16c + : "û" # Ufb + : "ū" # U16b + : "ù" # Uf9 + : "ă" # U103 + : "ĕ" # U115 + : "ğ" # U11f + : "ĭ" # U12d + : "ŏ" # U14f + : "ŭ" # U16d + : "ũ" # U169 + : "ü" # Ufc + : "ú" # Ufa + : "√" # U221a + : "Ǎ" # U1cd + : "Č" # U10c + : "Ď" # U10e + : "Ě" # U11a + : "Ǧ" # U1e6 + : "Ȟ" # U21e + : "Ǐ" # U1cf + : "Ǩ" # U1e8 + : "Ň" # U147 + : "Ǒ" # U1d1 + : "Ř" # U158 + : "Š" # U160 + : "Ť" # U164 + : "Ǔ" # U1d3 + : "Ž" # U17d + : "ǎ" # U1ce + : "č" # U10d + : "ď" # U10f + : "ě" # U11b + : "ǧ" # U1e7 + : "ȟ" # U21f + : "ǐ" # U1d0 + : "ǰ" # U1f0 + : "ǩ" # U1e9 + : "|" # U7c + : "ň" # U148 + : "ǒ" # U1d2 + : "ř" # U159 + : "š" # U161 + : "ť" # U165 + : "ǔ" # U1d4 + : "ž" # U17e + : "↓" # U2193 + : "ŵ" # U175 + : "¤" # Ua4 + : "¤" # Ua4 + : "¤" # Ua4 + : "×" # Ud7 + : "ÿ" # Uff + : "ý" # Ufd + : "¥" # Ua5 + : "¥" # Ua5 + : "ŷ" # U177 + : "ÿ" # Uff + : "ý" # Ufd + : "ź" # U17a + : "ż" # U17c + : "ž" # U17e + : "∅" # U2205 + : "¢" # Ua2 + : "↑" # U2191 + : "¢" # Ua2 + : "↓" # U2193 + : "⍭" # U236d + : "⍦" # U2366 + : "⌽" # U233d + : "⍅" # U2345 + : "⍆" # U2346 : "⍋" # U234b : "⍒" # U2352 - : "⍦" # U2366 : "⍧" # U2367 - : "⌽" # U233d - : "⍡" # U2361 - : "⍥" # U2365 - : "а̄" - : "е̄" - : "о̄" - : "р̄" - : "А̄" - : "Е̄" - : "О̄" - : "Р̄" + : "~" # U7e + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "Ἇ" # U1f0f + : "Ἧ" # U1f2f + : "Ἷ" # U1f3f + : "Ὗ" # U1f5f + : "Ὧ" # U1f6f + : "ἇ" # U1f07 + : "ἧ" # U1f27 + : "ἷ" # U1f37 + : "ὗ" # U1f57 + : "ὧ" # U1f67 + : "Ἆ" # U1f0e + : "Ἦ" # U1f2e + : "Ἶ" # U1f3e + : "Ὦ" # U1f6e + : "ἆ" # U1f06 + : "ἦ" # U1f26 + : "ἶ" # U1f36 + : "ὖ" # U1f56 + : "ὦ" # U1f66 + : "Ỡ" # U1ee0 + : "Ữ" # U1eee + : "ỡ" # U1ee1 + : "ữ" # U1eef + : "⍬" # U236c + : "Ã" # Uc3 + : "Ẽ" # U1ebc + : "Ĩ" # U128 + : "Ñ" # Ud1 + : "Õ" # Ud5 + : "Ũ" # U168 + : "Ṽ" # U1e7c + : "Ỹ" # U1ef8 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "ã" # Ue3 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "ẽ" # U1ebd + : "ĩ" # U129 + : "ñ" # Uf1 + : "õ" # Uf5 + : "ũ" # U169 + : "ṽ" # U1e7d + : "ỹ" # U1ef9 + : "⍭" # U236d + : "≈" # U2248 + : "⍨" # U2368 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "ᾶ" # U1fb6 + : "ῆ" # U1fc6 + : "ῖ" # U1fd6 + : "ῦ" # U1fe6 + : "ῶ" # U1ff6 + : "ἆ" # U1f06 + : "ἇ" # U1f07 + : "Ἆ" # U1f0e + : "Ἇ" # U1f0f + : "ἦ" # U1f26 + : "ἧ" # U1f27 + : "Ἦ" # U1f2e + : "Ἧ" # U1f2f + : "ἶ" # U1f36 + : "ἷ" # U1f37 + : "Ἶ" # U1f3e + : "Ἷ" # U1f3f + : "ὖ" # U1f56 + : "ὗ" # U1f57 + : "Ὗ" # U1f5f + : "ὦ" # U1f66 + : "ὧ" # U1f67 + : "Ὦ" # U1f6e + : "Ὧ" # U1f6f + : "⍫" # U236b + : "⍲" # U2372 + : "⍱" # U2371 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "Ỡ" # U1ee0 + : "Ữ" # U1eee + : "ỡ" # U1ee1 + : "ữ" # U1eef + : "Ἆ" # U1f0e + : "Ἦ" # U1f2e + : "Ἶ" # U1f3e + : "Ὦ" # U1f6e + : "ἆ" # U1f06 + : "ἦ" # U1f26 + : "ἶ" # U1f36 + : "ὖ" # U1f56 + : "ὦ" # U1f66 + : "Ἇ" # U1f0f + : "Ἧ" # U1f2f + : "Ἷ" # U1f3f + : "Ὗ" # U1f5f + : "Ὧ" # U1f6f + : "ἇ" # U1f07 + : "ἧ" # U1f27 + : "ἷ" # U1f37 + : "ὗ" # U1f57 + : "ὧ" # U1f67 + : "΅" # U385 + : "⍣" # U2363 + : "⍩" # U2369 + : "Ä" # Uc4 + : "Ë" # Ucb + : "Ï" # Ucf + : "Ö" # Ud6 + : "Ü" # Udc + : "Ÿ" # U178 + : "῭" # U1fed + : "ä" # Ue4 + : "ë" # Ueb + : "ï" # Uef + : "ö" # Uf6 + : "ü" # Ufc + : "ÿ" # Uff + : "῁" # U1fc1 + : "΅" # U385 + : "⍥" # U2365 + : "⍡" # U2361 + : "⍢" # U2362 + : "⍤" # U2364 + : "῭" # U1fed + : "΅" # U385 + : "῁" # U1fc1 + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ā" # U100 + : "Ē" # U112 + : "Ḡ" # U1e20 + : "Ī" # U12a + : "Ō" # U14c + : "Ū" # U16a + : "Ȳ" # U232 + : "ā" # U101 + : "ē" # U113 + : "ḡ" # U1e21 + : "ī" # U12b + : "ō" # U14d + : "ū" # U16b + : "ȳ" # U233 + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ǟ" # U1de + : "Ǣ" # U1e2 + : "Ȭ" # U22c + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ǣ" # U1e3 + : "ȭ" # U22d + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "ӣ" # U4e3 + : "ӯ" # U4ef + : "Ӣ" # U4e2 + : "Ӯ" # U4ee + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "⍑" # U2351 + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c : "ṝ" # U1e5d - : "⍑" # U2351 - : "J́" - : "j́" - : "ю́" - : "а́" - : "е́" - : "и́" - : "о́" - : "я́" - : "р́" - : "у́" - : "ы́" - : "э́" - : "Ю́́" - : "А́" - : "Е́" - : "И́" - : "О́" - : "Я́" - : "Р́" - : "У́" - : "Ы́" - : "Э́" - : "ᾧ" # U1fa7 + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Á" # Uc1 + : "Ć" # U106 + : "É" # Uc9 + : "Ǵ" # U1f4 + : "Í" # Ucd + : "Ḱ" # U1e30 + : "Ĺ" # U139 + : "Ḿ" # U1e3e + : "Ń" # U143 + : "Ó" # Ud3 + : "Ṕ" # U1e54 + : "Ŕ" # U154 + : "Ś" # U15a + : "Ú" # Uda + : "Ẃ" # U1e82 + : "Ý" # Udd + : "Ź" # U179 + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "á" # Ue1 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "ć" # U107 + : "é" # Ue9 + : "ǵ" # U1f5 + : "í" # Ued + : "ḱ" # U1e31 + : "ĺ" # U13a + : "ḿ" # U1e3f + : "ń" # U144 + : "ó" # Uf3 + : "ṕ" # U1e55 + : "ŕ" # U155 + : "ś" # U15b + : "ú" # Ufa + : "ẃ" # U1e83 + : "ý" # Ufd + : "ź" # U17a + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ấ" # U1ea4 + : "Ǻ" # U1fa + : "Ǽ" # U1fc + : "Ḉ" # U1e08 + : "Ế" # U1ebe + : "Ḯ" # U1e2e + : "Ố" # U1ed0 + : "Ṍ" # U1e4c + : "Ǿ" # U1fe + : "Ǘ" # U1d7 + : "ấ" # U1ea5 + : "ǻ" # U1fb + : "ǽ" # U1fd + : "ḉ" # U1e09 + : "ế" # U1ebf + : "ḯ" # U1e2f + : "ố" # U1ed1 + : "ṍ" # U1e4d + : "ǿ" # U1ff + : "ǘ" # U1d8 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḗ" # U1e16 + : "ḗ" # U1e17 + : "Ṓ" # U1e52 + : "Ṹ" # U1e78 + : "ṓ" # U1e53 + : "ṹ" # U1e79 + : "ѓ" # U453 + : "ќ" # U45c + : "Ѓ" # U403 + : "Ќ" # U40c + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ά" # U386 + : "Έ" # U388 + : "Ή" # U389 + : "Ί" # U38a + : "Ό" # U38c + : "Ύ" # U38e + : "Ώ" # U38f + : "ά" # U3ac + : "έ" # U3ad + : "ή" # U3ae + : "ί" # U3af + : "ό" # U3cc + : "ύ" # U3cd + : "ώ" # U3ce + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ç" # Uc7 + : "Ḑ" # U1e10 + : "Ȩ" # U228 + : "Ģ" # U122 + : "Ḩ" # U1e28 + : "Ķ" # U136 + : "Ļ" # U13b + : "Ņ" # U145 + : "Ŗ" # U156 + : "Ş" # U15e + : "Ţ" # U162 + : "ç" # Ue7 + : "ḑ" # U1e11 + : "ȩ" # U229 + : "ģ" # U123 + : "ḩ" # U1e29 + : "ķ" # U137 + : "ļ" # U13c + : "ņ" # U146 + : "ŗ" # U157 + : "ş" # U15f + : "ţ" # U163 + : "⌹" # U2339 + : "Ğ" # U11e + : "ğ" # U11f + : "יִ" # Ufb1d + : "ײַ" # Ufb1f + : "אַ" # Ufb2e + : "אָ" # Ufb2f + : "וֹ" # Ufb4b + : "אּ" # Ufb30 + : "בּ" # Ufb31 + : "גּ" # Ufb32 + : "דּ" # Ufb33 + : "הּ" # Ufb34 + : "וּ" # Ufb35 + : "זּ" # Ufb36 + : "טּ" # Ufb38 + : "יּ" # Ufb39 + : "ךּ" # Ufb3a + : "כּ" # Ufb3b + : "לּ" # Ufb3c + : "מּ" # Ufb3e + : "נּ" # Ufb40 + : "סּ" # Ufb41 + : "ףּ" # Ufb43 + : "פּ" # Ufb44 + : "צּ" # Ufb46 + : "קּ" # Ufb47 + : "רּ" # Ufb48 + : "שּ" # Ufb49 + : "תּ" # Ufb4a + : "בֿ" # Ufb4c + : "כֿ" # Ufb4d + : "פֿ" # Ufb4e + : "שּׁ" # Ufb2c + : "שׁ" # Ufb2a + : "שּׁ" # Ufb2c + : "שּׂ" # Ufb2d + : "שׂ" # Ufb2b + : "שּׂ" # Ufb2d + : "آ" # U622 + : "أ" # U623 + : "ؤ" # U624 + : "ئ" # U626 + : "ۂ" # U6c2 + : "ۓ" # U6d3 + : "ۀ" # U6c0 + : "إ" # U625 + : "§" # Ua7 + : "₽" # U20bd + : "€" # U20ac + : "№" # U2116 + : "№" # U2116 + : "€" # U20ac + : "₽" # U20bd + : "Ά" # U386 + : "Έ" # U388 + : "Ή" # U389 + : "Ϊ" # U3aa + : "Ί" # U38a + : "Ό" # U38c + : "Ϋ" # U3ab + : "Ύ" # U38e + : "Ώ" # U38f + : "ά" # U3ac + : "έ" # U3ad + : "ή" # U3ae + : "ϊ" # U3ca + : "ί" # U3af + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾉ" # U1f89 + : "ᾙ" # U1f99 + : "ᾩ" # U1fa9 + : "ᾁ" # U1f81 + : "ᾑ" # U1f91 + : "ᾡ" # U1fa1 + : "ᾈ" # U1f88 + : "ᾘ" # U1f98 + : "ᾨ" # U1fa8 + : "ᾀ" # U1f80 + : "ᾐ" # U1f90 + : "ᾠ" # U1fa0 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾼ" # U1fbc + : "ῌ" # U1fcc + : "ῼ" # U1ffc + : "ᾳ" # U1fb3 + : "ῃ" # U1fc3 + : "ῳ" # U1ff3 + : "ᾀ" # U1f80 + : "ᾁ" # U1f81 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾈ" # U1f88 + : "ᾉ" # U1f89 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾐ" # U1f90 + : "ᾑ" # U1f91 + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾘ" # U1f98 + : "ᾙ" # U1f99 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾠ" # U1fa0 + : "ᾡ" # U1fa1 + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾨ" # U1fa8 + : "ᾩ" # U1fa9 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾈ" # U1f88 + : "ᾘ" # U1f98 + : "ᾨ" # U1fa8 + : "ᾀ" # U1f80 + : "ᾐ" # U1f90 + : "ᾠ" # U1fa0 + : "ᾉ" # U1f89 + : "ᾙ" # U1f99 + : "ᾩ" # U1fa9 + : "ᾁ" # U1f81 + : "ᾑ" # U1f91 + : "ᾡ" # U1fa1 + : "ό" # U3cc + : "ϋ" # U3cb + : "ύ" # U3cd + : "ώ" # U3ce + : "≰" # U2270 + : "≱" # U2271 + : "≇" # U2247 + : "≢" # U2262 + : "⊄" # U2284 + : "⊅" # U2285 + : "⍦" # U2366 + : "क़" # U958 + : "ख़" # U959 + : "ग़" # U95a + : "ज़" # U95b + : "ड़" # U95c + : "ढ़" # U95d + : "ऩ" # U929 + : "फ़" # U95e + : "य़" # U95f + : "ऱ" # U931 + : "ऴ" # U934 + : "ড়" # U9dc + : "ঢ়" # U9dd + : "য়" # U9df + : "ো" # U9cb + : "ৌ" # U9cc + : "ਖ਼" # Ua59 + : "ਗ਼" # Ua5a + : "ਜ਼" # Ua5b + : "ਫ਼" # Ua5e + : "ਲ਼" # Ua33 + : "ਸ਼" # Ua36 + : "⍟" # U235f + : "⊖" # U2296 + : "⊙" # U2299 + : "⍉" # U2349 + : "⍜" # U235c + : "⌽" # U233d + : "⍥" # U2365 + : "⌾" # U233e + : "⌼" # U233c + : "ଡ଼" # Ub5c + : "ଢ଼" # Ub5d + : "ୋ" # Ub4b + : "ୈ" # Ub48 + : "ୌ" # Ub4c + : "≮" # U226e + : "≯" # U226f + : "⍊" # U234a + : "⌶" # U2336 + : "⍎" # U234e + : "₍" # U208d + : "₎" # U208e + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "ொ" # Ubca + : "ௌ" # Ubcc + : "₋" # U208b + : "₂" # U2082 + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "ோ" # Ubcb + : "⍡" # U2361 + : "⍑" # U2351 + : "⌶" # U2336 + : "⍕" # U2355 + : "ஔ" # Ub94 + : "⊅" # U2285 + : "⊄" # U2284 + : "⊬" # U22ac + : "ై" # Uc48 + : "ೀ" # Ucc0 + : "ೊ" # Ucca + : "ೇ" # Ucc7 + : "ೈ" # Ucc8 + : "ೋ" # Uccb + : "ൊ" # Ud4a + : "ൌ" # Ud4c + : "ോ" # Ud4b + : "ේ" # Udda + : "ො" # Uddc + : "ෞ" # Udde + : "ෝ" # Uddd + : "ཱི" # Uf73 + : "ཱུ" # Uf75 + : "ཱྀ" # Uf81 + : "ྐྵ" # Ufb9 + : "ྒྷ" # Uf93 + : "ྜྷ" # Uf9d + : "ྡྷ" # Ufa2 + : "ྦྷ" # Ufa7 + : "ྫྷ" # Ufac + : "ྲྀ" # Uf76 + : "ླྀ" # Uf78 + : "ཀྵ" # Uf69 + : "གྷ" # Uf43 + : "ཌྷ" # Uf4d + : "དྷ" # Uf52 + : "བྷ" # Uf57 + : "ཛྷ" # Uf5c + : "ဦ" # U1026 + : "ᄁ" # U1101 + : "ᄓ" # U1113 + : "ᄔ" # U1114 + : "ᄕ" # U1115 + : "ᄖ" # U1116 + : "ᄗ" # U1117 + : "ᄄ" # U1104 + : "ᄘ" # U1118 + : "ᄙ" # U1119 + : "ᄛ" # U111b + : "ᄚ" # U111a + : "ᄜ" # U111c + : "ᄝ" # U111d + : "ᄞ" # U111e + : "ᄟ" # U111f + : "ᄠ" # U1120 + : "ᄈ" # U1108 + : "ᄡ" # U1121 + : "ᄥ" # U1125 + : "ᄫ" # U112b + : "ᄧ" # U1127 + : "ᄨ" # U1128 + : "ᄩ" # U1129 + : "ᄪ" # U112a + : "ᄬ" # U112c + : "ᄢ" # U1122 + : "ᄣ" # U1123 + : "ᄤ" # U1124 + : "ᄦ" # U1126 + : "ᄬ" # U112c + : "ᄭ" # U112d + : "ᄮ" # U112e + : "ᄯ" # U112f + : "ᄰ" # U1130 + : "ᄱ" # U1131 + : "ᄲ" # U1132 + : "ᄊ" # U110a + : "ᄴ" # U1134 + : "ᄵ" # U1135 + : "ᄶ" # U1136 + : "ᄷ" # U1137 + : "ᄸ" # U1138 + : "ᄹ" # U1139 + : "ᄺ" # U113a + : "ᄻ" # U113b + : "ᄳ" # U1133 + : "ᄴ" # U1134 + : "ᅁ" # U1141 + : "ᅂ" # U1142 + : "ᅃ" # U1143 + : "ᅄ" # U1144 + : "ᅅ" # U1145 + : "ᅇ" # U1147 + : "ᅈ" # U1148 + : "ᅉ" # U1149 + : "ᅊ" # U114a + : "ᅋ" # U114b + : "ᅆ" # U1146 + : "ᅍ" # U114d + : "ᄍ" # U110d + : "ᅒ" # U1152 + : "ᅓ" # U1153 + : "ᅖ" # U1156 + : "ᅗ" # U1157 + : "ᅘ" # U1158 + : "ᄢ" # U1122 + : "ᄣ" # U1123 + : "ᄤ" # U1124 + : "ᄥ" # U1125 + : "ᄦ" # U1126 + : "ᄳ" # U1133 + : "ᄽ" # U113d + : "ᄿ" # U113f + : "ᅏ" # U114f + : "ᅑ" # U1151 + : "ᅶ" # U1176 + : "ᅷ" # U1177 + : "ᅢ" # U1162 + : "ᅸ" # U1178 + : "ᅹ" # U1179 + : "ᅤ" # U1164 + : "ᅺ" # U117a + : "ᅻ" # U117b + : "ᅼ" # U117c + : "ᅦ" # U1166 + : "ᅽ" # U117d + : "ᅾ" # U117e + : "ᅨ" # U1168 + : "ᅪ" # U116a + : "ᅫ" # U116b + : "ᅿ" # U117f + : "ᆀ" # U1180 + : "ᆁ" # U1181 + : "ᆂ" # U1182 + : "ᆃ" # U1183 + : "ᅬ" # U116c + : "ᅫ" # U116b + : "ᆄ" # U1184 + : "ᆅ" # U1185 + : "ᆆ" # U1186 + : "ᆇ" # U1187 + : "ᆈ" # U1188 + : "ᆉ" # U1189 + : "ᆊ" # U118a + : "ᅯ" # U116f + : "ᅰ" # U1170 + : "ᆌ" # U118c + : "ᆍ" # U118d + : "ᅱ" # U1171 + : "ᆋ" # U118b + : "ᆋ" # U118b + : "ᅰ" # U1170 + : "ᆎ" # U118e + : "ᆏ" # U118f + : "ᆐ" # U1190 + : "ᆑ" # U1191 + : "ᆒ" # U1192 + : "ᆓ" # U1193 + : "ᆔ" # U1194 + : "ᆕ" # U1195 + : "ᆖ" # U1196 + : "ᅴ" # U1174 + : "ᆗ" # U1197 + : "ᆘ" # U1198 + : "ᆙ" # U1199 + : "ᆚ" # U119a + : "ᆛ" # U119b + : "ᆜ" # U119c + : "ᆝ" # U119d + : "ᆟ" # U119f + : "ᆠ" # U11a0 + : "ᆡ" # U11a1 + : "ᆢ" # U11a2 + : "ᆩ" # U11a9 + : "ᇃ" # U11c3 + : "ᆪ" # U11aa + : "ᇄ" # U11c4 + : "ᇄ" # U11c4 + : "ᇅ" # U11c5 + : "ᇆ" # U11c6 + : "ᇇ" # U11c7 + : "ᆬ" # U11ac + : "ᇉ" # U11c9 + : "ᆭ" # U11ad + : "ᇈ" # U11c8 + : "ᇊ" # U11ca + : "ᇋ" # U11cb + : "ᆰ" # U11b0 + : "ᇌ" # U11cc + : "ᇍ" # U11cd + : "ᇎ" # U11ce + : "ᇐ" # U11d0 + : "ᆱ" # U11b1 + : "ᆲ" # U11b2 + : "ᇓ" # U11d3 + : "ᆳ" # U11b3 + : "ᇖ" # U11d6 + : "ᇘ" # U11d8 + : "ᆴ" # U11b4 + : "ᆵ" # U11b5 + : "ᆶ" # U11b6 + : "ᇑ" # U11d1 + : "ᇒ" # U11d2 + : "ᇔ" # U11d4 + : "ᇕ" # U11d5 + : "ᇗ" # U11d7 + : "ᇙ" # U11d9 + : "ᇌ" # U11cc + : "ᇑ" # U11d1 + : "ᇒ" # U11d2 + : "ᇓ" # U11d3 + : "ᇕ" # U11d5 + : "ᇔ" # U11d4 + : "ᇖ" # U11d6 + : "ᇚ" # U11da + : "ᇛ" # U11db + : "ᇜ" # U11dc + : "ᇝ" # U11dd + : "ᇞ" # U11de + : "ᇢ" # U11e2 + : "ᇠ" # U11e0 + : "ᇡ" # U11e1 + : "ᇟ" # U11df + : "ᇣ" # U11e3 + : "ᆹ" # U11b9 + : "ᇦ" # U11e6 + : "ᇤ" # U11e4 + : "ᇥ" # U11e5 + : "ᇧ" # U11e7 + : "ᇨ" # U11e8 + : "ᇩ" # U11e9 + : "ᇪ" # U11ea + : "ᆻ" # U11bb + : "ᇬ" # U11ec + : "ᇭ" # U11ed + : "ᇮ" # U11ee + : "ᇯ" # U11ef + : "ᇳ" # U11f3 + : "ᇴ" # U11f4 + : "ᇵ" # U11f5 + : "ᇶ" # U11f6 + : "ᇷ" # U11f7 + : "ᇸ" # U11f8 + : "ᇏ" # U11cf + : "ᇞ" # U11de + : "ᇭ" # U11ed + : "ᇱ" # U11f1 + : "ᇲ" # U11f2 + : "῎" # U1fce + : "῍" # U1fcd + : "῏" # U1fcf + : "῎" # U1fce + : "῍" # U1fcd + : "῎" # U1fce + : "῏" # U1fcf + : "῞" # U1fde + : "῝" # U1fdd + : "῟" # U1fdf + : "῞" # U1fde + : "῝" # U1fdd + : "῞" # U1fde + : "῟" # U1fdf + : "⍅" # U2345 + : "⍇" # U2347 + : "⍏" # U234f + : "⍐" # U2350 + : "⍆" # U2346 + : "⍈" # U2348 + : "⍖" # U2356 + : "⍗" # U2357 + : "∄" # U2204 + : "⍙" # U2359 + : "⍋" # U234b + : "⍍" # U234d + : "⍒" # U2352 + : "⍫" # U236b + : "⍢" # U2362 + : "⍔" # U2354 + : "∉" # U2209 + : "⍷" # U2377 + : "∌" # U220c + : "⍛" # U235b + : "⍤" # U2364 + : "⌾" # U233e + : "⍎" # U234e + : "⍕" # U2355 : "⍝" # U235d - : "⍕" # U2355 - : "⍎" # U234e : "⌻" # U233b - : "⌾" # U233e - : "⍦" # U2366 + : "∤" # U2224 + : "∦" # U2226 + : "⍲" # U2372 + : "⋄" # U22c4 + : "⍓" # U2353 + : "⍱" # U2371 + : "⋄" # U22c4 + : "⍌" # U234c + : "⍝" # U235d + : "≁" # U2241 + : "≄" # U2244 + : "≉" # U2249 + : "≭" # U226d + : "≢" # U2262 + : "⍯" # U236f + : "≴" # U2274 + : "≵" # U2275 + : "≸" # U2278 + : "≹" # U2279 + : "⊀" # U2280 + : "⊁" # U2281 + : "⋠" # U22e0 + : "⋡" # U22e1 : "⊆" # U2286 : "⍧" # U2367 : "⊇" # U2287 @@ -539,13 +4413,9 @@ : "⊉" # U2289 : "⋢" # U22e2 : "⋣" # U22e3 - : "⍡" # U2361 - : "⍑" # U2351 - : "⍕" # U2355 - : "⌶" # U2336 - : "⍊" # U234a - : "⍎" # U234e - : "⌶" # U2336 + : "⊭" # U22ad + : "⊮" # U22ae + : "⊯" # U22af : "⋪" # U22ea : "⋫" # U22eb : "⋬" # U22ec @@ -564,6 +4434,7 @@ : "⍰" # U2370 : "⍂" # U2342 : "⌹" # U2339 + : "⌼" # U233c : "⍇" # U2347 : "⍐" # U2350 : "⍈" # U2348 @@ -575,13 +4446,33 @@ : "⍌" # U234c : "⍯" # U236f : "⌺" # U233a - : "⌼" # U233c - : "⍟" # U235f - : "⊖" # U2296 - : "⊙" # U2299 - : "⍉" # U2349 - : "⍜" # U235c - : "⌽" # U233d - : "⍥" # U2365 - : "⌾" # U233e - : "⌼" # U233c + : "⫝̸" # U2adc + : "ẛ" # U1e9b + : "Đ" # U110 + : "Ǥ" # U1e4 + : "Ħ" # U126 + : "Ɨ" # U197 + : "Ł" # U141 + : "Ø" # Ud8 + : "Ŧ" # U166 + : "Ƶ" # U1b5 + : "ƀ" # U180 + : "đ" # U111 + : "ǥ" # U1e5 + : "ħ" # U127 + : "ɨ" # U268 + : "ł" # U142 + : "ø" # Uf8 + : "ŧ" # U167 + : "ƶ" # U1b6 + : "ʡ" # U2a1 + : "Ұ" # U4b0 + : "ұ" # U4b1 + : "ғ" # U493 + : "ҟ" # U49f + : "Ғ" # U492 + : "Ҟ" # U49e + : "↚" # U219a + : "↛" # U219b + : "↮" # U21ae + : "≠" # U2260 -- cgit v1.2.1 From 45d39c2802eb682e95cdf25ca0094a29ef150814 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 15:54:05 -0400 Subject: composetable: Switch to using a hash table This lets us naturally replace matching sequences while parsing. That means that the semantics are now "last one wins" if the parser sees multiple entries for the same sequence. Add a testcase that checks the new replacement semantics. --- gtk/gtkcomposetable.c | 342 ++++++++++++++------------------- testsuite/gtk/compose/include | 2 +- testsuite/gtk/compose/include.expected | 5 +- testsuite/gtk/compose/included | 2 +- 4 files changed, 145 insertions(+), 206 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index abb9d7f15e..449d63e340 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -36,21 +36,51 @@ extern const GtkComposeTableCompact gtk_compose_table_compact; #define MAX_COMPOSE_LEN 20 -typedef struct { - gunichar *sequence; - char *value; -} GtkComposeData; +/* Implemented from g_str_hash() */ +static guint32 +data_hash (gconstpointer v, int length) +{ + const guint16 *p, *head; + unsigned char c; + guint32 h = 5381; -static void -gtk_compose_data_free (GtkComposeData *compose_data) + for (p = v, head = v; (p - head) < length; p++) + { + c = 0x00ff & (*p >> 8); + h = (h << 5) + h + c; + c = 0x00ff & *p; + h = (h << 5) + h + c; + } + + return h; +} + +static guint32 +sequence_hash (gconstpointer v) { - g_free (compose_data->sequence); - g_free (compose_data->value); - g_slice_free (GtkComposeData, compose_data); + const gunichar *p = v; + int i; + + for (i = 0; p[i]; i++) ; + + return data_hash (v, i); +} + +static gboolean +sequence_equal (gconstpointer v1, + gconstpointer v2) +{ + const gunichar *p1 = v1; + const gunichar *p2 = v2; + int i; + + for (i = 0; p1[i] && p2[i] && p1[i] == p2[i]; i++) ; + + return p1[i] == p2[i]; } typedef struct { - GList *sequences; + GHashTable *sequences; GList *files; const char *compose_file; } GtkComposeParser; @@ -62,7 +92,7 @@ parser_new (void) parser = g_new (GtkComposeParser, 1); - parser->sequences = NULL; + parser->sequences = g_hash_table_new_full (sequence_hash, sequence_equal, g_free, g_free); parser->files = NULL; parser->compose_file = NULL; @@ -72,7 +102,7 @@ parser_new (void) static void parser_free (GtkComposeParser *parser) { - g_list_free_full (parser->sequences, (GDestroyNotify) gtk_compose_data_free); + g_hash_table_unref (parser->sequences); g_list_free_full (parser->files, g_free); g_free (parser); } @@ -95,10 +125,9 @@ is_codepoint (const char *str) return TRUE; } -static gboolean -parse_compose_value (GtkComposeData *compose_data, - const char *val, - const char *line) +static char * +parse_compose_value (const char *val, + const char *line) { const char *p; GString *value; @@ -118,8 +147,7 @@ parse_compose_value (GtkComposeData *compose_data, { if (*p == '\"') { - compose_data->value = g_string_free (value, FALSE); - return TRUE; + return g_string_free (value, FALSE); } if (p[1] == '\0') @@ -177,18 +205,17 @@ parse_compose_value (GtkComposeData *compose_data, fail: g_string_free (value, TRUE); - - return FALSE; + return NULL; } -static gboolean -parse_compose_sequence (GtkComposeData *compose_data, - const char *seq, - const char *line) +static gunichar * +parse_compose_sequence (const char *seq, + const char *line) { char **words = g_strsplit (seq, "<", -1); int i; int n = 0; + gunichar *sequence = NULL; if (g_strv_length (words) < 2) { @@ -214,22 +241,19 @@ parse_compose_sequence (GtkComposeData *compose_data, match = g_strndup (start, end - start); - if (compose_data->sequence == NULL) - compose_data->sequence = g_malloc (sizeof (gunichar) * 2); - else - compose_data->sequence = g_realloc (compose_data->sequence, sizeof (gunichar) * (n + 2)); + sequence = g_realloc (sequence, sizeof (gunichar) * (n + 2)); if (is_codepoint (match)) { codepoint = (gunichar) g_ascii_strtoll (match + 1, NULL, 16); - compose_data->sequence[n] = codepoint; - compose_data->sequence[n + 1] = 0; + sequence[n] = codepoint; + sequence[n + 1] = 0; } else { codepoint = (gunichar) gdk_keyval_from_name (match); - compose_data->sequence[n] = codepoint; - compose_data->sequence[n + 1] = 0; + sequence[n] = codepoint; + sequence[n + 1] = 0; } if (codepoint == GDK_KEY_VoidSymbol) @@ -238,19 +262,21 @@ parse_compose_sequence (GtkComposeData *compose_data, n++; } - g_strfreev (words); if (0 == n || n > MAX_COMPOSE_LEN) { g_warning ("Suspicious compose sequence length (%d). Are you sure this is right?: %s", n, line); - return FALSE; + goto fail; } - return TRUE; + g_strfreev (words); + + return sequence; fail: g_strfreev (words); - return FALSE; + g_free (sequence); + return NULL; } static void parser_parse_file (GtkComposeParser *parser, @@ -304,7 +330,6 @@ static void parser_add_default_sequences (GtkComposeParser *parser) { const GtkComposeTableCompact *table = >k_compose_table_compact; - GtkComposeData *data; for (int idx = 0; idx < table->n_index_size; idx++) { @@ -317,18 +342,17 @@ parser_add_default_sequences (GtkComposeParser *parser) for (int j = seq_index[i]; j < seq_index[i + 1]; j += row_stride) { char buf[8] = { 0, }; + gunichar *sequence; - data = g_slice_new0 (GtkComposeData); - data->sequence = g_new0 (gunichar, row_stride + 2); - data->sequence[0] = seq_index[0]; + sequence = g_new0 (gunichar, row_stride + 2); + sequence[0] = seq_index[0]; for (int k = 0; k < i; k++) - data->sequence[1 + k] = table->data[j + k]; - data->sequence[1 + i] = 0; + sequence[1 + k] = table->data[j + k]; + sequence[1 + i] = 0; g_unichar_to_utf8 (table->data[j + i], buf); - data->value = g_strdup (buf); - parser->sequences = g_list_append (parser->sequences, data); + g_hash_table_replace (parser->sequences, sequence, g_strdup (buf)); } } } @@ -393,7 +417,8 @@ parser_parse_line (GtkComposeParser *parser, const char *line) { char **components = NULL; - GtkComposeData *compose_data = NULL; + gunichar *sequence = NULL; + char *value = NULL; if (line[0] == '\0' || line[0] == '#') return; @@ -412,24 +437,24 @@ parser_parse_line (GtkComposeParser *parser, goto fail; } - compose_data = g_slice_new0 (GtkComposeData); - - if (!parse_compose_sequence (compose_data, g_strstrip (components[0]), line)) + sequence = parse_compose_sequence (g_strstrip (components[0]), line); + if (sequence == NULL) goto fail; - if (!parse_compose_value (compose_data, g_strstrip (components[1]), line)) + value = parse_compose_value (g_strstrip (components[1]), line); + if (value == NULL) goto fail; g_strfreev (components); - parser->sequences = g_list_append (parser->sequences, compose_data); + g_hash_table_replace (parser->sequences, sequence, value); return; fail: g_strfreev (components); - if (compose_data) - gtk_compose_data_free (compose_data); + g_free (sequence); + g_free (value); } static void @@ -456,114 +481,66 @@ parser_read_file (GtkComposeParser *parser, g_free (contents); } -static GList * -gtk_compose_list_check_duplicated (GList *compose_list) +static void +parser_remove_duplicates (GtkComposeParser *parser) { - GList *list; - GList *removed_list = NULL; - GtkComposeData *compose_data; + GHashTableIter iter; + gunichar *sequence; + char *value; - for (list = compose_list; list != NULL; list = list->next) + g_hash_table_iter_init (&iter, parser->sequences); + while (g_hash_table_iter_next (&iter, (gpointer *)&sequence, (gpointer *)&value)) { static guint16 keysyms[MAX_COMPOSE_LEN + 1]; int i; int n_compose = 0; gunichar output_char; char buf[8] = { 0, }; - - compose_data = list->data; + gboolean remove_sequence = FALSE; for (i = 0; i < MAX_COMPOSE_LEN + 1; i++) keysyms[i] = 0; for (i = 0; i < MAX_COMPOSE_LEN + 1; i++) { - gunichar codepoint = compose_data->sequence[i]; + gunichar codepoint = sequence[i]; keysyms[i] = (guint16) codepoint; if (codepoint == 0) break; + if (codepoint > 0xffff) + remove_sequence = TRUE; + n_compose++; } if (gtk_check_algorithmically (keysyms, n_compose, &output_char)) { g_unichar_to_utf8 (output_char, buf); - if (strcmp (compose_data->value, buf) == 0) - removed_list = g_list_prepend (removed_list, compose_data); - } - } - - for (list = removed_list; list != NULL; list = list->next) - { - compose_data = list->data; - compose_list = g_list_remove (compose_list, compose_data); - gtk_compose_data_free (compose_data); - } - - g_list_free (removed_list); - - return compose_list; -} - -static GList * -gtk_compose_list_check_uint16 (GList *compose_list) -{ - GList *list; - GList *removed_list = NULL; - GtkComposeData *compose_data; - - for (list = compose_list; list != NULL; list = list->next) - { - int i; - - compose_data = list->data; - for (i = 0; i < MAX_COMPOSE_LEN; i++) - { - gunichar codepoint = compose_data->sequence[i]; - - if (codepoint == 0) - break; - - if (codepoint > 0xffff) - { - removed_list = g_list_prepend (removed_list, compose_data); - break; - } + if (strcmp (value, buf) == 0) + remove_sequence = TRUE; } - } - for (list = removed_list; list != NULL; list = list->next) - { - compose_data = list->data; - compose_list = g_list_remove (compose_list, compose_data); - gtk_compose_data_free (compose_data); + if (remove_sequence) + g_hash_table_iter_remove (&iter); } - - g_list_free (removed_list); - - return compose_list; } -static GList * -gtk_compose_list_format_for_gtk (GList *compose_list, - int *p_max_compose_len, - int *p_n_index_stride) +static int +parser_compute_max_compose_len (GtkComposeParser *parser) { - GList *list; - GtkComposeData *compose_data; + GHashTableIter iter; int max_compose_len = 0; - int i; - gunichar codepoint; + gunichar *sequence; + char *value; - for (list = compose_list; list != NULL; list = list->next) + g_hash_table_iter_init (&iter, parser->sequences); + while (g_hash_table_iter_next (&iter, (gpointer *)&sequence, (gpointer *)&value)) { - compose_data = list->data; - for (i = 0; i < MAX_COMPOSE_LEN + 1; i++) + for (int i = 0; i < MAX_COMPOSE_LEN + 1; i++) { - codepoint = compose_data->sequence[i]; - if (codepoint == 0) + if (sequence[i] == 0) { if (max_compose_len < i) max_compose_len = i; @@ -572,27 +549,22 @@ gtk_compose_list_format_for_gtk (GList *compose_list, } } - if (p_max_compose_len) - *p_max_compose_len = max_compose_len; - if (p_n_index_stride) - *p_n_index_stride = max_compose_len + 2; - - return compose_list; + return max_compose_len; } static int -gtk_compose_data_compare (gpointer a, - gpointer b, - gpointer data) +sequence_compare (gpointer a, + gpointer b, + gpointer data) { - GtkComposeData *compose_data_a = a; - GtkComposeData *compose_data_b = b; + gunichar *seq_a = a; + gunichar *seq_b = b; int max_compose_len = GPOINTER_TO_INT (data); int i; for (i = 0; i < max_compose_len; i++) { - gunichar code_a = compose_data_a->sequence[i]; - gunichar code_b = compose_data_b->sequence[i]; + gunichar code_a = seq_a[i]; + gunichar code_b = seq_b[i]; if (code_a != code_b) return code_a - code_b; @@ -601,25 +573,6 @@ gtk_compose_data_compare (gpointer a, return 0; } -/* Implemented from g_str_hash() */ -static guint32 -data_hash (gconstpointer v, int length) -{ - const guint16 *p, *head; - unsigned char c; - guint32 h = 5381; - - for (p = v, head = v; (p - head) < length; p++) - { - c = 0x00ff & (*p >> 8); - h = (h << 5) + h + c; - c = 0x00ff & *p; - h = (h << 5) + h + c; - } - - return h; -} - guint32 gtk_compose_table_data_hash (const guint16 *data, int max_seq_len, @@ -859,55 +812,69 @@ out_save_cache: } static GtkComposeTable * -gtk_compose_table_new_with_list (GList *compose_list, - int max_compose_len, - int n_index_stride, - guint32 hash) +parser_get_compose_table (GtkComposeParser *parser) { guint length; guint n = 0; int i, j; guint16 *gtk_compose_seqs = NULL; GList *list; - GtkComposeData *compose_data; GtkComposeTable *retval = NULL; gunichar codepoint; GString *char_data; + int max_compose_len = 0; + GList *sequences; + guint32 hash; + + parser_remove_duplicates (parser); + + if (g_hash_table_size (parser->sequences) == 0) + return NULL; + + hash = g_str_hash (parser->compose_file); - g_return_val_if_fail (compose_list != NULL, NULL); + max_compose_len = parser_compute_max_compose_len (parser); - length = g_list_length (compose_list); + sequences = g_hash_table_get_keys (parser->sequences); - gtk_compose_seqs = g_new0 (guint16, length * n_index_stride); + sequences = g_list_sort_with_data (sequences, + (GCompareDataFunc) sequence_compare, + GINT_TO_POINTER (max_compose_len)); + + length = g_list_length (sequences); + + gtk_compose_seqs = g_new0 (guint16, length * (max_compose_len + 2)); char_data = g_string_new (""); - for (list = compose_list; list != NULL; list = list->next) + for (list = sequences; list != NULL; list = list->next) { - compose_data = list->data; + gunichar *sequence = list->data; + char *value = g_hash_table_lookup (parser->sequences, sequence); + for (i = 0; i < max_compose_len; i++) { - if (compose_data->sequence[i] == 0) + if (sequence[i] == 0) { for (j = i; j < max_compose_len; j++) gtk_compose_seqs[n++] = 0; break; } - gtk_compose_seqs[n++] = (guint16) compose_data->sequence[i]; + gtk_compose_seqs[n++] = (guint16) sequence[i]; } - if (g_utf8_strlen (compose_data->value, -1) > 1) + if (g_utf8_strlen (value, -1) > 1) { if (char_data->len > 0) g_string_append_c (char_data, 0); codepoint = char_data->len | (1 << 31); - g_string_append (char_data, compose_data->value); + g_string_append (char_data, value); } else { - codepoint = g_utf8_get_char (compose_data->value); + codepoint = g_utf8_get_char (value); g_assert ((codepoint & (1 << 31)) == 0); } @@ -923,6 +890,8 @@ gtk_compose_table_new_with_list (GList *compose_list, retval->n_chars = char_data->len; retval->char_data = g_string_free (char_data, FALSE); + g_list_free (sequences); + return retval; } @@ -966,35 +935,6 @@ parser_parse_file (GtkComposeParser *parser, parser->files = g_list_remove (parser->files, path); } -static GtkComposeTable * -parser_get_compose_table (GtkComposeParser *parser) -{ - int max_compose_len = 0; - int n_index_stride = 0; - - if (parser->sequences == NULL) - return NULL; - - parser->sequences = gtk_compose_list_check_duplicated (parser->sequences); - parser->sequences = gtk_compose_list_check_uint16 (parser->sequences); - parser->sequences = gtk_compose_list_format_for_gtk (parser->sequences, - &max_compose_len, - &n_index_stride); - parser->sequences = g_list_sort_with_data (parser->sequences, - (GCompareDataFunc) gtk_compose_data_compare, - GINT_TO_POINTER (max_compose_len)); - if (parser->sequences == NULL) - { - g_warning ("compose file %s does not include any keys besides keys in en-us compose file", parser->compose_file); - return NULL; - } - - return gtk_compose_table_new_with_list (parser->sequences, - max_compose_len, - n_index_stride, - g_str_hash (parser->compose_file)); -} - GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file) { diff --git a/testsuite/gtk/compose/include b/testsuite/gtk/compose/include index a4769355a4..10abadf446 100644 --- a/testsuite/gtk/compose/include +++ b/testsuite/gtk/compose/include @@ -1,3 +1,3 @@ include "testsuite/gtk/compose/included" # see if this works - : "!" + : "!" diff --git a/testsuite/gtk/compose/include.expected b/testsuite/gtk/compose/include.expected index 10fbc4418c..b2145d544b 100644 --- a/testsuite/gtk/compose/include.expected +++ b/testsuite/gtk/compose/include.expected @@ -1,4 +1,3 @@ -# n_seqs: 2 +# n_seqs: 1 # max_seq_len: 4 - : "\"\\" - : "!" # U21 + : "!" # U21 diff --git a/testsuite/gtk/compose/included b/testsuite/gtk/compose/included index 0d29359189..d5d3a68adc 100644 --- a/testsuite/gtk/compose/included +++ b/testsuite/gtk/compose/included @@ -1 +1 @@ - : "\"\\" + : "XO" -- cgit v1.2.1 From 485dc052ca0fb5166237085e80e37de3762a2082 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 16:09:11 -0400 Subject: composetable: Allow removing sequences Interpret an empty string as value in the Compose file to mean: Remove this sequence. Tests included. --- gtk/gtkcomposetable.c | 16 +++++++++++++++- testsuite/gtk/compose/include | 3 ++- testsuite/gtk/compose/included | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 449d63e340..e32f11f3d5 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -481,6 +481,10 @@ parser_read_file (GtkComposeParser *parser, g_free (contents); } +/* Remove sequences that can be handled algorithmically, + * sequences with non-BMP keys, and sequences that produce + * empty strings. + */ static void parser_remove_duplicates (GtkComposeParser *parser) { @@ -498,6 +502,12 @@ parser_remove_duplicates (GtkComposeParser *parser) char buf[8] = { 0, }; gboolean remove_sequence = FALSE; + if (value[0] == '\0') + { + remove_sequence = TRUE; + goto next; + } + for (i = 0; i < MAX_COMPOSE_LEN + 1; i++) keysyms[i] = 0; @@ -510,7 +520,10 @@ parser_remove_duplicates (GtkComposeParser *parser) break; if (codepoint > 0xffff) - remove_sequence = TRUE; + { + remove_sequence = TRUE; + goto next; + } n_compose++; } @@ -522,6 +535,7 @@ parser_remove_duplicates (GtkComposeParser *parser) remove_sequence = TRUE; } +next: if (remove_sequence) g_hash_table_iter_remove (&iter); } diff --git a/testsuite/gtk/compose/include b/testsuite/gtk/compose/include index 10abadf446..f69d7a79e7 100644 --- a/testsuite/gtk/compose/include +++ b/testsuite/gtk/compose/include @@ -1,3 +1,4 @@ include "testsuite/gtk/compose/included" # see if this works - : "!" + : "!" # replace this entry + : "" # remove this entry diff --git a/testsuite/gtk/compose/included b/testsuite/gtk/compose/included index d5d3a68adc..77162b6563 100644 --- a/testsuite/gtk/compose/included +++ b/testsuite/gtk/compose/included @@ -1 +1,2 @@ : "XO" + : "Aaah!" -- cgit v1.2.1 From 8087250476b7cc6c8c6b1dace2bb89815682504e Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 17:03:11 -0400 Subject: imcontext: Replace the builtin sequences When we find a Compose file, replace the builtin sequences with the table we found. This matches the semantics described in Compose(5), and makes it possible to drop unwanted sequences from the builtin table. It is slight change of behavior for users with existing Compose files. To match the previous behavior, you have to add include "%L" to your Compose file, to keep the builtin sequences in addition to your own. --- gtk/gtkimcontextsimple.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 4e160ab048..078ed6f612 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -40,15 +40,15 @@ * * `GtkIMContextSimple` is an input method supporting table-based input methods. * - * `GtkIMContextSimple` has a built-in table of compose sequences that is - * derived from the X11 Compose files. - * - * `GtkIMContextSimple` reads additional compose sequences from the first of the + * `GtkIMContextSimple` reads compose sequences from the first of the * following files that is found: ~/.config/gtk-4.0/Compose, ~/.XCompose, * /usr/share/X11/locale/$locale/Compose (for locales that have a nontrivial * Compose file). The syntax of these files is described in the Compose(5) * manual page. * + * If none of these files is found, `GtkIMContextSimple` uses a built-in table + * of compose sequences that is derived from the X11 Compose files. + * * ## Unicode characters * * `GtkIMContextSimple` also supports numeric entry of Unicode characters @@ -88,6 +88,7 @@ const GtkComposeTableCompact gtk_compose_table_compact = { G_LOCK_DEFINE_STATIC (global_tables); static GSList *global_tables; +static gboolean omit_builtin_sequences; static const guint16 gtk_compose_ignore[] = { 0, /* Yes, XKB will send us key press events with NoSymbol :( */ @@ -173,7 +174,8 @@ gtk_compose_table_find (gconstpointer data1, } static void -add_compose_table_from_file (const char *compose_file) +add_compose_table_from_file (const char *compose_file, + gboolean replace_builtin) { guint hash; @@ -187,7 +189,11 @@ add_compose_table_from_file (const char *compose_file) table = gtk_compose_table_new_with_file (compose_file); if (table) - global_tables = g_slist_prepend (global_tables, table); + { + global_tables = g_slist_prepend (global_tables, table); + if (replace_builtin) + omit_builtin_sequences = TRUE; + } } G_UNLOCK (global_tables); @@ -231,7 +237,7 @@ gtk_im_context_simple_init_compose_table (void) path = g_build_filename (g_get_user_config_dir (), "gtk-4.0", "Compose", NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) { - add_compose_table_from_file (path); + add_compose_table_from_file (path, TRUE); g_free (path); return; } @@ -244,7 +250,7 @@ gtk_im_context_simple_init_compose_table (void) path = g_build_filename (home, ".XCompose", NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) { - add_compose_table_from_file (path); + add_compose_table_from_file (path, TRUE); g_free (path); return; } @@ -288,7 +294,9 @@ gtk_im_context_simple_init_compose_table (void) g_strfreev (langs); if (path != NULL) - add_compose_table_from_file (path); + { + add_compose_table_from_file (path, TRUE); + } g_free (path); } @@ -1066,7 +1074,10 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, if (success) return TRUE; - if (gtk_compose_table_compact_check (>k_compose_table_compact, + G_LOCK (global_tables); + + if (!omit_builtin_sequences && + gtk_compose_table_compact_check (>k_compose_table_compact, priv->compose_buffer, n_compose, &compose_finish, &compose_match, &output_char)) @@ -1096,6 +1107,8 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, return TRUE; } + G_UNLOCK (global_tables); + if (gtk_check_algorithmically (priv->compose_buffer, n_compose, &output_char)) { if (!priv->in_compose_sequence) @@ -1255,8 +1268,6 @@ gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple, int max_seq_len, int n_seqs) { - GtkComposeTable *table; - g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); add_compose_table_from_data (data, max_seq_len, n_seqs); @@ -1275,5 +1286,5 @@ gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple, { g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); - add_compose_table_from_file (compose_file); + add_compose_table_from_file (compose_file, FALSE); } -- cgit v1.2.1 From 1cff4bb27ae2abe421a062c6ea8c1fda56151425 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 23:22:23 -0400 Subject: composetable: Ignore length 1 sequences It turns out that the X11 Compose file has some length 1 sequences which are not interesting to us. --- gtk/gtkcomposetable.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index e32f11f3d5..2a012efa29 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -508,6 +508,12 @@ parser_remove_duplicates (GtkComposeParser *parser) goto next; } + if (sequence[1] == 0) + { + remove_sequence = TRUE; + goto next; + } + for (i = 0; i < MAX_COMPOSE_LEN + 1; i++) keysyms[i] = 0; -- cgit v1.2.1 From 54dffa07f309c90677ae57eea8feb41acc5be717 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 8 Jul 2021 17:59:50 -0400 Subject: composetable: Drop GtkComposeTableCompact All tables use the compact format now, and we generate caches in that format too. Bump the cache version to 3 for this. Replace the python script for generating the builtin table by a small C program using the same code to generate the data for the builtin table. This drops the restriction on only generating a single character in the builtin sequences. --- gtk/compose/chars | Bin 0 -> 1573 bytes gtk/compose/compose-parse.c | 63 + gtk/compose/compose-parse.py | 984 ---- gtk/compose/gtk-compose-lookaside.txt | 405 -- gtk/compose/gtkcomposedata.h | 9 + gtk/compose/meson.build | 7 + gtk/compose/sequences | Bin 0 -> 33042 bytes gtk/gen-gtk-gresources-xml.py | 2 + gtk/gtkcomposetable.c | 532 +- gtk/gtkcomposetable.h | 75 +- gtk/gtkimcontextsimple.c | 80 +- gtk/gtkimcontextsimple.h | 8 +- gtk/meson.build | 2 + testsuite/gtk/compose/basic.expected | 4 +- testsuite/gtk/compose/codepoint.expected | 4 +- testsuite/gtk/compose/comments.expected | 4 +- testsuite/gtk/compose/cycle | 2 +- testsuite/gtk/compose/hex.expected | 4 +- testsuite/gtk/compose/include | 2 +- testsuite/gtk/compose/include.expected | 4 +- testsuite/gtk/compose/long.expected | 4 +- testsuite/gtk/compose/match.expected | 10 +- testsuite/gtk/compose/multi.expected | 8 +- testsuite/gtk/compose/octal.expected | 4 +- testsuite/gtk/compose/strings.expected | 8 +- testsuite/gtk/compose/system.expected | 8375 ++++++++++++++++-------------- testsuite/gtk/composetable.c | 147 +- 27 files changed, 5014 insertions(+), 5733 deletions(-) create mode 100644 gtk/compose/chars create mode 100644 gtk/compose/compose-parse.c delete mode 100755 gtk/compose/compose-parse.py delete mode 100644 gtk/compose/gtk-compose-lookaside.txt create mode 100644 gtk/compose/gtkcomposedata.h create mode 100644 gtk/compose/meson.build create mode 100644 gtk/compose/sequences diff --git a/gtk/compose/chars b/gtk/compose/chars new file mode 100644 index 0000000000..9f9b15314f Binary files /dev/null and b/gtk/compose/chars differ diff --git a/gtk/compose/compose-parse.c b/gtk/compose/compose-parse.c new file mode 100644 index 0000000000..55e9331f3e --- /dev/null +++ b/gtk/compose/compose-parse.c @@ -0,0 +1,63 @@ +#include +#include "gtk/gtkcomposetable.h" +#include + +/* This program reads a Compose file and generates files with sequences, + * character data, and definitions for the builtin compose table of GTK. + * Run it like this: + * + * compose-parse Compose sequences chars gtkcomposedata.h + * + * The GTK build expects the output files to be in the source tree, in + * the gtk/compose directory. + */ +int +main (int argc, char *argv[]) +{ + GtkComposeTable *table; + GError *error = NULL; + GString *str; + + setlocale (LC_ALL, ""); + + if (argc < 5) + { + g_print ("Usage: compose-parse INPUT OUTPUT1 OUTPUT2 OUTPUT3\n"); + exit (1); + } + + table = gtk_compose_table_parse (argv[1]); + if (!table) + g_error ("Failed to parse %s", argv[1]); + + /* data_size is the size in guint16 */ + if (!g_file_set_contents (argv[2], (char *)table->data, 2 * table->data_size, &error)) + g_error ("%s", error->message); + + if (!g_file_set_contents (argv[3], table->char_data, table->n_chars + 1, &error)) + g_error ("%s", error->message); + + str = g_string_new (""); + g_string_append (str, + "#ifndef __GTK_COMPOSE_DATA__\n" + "#define __GTK_COMPOSE_DATA__\n" + "\n"); + g_string_append_printf (str, + "#define MAX_SEQ_LEN %d\n", table->max_seq_len); + g_string_append_printf (str, + "#define N_INDEX_SIZE %d\n", table->n_index_size); + g_string_append_printf (str, + "#define DATA_SIZE %d\n", table->data_size); + g_string_append_printf (str, + "#define N_CHARS %d\n", table->n_chars); + g_string_append (str, + "\n" + "#endif\n"); + + if (!g_file_set_contents (argv[4], str->str, str->len, &error)) + g_error ("%s", error->message); + + g_string_free (str, TRUE); + + return 0; +} diff --git a/gtk/compose/compose-parse.py b/gtk/compose/compose-parse.py deleted file mode 100755 index 23444bc1ed..0000000000 --- a/gtk/compose/compose-parse.py +++ /dev/null @@ -1,984 +0,0 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- -# -# compose-parse.py, version 1.4 -# -# multifunction script that helps manage the compose sequence table in GTK+ (gtk/gtkimcontextsimple.c) -# the script produces statistics and information about the whole process, run with --help for more. -# -# You may need to switch your python installation to utf-8, if you get 'ascii' codec errors. -# -# Complain to Simos Xenitellis (simos@gnome.org, http://simos.info/blog) for this craft. - -from re import findall, match, split, sub -from string import atoi -from unicodedata import normalize -from urllib import urlretrieve -from os.path import isfile, getsize -from copy import copy - -import sys -import getopt - -# We grab files off the web, left and right. -URL_COMPOSE = 'http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre' -URL_KEYSYMSTXT = "http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt" -URL_GDKKEYSYMSH = "http://git.gnome.org/browse/gtk%2B/plain/gdk/gdkkeysyms.h" -URL_UNICODEDATATXT = 'http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt' -FILENAME_COMPOSE_SUPPLEMENTARY = 'gtk-compose-lookaside.txt' -FILENAME_COMPOSE_NEGATIVE_SUPPLEMENTARY = 'gtk-compose-remove.txt' - -# We currently support keysyms of size 2; once upstream xorg gets sorted, -# we might produce some tables with size 2 and some with size 4. -SIZEOFINT = 2 - -# Current max compose sequence length; in case it gets increased. -WIDTHOFCOMPOSETABLE = 5 - -keysymdatabase = {} -keysymunicodedatabase = {} -unicodedatabase = {} - -headerfile_start = """/* GTK - The GIMP Tool Kit - * Copyright (C) 2007, 2008 GNOME Foundation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/* - * File auto-generated from script found at http://bugzilla.gnome.org/show_bug.cgi?id=321896 - * using the input files - * Input : http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre - * Input : http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt - * Input : http://www.unicode.org/Public/UNIDATA/UnicodeData.txt - * - * This table is optimised for space and requires special handling to access the content. - * This table is used solely by http://svn.gnome.org/viewcvs/gtk%2B/trunk/gtk/gtkimcontextsimple.c - * - * The resulting file is placed at http://svn.gnome.org/viewcvs/gtk%2B/trunk/gtk/gtkimcontextsimpleseqs.h - * This file is described in bug report http://bugzilla.gnome.org/show_bug.cgi?id=321896 - */ - -/* - * Modified by the GTK+ Team and others 2007, 2008. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __GTK_IM_CONTEXT_SIMPLE_SEQS_H__ -#define __GTK_IM_CONTEXT_SIMPLE_SEQS_H__ - -/* === These are the original comments of the file; we keep for historical purposes === - * - * The following table was generated from the X compose tables include with - * XFree86 4.0 using a set of Perl scripts. Contact Owen Taylor - * to obtain the relevant perl scripts. - * - * The following compose letter letter sequences conflicted - * Dstroke/dstroke and ETH/eth; resolved to Dstroke (Croatian, Vietnamese, Lappish), over - * ETH (Icelandic, Faroese, old English, IPA) [ D- -D d- -d ] - * Amacron/amacron and ordfeminine; resolved to ordfeminine [ _A A_ a_ _a ] - * Amacron/amacron and Atilde/atilde; resolved to atilde [ -A A- a- -a ] - * Omacron/Omacron and masculine; resolved to masculine [ _O O_ o_ _o ] - * Omacron/omacron and Otilde/atilde; resolved to otilde [ -O O- o- -o ] - * - * [ Amacron and Omacron are in Latin-4 (Baltic). ordfeminine and masculine are used for - * spanish. atilde and otilde are used at least for Portuguese ] - * - * at and Aring; resolved to Aring [ AA ] - * guillemotleft and caron; resolved to guillemotleft [ << ] - * ogonek and cedilla; resolved to cedilla [ ,, ] - * - * This probably should be resolved by first checking an additional set of compose tables - * that depend on the locale or selected input method. - */ - -static const guint16 gtk_compose_seqs_compact[] = {""" - -headerfile_end = """}; - -#endif /* __GTK_IM_CONTEXT_SIMPLE_SEQS_H__ */ -""" - -def stringtohex(str): return atoi(str, 16) - -def factorial(n): - if n <= 1: - return 1 - else: - return n * factorial(n-1) - -def uniq(*args) : - """ Performs a uniq operation on a list or lists """ - theInputList = [] - for theList in args: - theInputList += theList - theFinalList = [] - for elem in theInputList: - if elem not in theFinalList: - theFinalList.append(elem) - return theFinalList - - - -def all_permutations(seq): - """ Borrowed from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252178 """ - """ Produces all permutations of the items of a list """ - if len(seq) <=1: - yield seq - else: - for perm in all_permutations(seq[1:]): - for i in range(len(perm)+1): - #nb str[0:1] works in both string and list contexts - yield perm[:i] + seq[0:1] + perm[i:] - -def usage(): - print """compose-parse available parameters: - -h, --help this craft - -s, --statistics show overall statistics (both algorithmic, non-algorithmic) - -a, --algorithmic show sequences saved with algorithmic optimisation - -g, --gtk show entries that go to GTK+ - -u, --unicodedatatxt show compose sequences derived from UnicodeData.txt (from unicode.org) - -v, --verbose show verbose output - -p, --plane1 show plane1 compose sequences - -n, --numeric when used with --gtk, create file with numeric values only - -e, --gtk-expanded when used with --gtk, create file that repeats first column; not usable in GTK+ - - Default is to show statistics. - """ - -try: - opts, args = getopt.getopt(sys.argv[1:], "pvgashune", ["help", "algorithmic", "statistics", "unicodedatatxt", - "stats", "gtk", "verbose", "plane1", "numeric", "gtk-expanded"]) -except: - usage() - sys.exit(2) - -opt_statistics = False -opt_algorithmic = False -opt_gtk = False -opt_unicodedatatxt = False -opt_verbose = False -opt_plane1 = False -opt_numeric = False -opt_gtkexpanded = False - -for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - if o in ("-s", "--statistics"): - opt_statistics = True - if o in ("-a", "--algorithmic"): - opt_algorithmic = True - if o in ("-g", "--gtk"): - opt_gtk = True - if o in ("-u", "--unicodedatatxt"): - opt_unicodedatatxt = True - if o in ("-v", "--verbose"): - opt_verbose = True - if o in ("-p", "--plane1"): - opt_plane1 = True - if o in ("-n", "--numeric"): - opt_numeric = True - if o in ("-e", "--gtk-expanded"): - opt_gtkexpanded = True - -if not opt_algorithmic and not opt_gtk and not opt_unicodedatatxt: - opt_statistics = True - -def download_hook(blocks_transferred, block_size, file_size): - """ A download hook to provide some feedback when downloading """ - if blocks_transferred == 0: - if file_size > 0: - if opt_verbose: - print "Downloading", file_size, "bytes: ", - else: - if opt_verbose: - print "Downloading: ", - sys.stdout.write('#') - sys.stdout.flush() - - -def download_file(url): - """ Downloads a file provided a URL. Returns the filename. """ - """ Borks on failure """ - localfilename = url.split('/')[-1] - if not isfile(localfilename) or getsize(localfilename) <= 0: - if opt_verbose: - print "Downloading ", url, "..." - try: - urlretrieve(url, localfilename, download_hook) - except IOError, (errno, strerror): - print "I/O error(%s): %s" % (errno, strerror) - sys.exit(-1) - except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - print " done." - else: - if opt_verbose: - print "Using cached file for ", url - return localfilename - -def process_gdkkeysymsh(): - """ Opens the gdkkeysyms.h file from GTK+/gdk/gdkkeysyms.h """ - """ Fills up keysymdb with contents """ - filename_gdkkeysymsh = download_file(URL_GDKKEYSYMSH) - try: - gdkkeysymsh = open(filename_gdkkeysymsh, 'r') - except IOError, (errno, strerror): - print "I/O error(%s): %s" % (errno, strerror) - sys.exit(-1) - except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - - """ Parse the gdkkeysyms.h file and place contents in keysymdb """ - linenum_gdkkeysymsh = 0 - keysymdb = {} - for line in gdkkeysymsh.readlines(): - linenum_gdkkeysymsh += 1 - line = line.strip() - if line == "" or not match('^#define GDK_KEY_', line): - continue - components = split('\s+', line) - if len(components) < 3: - print "Invalid line %(linenum)d in %(filename)s: %(line)s"\ - % {'linenum': linenum_gdkkeysymsh, 'filename': filename_gdkkeysymsh, 'line': line} - print "Was expecting 3 items in the line" - sys.exit(-1) - if not match('^GDK_KEY_', components[1]): - print "Invalid line %(linenum)d in %(filename)s: %(line)s"\ - % {'linenum': linenum_gdkkeysymsh, 'filename': filename_gdkkeysymsh, 'line': line} - print "Was expecting a keysym starting with GDK_KEY_" - sys.exit(-1) - if match('^0x[0-9a-fA-F]+$', components[2]): - unival = long(components[2][2:], 16) - if unival == 0: - continue - keysymdb[components[1][8:]] = unival - else: - print "Invalid line %(linenum)d in %(filename)s: %(line)s"\ - % {'linenum': linenum_gdkkeysymsh, 'filename': filename_gdkkeysymsh, 'line': line} - print "Was expecting a hexadecimal number at the end of the line" - sys.exit(-1) - gdkkeysymsh.close() - - """ Patch up the keysymdb with some of our own stuff """ - - """ This is for a missing keysym from the currently upstream file """ - ###keysymdb['dead_stroke'] = 0x338 - - """ This is for a missing keysym from the currently upstream file """ - ###keysymdb['dead_belowring'] = 0x323 - ###keysymdb['dead_belowmacron'] = 0x331 - ###keysymdb['dead_belowcircumflex'] = 0x32d - ###keysymdb['dead_belowtilde'] = 0x330 - ###keysymdb['dead_belowbreve'] = 0x32e - ###keysymdb['dead_belowdiaeresis'] = 0x324 - - """ This is^Wwas preferential treatment for Greek """ - # keysymdb['dead_tilde'] = 0x342 - """ This is^was preferential treatment for Greek """ - #keysymdb['combining_tilde'] = 0x342 - - """ Fixing VoidSymbol """ - keysymdb['VoidSymbol'] = 0xFFFF - - return keysymdb - -def process_keysymstxt(): - """ Grabs and opens the keysyms.txt file that Markus Kuhn maintains """ - """ This file keeps a record between keysyms <-> unicode chars """ - filename_keysymstxt = download_file(URL_KEYSYMSTXT) - try: - keysymstxt = open(filename_keysymstxt, 'r') - except IOError, (errno, strerror): - print "I/O error(%s): %s" % (errno, strerror) - sys.exit(-1) - except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - - """ Parse the keysyms.txt file and place content in keysymdb """ - linenum_keysymstxt = 0 - keysymdb = {} - for line in keysymstxt.readlines(): - linenum_keysymstxt += 1 - line = line.strip() - if line == "" or match('^#', line): - continue - components = split('\s+', line) - if len(components) < 5: - print "Invalid line %(linenum)d in %(filename)s: %(line)s'"\ - % {'linenum': linenum_keysymstxt, 'filename': filename_keysymstxt, 'line': line} - print "Was expecting 5 items in the line" - sys.exit(-1) - if match('^U[0-9a-fA-F]+$', components[1]): - unival = long(components[1][1:], 16) - if unival == 0: - continue - keysymdb[components[4]] = unival - keysymstxt.close() - - """ Patch up the keysymdb with some of our own stuff """ - """ This is for a missing keysym from the currently upstream file """ - keysymdb['dead_belowring'] = 0x323 - keysymdb['dead_belowmacron'] = 0x331 - keysymdb['dead_belowcircumflex'] = 0x32d - keysymdb['dead_belowtilde'] = 0x330 - keysymdb['dead_belowbreve'] = 0x32e - keysymdb['dead_belowdiaeresis'] = 0x324 - - """ This is preferential treatment for Greek """ - """ => we get more savings if used for Greek """ - # keysymdb['dead_tilde'] = 0x342 - """ This is preferential treatment for Greek """ - # keysymdb['combining_tilde'] = 0x342 - - """ This is for a missing keysym from Markus Kuhn's db """ - keysymdb['dead_stroke'] = 0x338 - """ This is for a missing keysym from Markus Kuhn's db """ - keysymdb['Oslash'] = 0x0d8 - """ This is for a missing keysym from Markus Kuhn's db """ - keysymdb['Ssharp'] = 0x1e9e - - """ This is for a missing (recently added) keysym """ - keysymdb['dead_psili'] = 0x313 - """ This is for a missing (recently added) keysym """ - keysymdb['dead_dasia'] = 0x314 - - """ Allows to import Multi_key sequences """ - keysymdb['Multi_key'] = 0xff20 - - keysymdb['zerosubscript'] = 0x2080 - keysymdb['onesubscript'] = 0x2081 - keysymdb['twosubscript'] = 0x2082 - keysymdb['threesubscript'] = 0x2083 - keysymdb['foursubscript'] = 0x2084 - keysymdb['fivesubscript'] = 0x2085 - keysymdb['sixsubscript'] = 0x2086 - keysymdb['sevensubscript'] = 0x2087 - keysymdb['eightsubscript'] = 0x2088 - keysymdb['ninesubscript'] = 0x2089 - keysymdb['dead_doublegrave'] = 0x030F - keysymdb['dead_invertedbreve'] = 0x0311 - keysymdb['dead_belowcomma'] = 0xfe6e - keysymdb['dead_currency'] = 0xfe6f - keysymdb['dead_greek'] = 0xfe8c - - return keysymdb - -def keysymvalue(keysym, file = "n/a", linenum = 0): - """ Extracts a value from the keysym """ - """ Find the value of keysym, using the data from keysyms """ - """ Use file and linenum to when reporting errors """ - if keysym == "": - return 0 - if keysymdatabase.has_key(keysym): - return keysymdatabase[keysym] - elif keysym[0] == 'U' and match('[0-9a-fA-F]+$', keysym[1:]): - return atoi(keysym[1:], 16) - elif keysym[:2] == '0x' and match('[0-9a-fA-F]+$', keysym[2:]): - return atoi(keysym[2:], 16) - else: - print 'keysymvalue: UNKNOWN{%(keysym)s}' % { "keysym": keysym } - #return -1 - sys.exit(-1) - -def keysymunicodevalue(keysym, file = "n/a", linenum = 0): - """ Extracts a value from the keysym """ - """ Find the value of keysym, using the data from keysyms """ - """ Use file and linenum to when reporting errors """ - if keysym == "": - return 0 - if keysymunicodedatabase.has_key(keysym): - return keysymunicodedatabase[keysym] - elif keysym[0] == 'U' and match('[0-9a-fA-F]+$', keysym[1:]): - return atoi(keysym[1:], 16) - elif keysym[:2] == '0x' and match('[0-9a-fA-F]+$', keysym[2:]): - return atoi(keysym[2:], 16) - else: - print 'keysymunicodevalue: UNKNOWN{%(keysym)s}' % { "keysym": keysym } - sys.exit(-1) - -def rename_combining(seq): - filtered_sequence = [] - for ks in seq: - if findall('^combining_', ks): - ks = sub('^combining_', 'dead_', ks) - if ks == 'dead_double_grave': - ks = 'dead_doublegrave' - if ks == 'dead_inverted_breve': - ks = 'dead_invertedbreve' - filtered_sequence.append(ks) - return filtered_sequence - - -keysymunicodedatabase = process_keysymstxt() -keysymdatabase = process_gdkkeysymsh() - -""" Grab and open the compose file from upstream """ -filename_compose = download_file(URL_COMPOSE) -try: - composefile = open(filename_compose, 'r') -except IOError, (errno, strerror): - print "I/O error(%s): %s" % (errno, strerror) - sys.exit(-1) -except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - -""" Look if there is a lookaside (supplementary) compose file in the current - directory, and if so, open, then merge with upstream Compose file. -""" -xorg_compose_sequences_raw = [] -for seq in composefile.readlines(): - xorg_compose_sequences_raw.append(seq) - -try: - composefile_lookaside = open(FILENAME_COMPOSE_NEGATIVE_SUPPLEMENTARY, 'r') - for seq in composefile_lookaside.readlines(): - xorg_compose_sequences_raw.remove(seq) -except IOError, (errno, strerror): - if opt_verbose: - print "I/O error(%s): %s" % (errno, strerror) - print "Did not find negative lookaside compose file. Continuing..." -except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - -try: - composefile_lookaside = open(FILENAME_COMPOSE_SUPPLEMENTARY, 'r') - for seq in composefile_lookaside.readlines(): - xorg_compose_sequences_raw.append(seq) -except IOError, (errno, strerror): - if opt_verbose: - print "I/O error(%s): %s" % (errno, strerror) - print "Did not find lookaside compose file. Continuing..." -except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - -""" Parse the compose file in xorg_compose_sequences""" -xorg_compose_sequences = [] -xorg_compose_sequences_algorithmic = [] -linenum_compose = 0 -comment_nest_depth = 0 -for line in xorg_compose_sequences_raw: - linenum_compose += 1 - line = line.strip() - if match("^XCOMM", line) or match("^#", line): - continue - - line = sub(r"\/\*([^\*]*|[\*][^/])\*\/", "", line) - - comment_start = line.find("/*") - - if comment_start >= 0: - if comment_nest_depth == 0: - line = line[:comment_start] - else: - line = "" - - comment_nest_depth += 1 - else: - comment_end = line.find("*/") - - if comment_end >= 0: - comment_nest_depth -= 1 - - if comment_nest_depth < 0: - print "Invalid comment %(linenum_compose)d in %(filename)s: \ - Closing '*/' without opening '/*'" % { "linenum_compose": linenum_compose, "filename": filename_compose } - exit(-1) - - if comment_nest_depth > 0: - line = "" - else: - line = line[comment_end + 2:] - - if line is "": - continue - - #line = line[:-1] - components = split(':', line, 1) - if len(components) != 2: - print "Invalid line %(linenum_compose)d in %(filename)s: No sequence\ - /value pair found" % { "linenum_compose": linenum_compose, "filename": filename_compose } - exit(-1) - (seq, val ) = split(':', line, 1) - seq = seq.strip() - val = val.strip() - raw_sequence = findall('\w+', seq) - values = split('\s+', val) - unichar_temp = split('"', values[0]) - unichar_utf8 = unichar_temp[1] - if len(values) == 1: - continue - codepointstr = values[1] - if values[1] == '#': - # No codepoints that are >1 characters yet. - continue - if raw_sequence[0][0] == 'U' and match('[0-9a-fA-F]+$', raw_sequence[0][1:]): - raw_sequence[0] = '0x' + raw_sequence[0][1:] - if match('^U[0-9a-fA-F]+$', codepointstr): - codepoint = long(codepointstr[1:], 16) - elif keysymunicodedatabase.has_key(codepointstr): - #if keysymdatabase[codepointstr] != keysymunicodedatabase[codepointstr]: - #print "DIFFERENCE: 0x%(a)X 0x%(b)X" % { "a": keysymdatabase[codepointstr], "b": keysymunicodedatabase[codepointstr]}, - #print raw_sequence, codepointstr - codepoint = keysymunicodedatabase[codepointstr] - else: - unichar = unicode(unichar_utf8, 'utf-8') - codepoint = ord(unichar) - sequence = rename_combining(raw_sequence) - reject_this = False - for i in sequence: - if keysymvalue(i) > 0xFFFF: - reject_this = True - if opt_plane1: - print sequence - break - if keysymvalue(i) < 0: - reject_this = True - break - if reject_this: - continue - if "U0342" in sequence or \ - "U0313" in sequence or \ - "U0314" in sequence or \ - "0x0313" in sequence or \ - "0x0342" in sequence or \ - "0x0314" in sequence: - continue - if codepoint > 0xFFFF: - if opt_verbose: - print "Ignore the line greater than guint16:\n%s" % line - continue - #for i in range(len(sequence)): - # if sequence[i] == "0x0342": - # sequence[i] = "dead_tilde" - if "Multi_key" not in sequence: - """ Ignore for now >0xFFFF keysyms """ - if codepoint < 0xFFFF: - original_sequence = copy(sequence) - stats_sequence = copy(sequence) - base = sequence.pop() - basechar = keysymvalue(base, filename_compose, linenum_compose) - - if basechar < 0xFFFF: - counter = 1 - unisequence = [] - not_normalised = True - skipping_this = False - for i in range(0, len(sequence)): - """ If the sequence has dead_tilde and is for Greek, we don't do algorithmically - because of lack of dead_perispomeni (i.e. conflict) - """ - bc = basechar - """if sequence[-1] == "dead_tilde" and (bc >= 0x370 and bc <= 0x3ff) or (bc >= 0x1f00 and bc <= 0x1fff): - skipping_this = True - break - if sequence[-1] == "dead_horn" and (bc >= 0x370 and bc <= 0x3ff) or (bc >= 0x1f00 and bc <= 0x1fff): - skipping_this = True - break - if sequence[-1] == "dead_ogonek" and (bc >= 0x370 and bc <= 0x3ff) or (bc >= 0x1f00 and bc <= 0x1fff): - skipping_this = True - break - if sequence[-1] == "dead_psili": - sequence[i] = "dead_horn" - if sequence[-1] == "dead_dasia": - sequence[-1] = "dead_ogonek" - """ - unisequence.append(unichr(keysymunicodevalue(sequence.pop(), filename_compose, linenum_compose))) - - if skipping_this: - unisequence = [] - for perm in all_permutations(unisequence): - # print counter, original_sequence, unichr(basechar) + "".join(perm) - # print counter, map(unichr, perm) - normalized = normalize('NFC', unichr(basechar) + "".join(perm)) - if len(normalized) == 1: - # print 'Base: %(base)s [%(basechar)s], produces [%(unichar)s] (0x%(codepoint)04X)' \ - # % { "base": base, "basechar": unichr(basechar), "unichar": unichar, "codepoint": codepoint }, - # print "Normalized: [%(normalized)s] SUCCESS %(c)d" % { "normalized": normalized, "c": counter } - stats_sequence_data = map(keysymunicodevalue, stats_sequence) - stats_sequence_data.append(normalized) - xorg_compose_sequences_algorithmic.append(stats_sequence_data) - not_normalised = False - break; - counter += 1 - if not_normalised: - original_sequence.append(codepoint) - xorg_compose_sequences.append(original_sequence) - """ print xorg_compose_sequences[-1] """ - - else: - print "Error in base char !?!" - exit(-2) - else: - print "OVER", sequence - exit(-1) - else: - sequence.append(codepoint) - xorg_compose_sequences.append(sequence) - """ print xorg_compose_sequences[-1] """ - -def sequence_cmp(x, y): - if keysymvalue(x[0]) > keysymvalue(y[0]): - return 1 - elif keysymvalue(x[0]) < keysymvalue(y[0]): - return -1 - elif len(x) > len(y): - return 1 - elif len(x) < len(y): - return -1 - elif keysymvalue(x[1]) > keysymvalue(y[1]): - return 1 - elif keysymvalue(x[1]) < keysymvalue(y[1]): - return -1 - elif len(x) < 4: - return 0 - elif keysymvalue(x[2]) > keysymvalue(y[2]): - return 1 - elif keysymvalue(x[2]) < keysymvalue(y[2]): - return -1 - elif len(x) < 5: - return 0 - elif keysymvalue(x[3]) > keysymvalue(y[3]): - return 1 - elif keysymvalue(x[3]) < keysymvalue(y[3]): - return -1 - elif len(x) < 6: - return 0 - elif keysymvalue(x[4]) > keysymvalue(y[4]): - return 1 - elif keysymvalue(x[4]) < keysymvalue(y[4]): - return -1 - else: - return 0 - -def sequence_unicode_cmp(x, y): - if keysymunicodevalue(x[0]) > keysymunicodevalue(y[0]): - return 1 - elif keysymunicodevalue(x[0]) < keysymunicodevalue(y[0]): - return -1 - elif len(x) > len(y): - return 1 - elif len(x) < len(y): - return -1 - elif keysymunicodevalue(x[1]) > keysymunicodevalue(y[1]): - return 1 - elif keysymunicodevalue(x[1]) < keysymunicodevalue(y[1]): - return -1 - elif len(x) < 4: - return 0 - elif keysymunicodevalue(x[2]) > keysymunicodevalue(y[2]): - return 1 - elif keysymunicodevalue(x[2]) < keysymunicodevalue(y[2]): - return -1 - elif len(x) < 5: - return 0 - elif keysymunicodevalue(x[3]) > keysymunicodevalue(y[3]): - return 1 - elif keysymunicodevalue(x[3]) < keysymunicodevalue(y[3]): - return -1 - elif len(x) < 6: - return 0 - elif keysymunicodevalue(x[4]) > keysymunicodevalue(y[4]): - return 1 - elif keysymunicodevalue(x[4]) < keysymunicodevalue(y[4]): - return -1 - else: - return 0 - -def sequence_algorithmic_cmp(x, y): - if len(x) < len(y): - return -1 - elif len(x) > len(y): - return 1 - else: - for i in range(len(x)): - if x[i] < y[i]: - return -1 - elif x[i] > y[i]: - return 1 - return 0 - - -xorg_compose_sequences.sort(sequence_cmp) - -xorg_compose_sequences_uniqued = [] -first_time = True -item = None -for next_item in xorg_compose_sequences: - if first_time: - first_time = False - item = next_item - if sequence_unicode_cmp(item, next_item) != 0: - xorg_compose_sequences_uniqued.append(item) - item = next_item - -xorg_compose_sequences = copy(xorg_compose_sequences_uniqued) - -counter_multikey = 0 -for item in xorg_compose_sequences: - if findall('Multi_key', "".join(item[:-1])) != []: - counter_multikey += 1 - -xorg_compose_sequences_algorithmic.sort(sequence_algorithmic_cmp) -xorg_compose_sequences_algorithmic_uniqued = uniq(xorg_compose_sequences_algorithmic) - -firstitem = "" -num_first_keysyms = 0 -zeroes = 0 -num_entries = 0 -num_algorithmic_greek = 0 -for sequence in xorg_compose_sequences: - if keysymvalue(firstitem) != keysymvalue(sequence[0]): - firstitem = sequence[0] - num_first_keysyms += 1 - zeroes += 6 - len(sequence) + 1 - num_entries += 1 - -for sequence in xorg_compose_sequences_algorithmic_uniqued: - ch = ord(sequence[-1:][0]) - if ch >= 0x370 and ch <= 0x3ff or ch >= 0x1f00 and ch <= 0x1fff: - num_algorithmic_greek += 1 - - -if opt_algorithmic: - for sequence in xorg_compose_sequences_algorithmic_uniqued: - letter = "".join(sequence[-1:]) - print '0x%(cp)04X, %(uni)s, seq: [ <0x%(base)04X>,' % { 'cp': ord(unicode(letter)), 'uni': letter.encode('utf-8'), 'base': sequence[-2] }, - for elem in sequence[:-2]: - print "<0x%(keysym)04X>," % { 'keysym': elem }, - """ Yeah, verified... We just want to keep the output similar to -u, so we can compare/sort easily """ - print "], recomposed as", letter.encode('utf-8'), "verified" - -def num_of_keysyms(seq): - return len(seq) - 1 - -def convert_UnotationToHex(arg): - if isinstance(arg, str): - if match('^U[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$', arg): - return sub('^U', '0x', arg) - return arg - -def addprefix_GDK(arg): - if match('^0x', arg): - return '%(arg)s, ' % { 'arg': arg } - elif match('^U[0-9A-F][0-9A-F][0-9A-F][0-9A-F]$', arg.upper()): - keysym = '' - for k, c in keysymunicodedatabase.items(): - if c == keysymvalue(arg): - keysym = k - break - if keysym != '': - return 'GDK_KEY_%(arg)s, ' % { 'arg': keysym } - else: - return '0x%(arg)04X, ' % { 'arg': keysymvalue(arg) } - else: - return 'GDK_KEY_%(arg)s, ' % { 'arg': arg } - -if opt_gtk: - first_keysym = "" - sequence = [] - compose_table = [] - ct_second_part = [] - ct_sequence_width = 2 - start_offset = num_first_keysyms * (WIDTHOFCOMPOSETABLE+1) - we_finished = False - counter = 0 - - sequence_iterator = iter(xorg_compose_sequences) - sequence = sequence_iterator.next() - while True: - first_keysym = sequence[0] # Set the first keysym - compose_table.append([first_keysym, 0, 0, 0, 0, 0]) - while sequence[0] == first_keysym: - compose_table[counter][num_of_keysyms(sequence)-1] += 1 - try: - sequence = sequence_iterator.next() - except StopIteration: - we_finished = True - break - if we_finished: - break - counter += 1 - - ct_index = start_offset - for line_num in range(len(compose_table)): - for i in range(WIDTHOFCOMPOSETABLE): - occurrences = compose_table[line_num][i+1] - compose_table[line_num][i+1] = ct_index - ct_index += occurrences * (i+2) - - for sequence in xorg_compose_sequences: - ct_second_part.append(map(convert_UnotationToHex, sequence)) - - print headerfile_start - for i in compose_table: - if opt_gtkexpanded: - print "0x%(ks)04X," % { "ks": keysymvalue(i[0]) }, - print '%(str)s' % { 'str': "".join(map(lambda x : str(x) + ", ", i[1:])) } - elif not match('^0x', i[0]): - print 'GDK_KEY_%(str)s' % { 'str': "".join(map(lambda x : str(x) + ", ", i)) } - else: - print '%(str)s' % { 'str': "".join(map(lambda x : str(x) + ", ", i)) } - for i in ct_second_part: - if opt_numeric: - for ks in i[1:][:-1]: - print '0x%(seq)04X, ' % { 'seq': keysymvalue(ks) }, - print '0x%(cp)04X, ' % { 'cp':i[-1] } - """ - for ks in i[:-1]: - print '0x%(seq)04X, ' % { 'seq': keysymvalue(ks) }, - print '0x%(cp)04X, ' % { 'cp':i[-1] } - """ - elif opt_gtkexpanded: - print '%(seq)s0x%(cp)04X, ' % { 'seq': "".join(map(addprefix_GDK, i[:-1])), 'cp':i[-1] } - else: - print '%(seq)s0x%(cp)04X, ' % { 'seq': "".join(map(addprefix_GDK, i[:-1][1:])), 'cp':i[-1] } - print headerfile_end - -def redecompose(codepoint): - (name, decomposition, combiningclass) = unicodedatabase[codepoint] - if decomposition[0] == '' or decomposition[0] == '0': - return [codepoint] - if match('<\w+>', decomposition[0]): - numdecomposition = map(stringtohex, decomposition[1:]) - return map(redecompose, numdecomposition) - numdecomposition = map(stringtohex, decomposition) - return map(redecompose, numdecomposition) - -def process_unicodedata_file(verbose = False): - """ Grab from wget http://www.unicode.org/Public/UNIDATA/UnicodeData.txt """ - filename_unicodedatatxt = download_file(URL_UNICODEDATATXT) - try: - unicodedatatxt = open(filename_unicodedatatxt, 'r') - except IOError, (errno, strerror): - print "I/O error(%s): %s" % (errno, strerror) - sys.exit(-1) - except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - for line in unicodedatatxt.readlines(): - if line[0] == "" or line[0] == '#': - continue - line = line[:-1] - uniproperties = split(';', line) - codepoint = stringtohex(uniproperties[0]) - """ We don't do Plane 1 or CJK blocks. The latter require reading additional files. """ - if codepoint > 0xFFFF or (codepoint >= 0x4E00 and codepoint <= 0x9FFF) or (codepoint >= 0xF900 and codepoint <= 0xFAFF): - continue - name = uniproperties[1] - category = uniproperties[2] - combiningclass = uniproperties[3] - decomposition = uniproperties[5] - unicodedatabase[codepoint] = [name, split('\s+', decomposition), combiningclass] - - counter_combinations = 0 - counter_combinations_greek = 0 - counter_entries = 0 - counter_entries_greek = 0 - - for item in unicodedatabase.keys(): - (name, decomposition, combiningclass) = unicodedatabase[item] - if decomposition[0] == '': - continue - print name, "is empty" - elif match('<\w+>', decomposition[0]): - continue - print name, "has weird", decomposition[0] - else: - sequence = map(stringtohex, decomposition) - chrsequence = map(unichr, sequence) - normalized = normalize('NFC', "".join(chrsequence)) - - """ print name, sequence, "Combining: ", "".join(chrsequence), normalized, len(normalized), """ - decomposedsequence = [] - for subseq in map(redecompose, sequence): - for seqitem in subseq: - if isinstance(seqitem, list): - for i in seqitem: - if isinstance(i, list): - for j in i: - decomposedsequence.append(j) - else: - decomposedsequence.append(i) - else: - decomposedsequence.append(seqitem) - recomposedchar = normalize('NFC', "".join(map(unichr, decomposedsequence))) - if len(recomposedchar) == 1 and len(decomposedsequence) > 1: - counter_entries += 1 - counter_combinations += factorial(len(decomposedsequence)-1) - ch = item - if ch >= 0x370 and ch <= 0x3ff or ch >= 0x1f00 and ch <= 0x1fff: - counter_entries_greek += 1 - counter_combinations_greek += factorial(len(decomposedsequence)-1) - if verbose: - print "0x%(cp)04X, %(uni)c, seq:" % { 'cp':item, 'uni':unichr(item) }, - print "[", - for elem in decomposedsequence: - print '<0x%(hex)04X>,' % { 'hex': elem }, - print "], recomposed as", recomposedchar, - if unichr(item) == recomposedchar: - print "verified" - - if verbose == False: - print "Unicode statistics from UnicodeData.txt" - print "Number of entries that can be algorithmically produced :", counter_entries - print " of which are for Greek :", counter_entries_greek - print "Number of compose sequence combinations requiring :", counter_combinations - print " of which are for Greek :", counter_combinations_greek - print "Note: We do not include partial compositions, " - print "thus the slight discrepancy in the figures" - print - -if opt_unicodedatatxt: - process_unicodedata_file(True) - -if opt_statistics: - print - print "Total number of compose sequences (from file) :", len(xorg_compose_sequences) + len(xorg_compose_sequences_algorithmic) - print " of which can be expressed algorithmically :", len(xorg_compose_sequences_algorithmic) - print " of which cannot be expressed algorithmically :", len(xorg_compose_sequences) - print " of which have Multi_key :", counter_multikey - print - print "Algorithmic (stats for Xorg Compose file)" - print "Number of sequences off due to algo from file (len(array)) :", len(xorg_compose_sequences_algorithmic) - print "Number of sequences off due to algo (uniq(sort(array))) :", len(xorg_compose_sequences_algorithmic_uniqued) - print " of which are for Greek :", num_algorithmic_greek - print - process_unicodedata_file() - print "Not algorithmic (stats from Xorg Compose file)" - print "Number of sequences :", len(xorg_compose_sequences) - print "Flat array looks like :", len(xorg_compose_sequences), "rows of 6 integers (2 bytes per int, or 12 bytes per row)" - print "Flat array would have taken up (in bytes) :", num_entries * 2 * 6, "bytes from the GTK+ library" - print "Number of items in flat array :", len(xorg_compose_sequences) * 6 - print " of which are zeroes :", zeroes, "or ", (100 * zeroes) / (len(xorg_compose_sequences) * 6), " per cent" - print "Number of different first items :", num_first_keysyms - print "Number of max bytes (if using flat array) :", num_entries * 2 * 6 - print "Number of savings :", zeroes * 2 - num_first_keysyms * 2 * 5 - print - print "Memory needs if both algorithmic+optimised table in latest Xorg compose file" - print " :", num_entries * 2 * 6 - zeroes * 2 + num_first_keysyms * 2 * 5 - print - print "Existing (old) implementation in GTK+" - print "Number of sequences in old gtkimcontextsimple.c :", 691 - print "The existing (old) implementation in GTK+ takes up :", 691 * 2 * 12, "bytes" diff --git a/gtk/compose/gtk-compose-lookaside.txt b/gtk/compose/gtk-compose-lookaside.txt deleted file mode 100644 index 3f3b23c69c..0000000000 --- a/gtk/compose/gtk-compose-lookaside.txt +++ /dev/null @@ -1,405 +0,0 @@ -# -# This file contains the compose sequences that GTK+ used to have until GTK+ 2.12 -# but are not found anymore at the upstream Compose file at X.Org. -# When updating gtkimcontextsimpleseqs.h with compose-parse.py, -# we include this file as well. There are 15 conflicts currently -# in the compose sequences, and we currently favour the sequences from -# this file (against the upstream X.Org file). For more, see -# http://bugzilla.gnome.org/show_bug.cgi?id=557420 -# - - : "ἴ" U0390 - : "ΐ" U03B0 - : "Ḃ" U1E02 - : "ḃ" U1E03 - : "Ḋ" U1E0A - : "ḋ" U1E0B - : "Ḟ" U1E1E - : "ḟ" U1E1F - : "Ṁ" U1E40 - : "Ṡ" U1E60 -

: "Ṗ" U1E56 -

: "¶" U00B6 -

: "¶" U00B6 - : "·" U00B7 - : "·" U00B7 - : "¸" U00B8 - <1> : "¹" U00B9 - <1> : "¹" U00B9 - <1> : "¹" U00B9 - <1> : "¹" U00B9 - <1> : "¹" U00B9 - : "º" U00BA - : "º" U00BA - : "À" U00C0 - : "Á" U00C1 - : "Á" U00C1 - : "Â" U00C2 - : "Â" U00C2 - : "Â" U00C2 - : "Ã" U00C3 - : "Ã" U00C3 - : "Ã" U00C3 - : "Ä" U00C4 - : "Ä" U00C4 - : "Ä" U00C4 - : "Å" U00C5 - : "Å" U00C5 - : "Å" U00C5 - : "ˇ" U02C7 - : "ˇ" U02C7 - : "È" U00C8 - : "É" U00C9 - : "É" U00C9 - : "Ê" U00CA - : "Ê" U00CA - : "Ê" U00CA - : "Ë" U00CB - : "Ë" U00CB - : "Ë" U00CB - : "Ì" U00CC - : "Í" U00CD - : "Í" U00CD - : "Î" U00CE - : "Î" U00CE - : "Î" U00CE - : "Ï" U00CF - : "Ï" U00CF - : "Ï" U00CF - : "Ñ" U00D1 - : "Ñ" U00D1 - : "Ñ" U00D1 - : "Ò" U00D2 - : "Ó" U00D3 - : "Ó" U00D3 - : "Ô" U00D4 - : "Ô" U00D4 - : "Ô" U00D4 - : "Õ" U00D5 - : "Õ" U00D5 - : "Õ" U00D5 - : "Ö" U00D6 - : "Ö" U00D6 - : "Ö" U00D6 - : "˘" U02D8 - : "˘" U02D8 - : "Ù" U00D9 - : "Ú" U00DA - : "Ú" U00DA - : "Û" U00DB - : "Û" U00DB - : "Û" U00DB - : "Ü" U00DC - : "Ü" U00DC - : "Ü" U00DC - : "Ý" U00DD - : "Ý" U00DD - : "à" U00E0 - : "á" U00E1 - : "á" U00E1 - : "â" U00E2 - : "â" U00E2 - : "â" U00E2 - : "ā" U0101 - : "ā" U0101 - : "ã" U00E3 - : "ä" U00E4 - : "ä" U00E4 - : "ä" U00E4 - : "å" U00E5 - : "å" U00E5 - : "å" U00E5 - : "ç" U00E7 - : "è" U00E8 - : "é" U00E9 - : "é" U00E9 - : "ê" U00EA - : "ê" U00EA - : "ê" U00EA - : "ë" U00EB - : "ë" U00EB - : "ë" U00EB - : "ì" U00EC - : "í" U00ED - : "í" U00ED - : "î" U00EE - : "î" U00EE - : "î" U00EE - : "ï" U00EF - : "ï" U00EF - : "ï" U00EF - : "ñ" U00F1 - : "ñ" U00F1 - : "ñ" U00F1 - : "ò" U00F2 - : "ó" U00F3 - : "ó" U00F3 - : "ô" U00F4 - : "ô" U00F4 - : "ô" U00F4 - : "ō" U014D - : "ō" U014D - : "õ" U00F5 - : "ö" U00F6 - : "ö" U00F6 - : "ö" U00F6 - : "ø" U00F8 - : "ù" U00F9 - : "ú" U00FA - : "ú" U00FA - : "û" U00FB - : "û" U00FB - : "û" U00FB - : "ü" U00FC - : "ü" U00FC - : "ü" U00FC - : "ý" U00FD - : "ý" U00FD - : "ÿ" U00FF - : "ÿ" U00FF - : "ÿ" U00FF - : "Ă" U0102 - : "Ă" U0102 - : "ă" U0103 - : "ă" U0103 - : "Ą" U0104 - : "Ą" U0104 - : "ą" U0105 - : "ą" U0105 - : "Ć" U0106 - : "ć" U0107 - : "Ċ" U010A - : "ċ" U010B - : "Č" U010C - : "Č" U010C - : "č" U010D - : "č" U010D - : "Ď" U010E - : "Ď" U010E - : "ď" U010F - : "ď" U010F - : "Đ" U0110 - : "Đ" U0110 - : "đ" U0111 - : "Ē" U0112 - : "Ē" U0112 - : "Ē" U0112 - : "ē" U0113 - : "ē" U0113 - : "ē" U0113 - : "Ė" U0116 - : "Ę" U0118 - : "ę" U0119 - : "Ě" U011A - : "Ě" U011A - : "ě" U011B - : "ě" U011B - : "Ğ" U011E - : "Ğ" U011E - : "Ğ" U011E - : "Ğ" U011E - : "Ğ" U011E - : "ğ" U011F - : "ğ" U011F - : "ğ" U011F - : "ğ" U011F - : "ğ" U011F - : "Ġ" U0120 - : "ġ" U0121 - : "Ģ" U0122 - : "ģ" U0123 - : "Ĩ" U0128 - : "ĩ" U0129 - : "Ī" U012A - : "Ī" U012A - : "Ī" U012A - : "ī" U012B - : "ī" U012B - : "ī" U012B - : "Į" U012E - : "Į" U012E - : "İ" U0130 - : "ı" U0131 - : "Ķ" U0136 - : "ķ" U0137 - : "Ĺ" U0139 - : "ĺ" U013A - : "Ļ" U013B - : "ļ" U013C - : "Ľ" U013D - : "Ľ" U013D - : "ľ" U013E - : "ľ" U013E - : "Ł" U0141 - : "ł" U0142 - : "Ń" U0143 - : "ń" U0144 - : "Ņ" U0145 - : "ņ" U0146 - : "Ň" U0147 - : "Ň" U0147 - : "ň" U0148 - : "ň" U0148 - : "Ŕ" U0154 - : "ŕ" U0155 - : "Ŗ" U0156 - : "ŗ" U0157 - : "Ř" U0158 - : "Ř" U0158 - : "ř" U0159 - : "ř" U0159 - : "Ś" U015A - : "ś" U015B - : "Ø" U00D8 - : "Ş" U015E - : "Ş" U015E - : "ş" U015F - : "ş" U015F - : "Š" U0160 - : "Š" U0160 - : "š" U0161 - : "š" U0161 - : "Ť" U0164 - : "Ť" U0164 - : "ť" U0165 - : "ť" U0165 - : "Ŧ" U0166 - : "Ŧ" U0166 - : "ŧ" U0167 - : "ŧ" U0167 - : "Ũ" U0168 - : "ũ" U0169 - : "Ū" U016A - : "Ū" U016A - : "Ū" U016A - : "ū" U016B - : "ū" U016B - : "ū" U016B - : "Ů" U016E - : "Ů" U016E - : "ů" U016F - : "ů" U016F - : "Ų" U0172 - : "Ų" U0172 - : "ų" U0173 - : "ų" U0173 - : "Ŵ" U0174 - : "ŵ" U0175 - : "Ŷ" U0176 - : "ŷ" U0177 - : "Ÿ" U0178 - : "Ÿ" U0178 - : "Ÿ" U0178 - : "Ź" U0179 - : "ź" U017A - : "Ż" U017B - : "ż" U017C - : "Ž" U017D - : "Ž" U017D - : "Ž" U017D - : "ž" U017E - : "ž" U017E - : "ž" U017E - : "΅" U0385 - : "΅" U0385 - : "΅" U0385 - : "΅" U0385 - : "Ά" U0386 - : "ṁ" U1E41 - : "Έ" U0388 - : "Ή" U0389 - : "Ί" U038A - : "Ό" U038C - : "Ύ" U038E - : "Ώ" U038F - : "ΐ" U0390 - : "ΐ" U0390 - : "į" U012F - : "į" U012F - : "Ϊ" U03AA - : "Ϋ" U03AB - : "ά" U03AC - : "έ" U03AD - : "ή" U03AE - : "ί" U03AF - : "ΰ" U03B0 - : "ΰ" U03B0 - : "ϊ" U03CA - : "ϋ" U03CB - : "ό" U03CC - : "ύ" U03CD - : "ώ" U03CE diff --git a/gtk/compose/gtkcomposedata.h b/gtk/compose/gtkcomposedata.h new file mode 100644 index 0000000000..057347a36b --- /dev/null +++ b/gtk/compose/gtkcomposedata.h @@ -0,0 +1,9 @@ +#ifndef __GTK_COMPOSE_DATA__ +#define __GTK_COMPOSE_DATA__ + +#define MAX_SEQ_LEN 5 +#define N_INDEX_SIZE 30 +#define DATA_SIZE 16521 +#define N_CHARS 1572 + +#endif diff --git a/gtk/compose/meson.build b/gtk/compose/meson.build new file mode 100644 index 0000000000..90998faf90 --- /dev/null +++ b/gtk/compose/meson.build @@ -0,0 +1,7 @@ +compose_parse = executable('compose-parse', + sources: 'compose-parse.c', + c_args: gtk_cargs + common_cflags, + include_directories: [confinc, gtkinc], + dependencies: libgtk_static_dep, + install: false, +) diff --git a/gtk/compose/sequences b/gtk/compose/sequences new file mode 100644 index 0000000000..1db7a6cddb Binary files /dev/null and b/gtk/compose/sequences differ diff --git a/gtk/gen-gtk-gresources-xml.py b/gtk/gen-gtk-gresources-xml.py index ad602d53bb..8a8da4254e 100644 --- a/gtk/gen-gtk-gresources-xml.py +++ b/gtk/gen-gtk-gresources-xml.py @@ -84,6 +84,8 @@ for f in get_files('inspector', '.ui'): xml += ''' inspector/inspector.css emoji/en.data + compose/sequences + compose/chars ''' diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 2a012efa29..eb1ceeeca1 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -28,9 +28,9 @@ #define GTK_COMPOSE_TABLE_MAGIC "GtkComposeTable" -#define GTK_COMPOSE_TABLE_VERSION (2) +#define GTK_COMPOSE_TABLE_VERSION (3) -extern const GtkComposeTableCompact gtk_compose_table_compact; +extern const GtkComposeTable builtin_compose_table; /* Maximum length of sequences we parse */ @@ -327,35 +327,26 @@ handle_substitutions (const char *start, } static void -parser_add_default_sequences (GtkComposeParser *parser) +add_sequence (gunichar *sequence, + int len, + const char *value, + gpointer data) { - const GtkComposeTableCompact *table = >k_compose_table_compact; + GtkComposeParser *parser = data; + gunichar *seq; - for (int idx = 0; idx < table->n_index_size; idx++) - { - const guint16 *seq_index = table->data + (idx * table->n_index_stride); + seq = g_new (gunichar, len + 1); + memcpy (seq, sequence, (len + 1) * sizeof (gunichar)); - for (int i = 1; i < table->max_seq_len; i++) - { - int row_stride = i + 1; - - for (int j = seq_index[i]; j < seq_index[i + 1]; j += row_stride) - { - char buf[8] = { 0, }; - gunichar *sequence; - - sequence = g_new0 (gunichar, row_stride + 2); - sequence[0] = seq_index[0]; - for (int k = 0; k < i; k++) - sequence[1 + k] = table->data[j + k]; - sequence[1 + i] = 0; + g_hash_table_replace (parser->sequences, seq, g_strdup (value)); +} - g_unichar_to_utf8 (table->data[j + i], buf); +static void +parser_add_default_sequences (GtkComposeParser *parser) +{ + const GtkComposeTable *table = &builtin_compose_table; - g_hash_table_replace (parser->sequences, sequence, g_strdup (buf)); - } - } - } + gtk_compose_table_foreach (table, add_sequence, parser); } static void @@ -547,29 +538,54 @@ next: } } -static int -parser_compute_max_compose_len (GtkComposeParser *parser) +static void +parser_compute_max_compose_len (GtkComposeParser *parser, + int *max_compose_len, + int *n_first, + int *size) { GHashTableIter iter; - int max_compose_len = 0; gunichar *sequence; char *value; + int max = 0; + int count = 0; + GHashTable *first; + + first = g_hash_table_new (NULL, NULL); g_hash_table_iter_init (&iter, parser->sequences); while (g_hash_table_iter_next (&iter, (gpointer *)&sequence, (gpointer *)&value)) { + g_hash_table_add (first, GUINT_TO_POINTER (sequence[0])); + for (int i = 0; i < MAX_COMPOSE_LEN + 1; i++) { if (sequence[i] == 0) { - if (max_compose_len < i) - max_compose_len = i; + count += i; + if (max < i) + max = i; break; } } } - return max_compose_len; + *max_compose_len = max; + *n_first = g_hash_table_size (first); + *size = count; + + g_hash_table_unref (first); +} + +static inline int +sequence_length (gpointer a) +{ + gunichar *seq = a; + int i; + + for (i = 0; seq[i]; i++) ; + + return i; } static int @@ -579,12 +595,26 @@ sequence_compare (gpointer a, { gunichar *seq_a = a; gunichar *seq_b = b; - int max_compose_len = GPOINTER_TO_INT (data); int i; - for (i = 0; i < max_compose_len; i++) + gunichar code_a, code_b; + int len_a, len_b; + + code_a = seq_a[0]; + code_b = seq_b[0]; + + if (code_a != code_b) + return code_a - code_b; + + len_a = sequence_length (a); + len_b = sequence_length (b); + + if (len_a != len_b) + return len_a - len_b; + + for (i = 1; i < len_a; i++) { - gunichar code_a = seq_a[i]; - gunichar code_b = seq_b[i]; + code_a = seq_a[i]; + code_b = seq_b[i]; if (code_a != code_b) return code_a - code_b; @@ -640,29 +670,29 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table, gsize *count) { char *p, *contents; - gsize length, total_length; + gsize header_length, total_length; guint16 bytes; const char *header = GTK_COMPOSE_TABLE_MAGIC; const guint16 version = GTK_COMPOSE_TABLE_VERSION; guint16 max_seq_len = compose_table->max_seq_len; - guint16 index_stride = max_seq_len + 2; - guint16 n_seqs = compose_table->n_seqs; + guint16 n_index_size = compose_table->n_index_size; + guint16 data_size = compose_table->data_size; guint16 n_chars = compose_table->n_chars; guint32 i; g_return_val_if_fail (compose_table != NULL, NULL); g_return_val_if_fail (max_seq_len > 0, NULL); - g_return_val_if_fail (index_stride > 0, NULL); + g_return_val_if_fail (n_index_size > 0, NULL); - length = strlen (header); - total_length = length + sizeof (guint16) * (4 + index_stride * n_seqs) + n_chars; + header_length = strlen (header); + total_length = header_length + sizeof (guint16) * (5 + data_size) + n_chars; if (count) *count = total_length; p = contents = g_malloc (total_length); - memcpy (p, header, length); - p += length; + memcpy (p, header, header_length); + p += header_length; #define APPEND_GUINT16(elt) \ bytes = GUINT16_TO_BE (elt); \ @@ -671,10 +701,11 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table, APPEND_GUINT16 (version); APPEND_GUINT16 (max_seq_len); - APPEND_GUINT16 (n_seqs); + APPEND_GUINT16 (n_index_size); + APPEND_GUINT16 (data_size); APPEND_GUINT16 (n_chars); - for (i = 0; i < (guint32) index_stride * n_seqs; i++) + for (i = 0; i < data_size; i++) { APPEND_GUINT16 (compose_table->data[i]); } @@ -701,13 +732,13 @@ gtk_compose_table_load_cache (const char *compose_file) guint16 bytes; guint16 version; guint16 max_seq_len; - guint16 index_stride; - guint16 n_seqs; + guint16 n_index_size; + guint16 data_size; guint16 n_chars; guint32 i; - guint16 *gtk_compose_seqs = NULL; - GtkComposeTable *retval; + guint16 *data = NULL; char *char_data = NULL; + GtkComposeTable *retval; hash = g_str_hash (compose_file); if ((path = gtk_compose_hash_get_cache_path (hash)) == NULL) @@ -755,21 +786,21 @@ gtk_compose_table_load_cache (const char *compose_file) } GET_GUINT16 (max_seq_len); - GET_GUINT16 (n_seqs); + GET_GUINT16 (n_index_size); + GET_GUINT16 (data_size); GET_GUINT16 (n_chars); - if (max_seq_len == 0 || n_seqs == 0) + if (max_seq_len == 0 || data_size == 0) { - g_warning ("cache size is not correct %d %d", max_seq_len, n_seqs); + g_warning ("cache size is not correct %d %d", max_seq_len, data_size); goto out_load_cache; } - index_stride = max_seq_len + 2; - gtk_compose_seqs = g_new0 (guint16, n_seqs * index_stride); + data = g_new0 (guint16, data_size); - for (i = 0; i < (guint32) index_stride * n_seqs; i++) + for (i = 0; i < data_size; i++) { - GET_GUINT16 (gtk_compose_seqs[i]); + GET_GUINT16 (data[i]); } if (n_chars > 0) @@ -780,9 +811,10 @@ gtk_compose_table_load_cache (const char *compose_file) } retval = g_new0 (GtkComposeTable, 1); - retval->data = gtk_compose_seqs; + retval->data = data; retval->max_seq_len = max_seq_len; - retval->n_seqs = n_seqs; + retval->n_index_size = n_index_size; + retval->data_size = data_size; retval->char_data = char_data; retval->n_chars = n_chars; retval->id = hash; @@ -795,7 +827,7 @@ gtk_compose_table_load_cache (const char *compose_file) #undef GET_GUINT16 out_load_cache: - g_free (gtk_compose_seqs); + g_free (data); g_free (char_data); g_free (contents); g_free (path); @@ -834,94 +866,147 @@ out_save_cache: static GtkComposeTable * parser_get_compose_table (GtkComposeParser *parser) { - guint length; - guint n = 0; - int i, j; - guint16 *gtk_compose_seqs = NULL; - GList *list; - GtkComposeTable *retval = NULL; - gunichar codepoint; + guint16 *data; + GtkComposeTable *table; + guint16 encoded_value; GString *char_data; - int max_compose_len = 0; + int max_compose_len; GList *sequences; - guint32 hash; + GList *list; + int i; + int size; + int n_first; + int first_pos; + int rest_pos; + int index_rowstride; + gunichar current_first; parser_remove_duplicates (parser); if (g_hash_table_size (parser->sequences) == 0) return NULL; - hash = g_str_hash (parser->compose_file); - - max_compose_len = parser_compute_max_compose_len (parser); + parser_compute_max_compose_len (parser, &max_compose_len, &n_first, &size); sequences = g_hash_table_get_keys (parser->sequences); sequences = g_list_sort_with_data (sequences, (GCompareDataFunc) sequence_compare, - GINT_TO_POINTER (max_compose_len)); - - length = g_list_length (sequences); + NULL); - gtk_compose_seqs = g_new0 (guint16, length * (max_compose_len + 2)); + index_rowstride = max_compose_len + 1; + data = g_new0 (guint16, n_first * index_rowstride + size); char_data = g_string_new (""); + current_first = 0; + first_pos = 0; + rest_pos = n_first * index_rowstride; + for (list = sequences; list != NULL; list = list->next) { gunichar *sequence = list->data; char *value = g_hash_table_lookup (parser->sequences, sequence); + int len = sequence_length (sequence); - for (i = 0; i < max_compose_len; i++) + g_assert (2 <= len && len <= max_compose_len); + + /* Encode the value. If the value is a single + * character with a value smaller than 1 << 15, + * we just use it directly. + * Otherwise, we store the value as string and + * put the offset into the table, with the high + * bit set. + */ + if (g_utf8_strlen (value, -1) == 1 && + g_utf8_get_char (value) < 0x8000) { - if (sequence[i] == 0) - { - for (j = i; j < max_compose_len; j++) - gtk_compose_seqs[n++] = 0; - break; - } - gtk_compose_seqs[n++] = (guint16) sequence[i]; + encoded_value = (guint16) g_utf8_get_char (value); } - - if (g_utf8_strlen (value, -1) > 1) + else { + g_assert (strlen (value) < 20); + if (char_data->len > 0) g_string_append_c (char_data, 0); - codepoint = char_data->len | (1 << 31); + g_assert (char_data->len < 0x8000); + encoded_value = (guint16) (char_data->len | 0x8000); g_string_append (char_data, value); } - else + + if (sequence[0] != current_first) { - codepoint = g_utf8_get_char (value); - g_assert ((codepoint & (1 << 31)) == 0); + g_assert (sequence[0] <= 0xffff); + if (current_first != 0) + first_pos += index_rowstride; + current_first = (guint16)sequence[0]; + + data[first_pos] = (guint16)sequence[0]; + for (i = 1; i < index_rowstride; i++) + data[first_pos + i] = rest_pos; } - gtk_compose_seqs[n++] = (codepoint & 0xffff0000) >> 16; - gtk_compose_seqs[n++] = codepoint & 0xffff; + for (i = 1; i < len; i++) + { + g_assert (sequence[i] != 0); + g_assert (sequence[i] <= 0xffff); + data[rest_pos + i - 1] = (guint16) sequence[i]; + } + + g_assert (encoded_value != 0); + data[rest_pos + len - 1] = encoded_value; + + rest_pos += len; + + for (i = len; i <= max_compose_len; i++) + data[first_pos + i] = rest_pos; + + for (i = 1; i < max_compose_len; i++) + g_assert (data[first_pos + i] <= data[first_pos + i + 1]); } - retval = g_new0 (GtkComposeTable, 1); - retval->data = gtk_compose_seqs; - retval->max_seq_len = max_compose_len; - retval->n_seqs = length; - retval->id = hash; - retval->n_chars = char_data->len; - retval->char_data = g_string_free (char_data, FALSE); + g_assert (first_pos + index_rowstride == n_first * index_rowstride); + g_assert (rest_pos == n_first * index_rowstride + size); + + if (char_data->len > 0) + g_string_append_c (char_data, 0); + + table = g_new0 (GtkComposeTable, 1); + table->data = data; + table->data_size = n_first * index_rowstride + size; + table->max_seq_len = max_compose_len; + table->n_index_size = n_first; + table->n_chars = char_data->len; + table->char_data = g_string_free (char_data, FALSE); + table->id = g_str_hash (parser->compose_file); g_list_free (sequences); - return retval; + return table; } static char * -canonicalize_filename (const char *path) +canonicalize_filename (GtkComposeParser *parser, + const char *path) { GFile *file; char *retval; - file = g_file_new_for_path (path); + if (path[0] != '/' && parser->compose_file) + { + GFile *orig = g_file_new_for_path (parser->compose_file); + GFile *parent = g_file_get_parent (orig); + file = g_file_resolve_relative_path (parent, path); + g_object_unref (parent); + g_object_unref (orig); + } + else + { + file = g_file_new_for_path (path); + } + retval = g_file_get_path (file); g_object_unref (file); @@ -939,7 +1024,7 @@ parser_parse_file (GtkComposeParser *parser, if (parser->compose_file == NULL) parser->compose_file = compose_file; - path = canonicalize_filename (compose_file); + path = canonicalize_filename (parser, compose_file); if (g_list_find_custom (parser->files, path, (GCompareFunc)strcmp)) { @@ -956,24 +1041,31 @@ parser_parse_file (GtkComposeParser *parser, } GtkComposeTable * -gtk_compose_table_new_with_file (const char *compose_file) +gtk_compose_table_parse (const char *compose_file) { GtkComposeParser *parser; GtkComposeTable *compose_table; + parser = parser_new (); + parser_parse_file (parser, compose_file); + compose_table = parser_get_compose_table (parser); + parser_free (parser); + + return compose_table; +} + +GtkComposeTable * +gtk_compose_table_new_with_file (const char *compose_file) +{ + GtkComposeTable *compose_table; + g_assert (compose_file != NULL); compose_table = gtk_compose_table_load_cache (compose_file); if (compose_table != NULL) return compose_table; - parser = parser_new (); - - parser_parse_file (parser, compose_file); - - compose_table = parser_get_compose_table (parser); - - parser_free (parser); + compose_table = gtk_compose_table_parse (compose_file); if (compose_table != NULL) gtk_compose_table_save_cache (compose_table); @@ -986,34 +1078,30 @@ gtk_compose_table_new_with_data (const guint16 *data, int max_seq_len, int n_seqs) { + GtkComposeParser *parser; GtkComposeTable *compose_table; - gsize n_index_stride; - gsize length; int i; - guint16 *gtk_compose_seqs = NULL; - g_return_val_if_fail (data != NULL, NULL); - g_return_val_if_fail (max_seq_len >= 0, NULL); - g_return_val_if_fail (n_seqs >= 0, NULL); + parser = parser_new (); - n_index_stride = max_seq_len + 2; - if (!g_size_checked_mul (&length, n_index_stride, n_seqs)) + for (i = 0; i < n_seqs; i++) { - g_critical ("Overflow in the compose sequences"); - return NULL; - } + const guint16 *seq = data + i * (max_seq_len + 2); + guint16 *sequence; + gunichar ch; + char buf[8] = { 0, }; + + sequence = g_new0 (guint16, max_seq_len + 1); + memcpy (sequence, seq, sizeof (guint16) * max_seq_len); + + ch = ((gunichar)seq[max_seq_len]) << 16 | (gunichar)seq[max_seq_len + 1]; + g_unichar_to_utf8 (ch, buf); - gtk_compose_seqs = g_new0 (guint16, length); - for (i = 0; i < length; i++) - gtk_compose_seqs[i] = data[i]; + g_hash_table_replace (parser->sequences, sequence, g_strdup (buf)); + } - compose_table = g_new (GtkComposeTable, 1); - compose_table->data = gtk_compose_seqs; - compose_table->max_seq_len = max_seq_len; - compose_table->n_seqs = n_seqs; - compose_table->id = data_hash (data, length); - compose_table->char_data = NULL; - compose_table->n_chars = 0; + compose_table = parser_get_compose_table (parser); + parser_free (parser); return compose_table; } @@ -1038,6 +1126,20 @@ compare_seq (const void *key, const void *value) return 0; } +static int +compare_seq_index (const void *key, const void *value) +{ + const guint16 *keysyms = key; + const guint16 *seq = value; + + if (keysyms[0] < seq[0]) + return -1; + else if (keysyms[0] > seq[0]) + return 1; + + return 0; +} + /* * gtk_compose_table_check: * @table: the table to check @@ -1058,97 +1160,6 @@ gtk_compose_table_check (const GtkComposeTable *table, gboolean *compose_finish, gboolean *compose_match, GString *output) -{ - int row_stride = table->max_seq_len + 2; - guint16 *seq; - - *compose_finish = FALSE; - *compose_match = FALSE; - - g_string_set_size (output, 0); - - /* Will never match, if the sequence in the compose buffer is longer - * than the sequences in the table. Further, compare_seq (key, val) - * will overrun val if key is longer than val. - */ - if (n_compose > table->max_seq_len) - return FALSE; - - seq = bsearch (compose_buffer, - table->data, table->n_seqs, - sizeof (guint16) * row_stride, - compare_seq); - - if (seq) - { - guint16 *prev_seq; - - /* Back up to the first sequence that matches to make sure - * we find the exact match if there is one. - */ - while (seq > table->data) - { - prev_seq = seq - row_stride; - if (compare_seq (compose_buffer, prev_seq) != 0) - break; - seq = prev_seq; - } - - if (n_compose == table->max_seq_len || - seq[n_compose] == 0) /* complete sequence */ - { - guint16 *next_seq; - gunichar value; - - value = (seq[table->max_seq_len] << 16) | seq[table->max_seq_len + 1]; - if ((value & (1 << 31)) != 0) - g_string_append (output, &table->char_data[value & ~(1 << 31)]); - else - g_string_append_unichar (output, value); - - *compose_match = TRUE; - - /* We found a tentative match. See if there are any longer - * sequences containing this subsequence - */ - next_seq = seq + row_stride; - if (next_seq < table->data + row_stride * table->n_seqs) - { - if (compare_seq (compose_buffer, next_seq) == 0) - return TRUE; - } - - *compose_finish = TRUE; - return TRUE; - } - - return TRUE; - } - - return FALSE; -} - -static int -compare_seq_index (const void *key, const void *value) -{ - const guint16 *keysyms = key; - const guint16 *seq = value; - - if (keysyms[0] < seq[0]) - return -1; - else if (keysyms[0] > seq[0]) - return 1; - - return 0; -} - -gboolean -gtk_compose_table_compact_check (const GtkComposeTableCompact *table, - const guint16 *compose_buffer, - int n_compose, - gboolean *compose_finish, - gboolean *compose_match, - gunichar *output_char) { int row_stride; guint16 *seq_index; @@ -1161,8 +1172,6 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table, *compose_finish = FALSE; if (compose_match) *compose_match = FALSE; - if (output_char) - *output_char = 0; /* Will never match, if the sequence in the compose buffer is longer * than the sequences in the table. Further, compare_seq (key, val) @@ -1174,7 +1183,7 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table, seq_index = bsearch (compose_buffer, table->data, table->n_index_size, - sizeof (guint16) * table->n_index_stride, + sizeof (guint16) * (table->max_seq_len + 1), compare_seq_index); if (!seq_index) @@ -1196,7 +1205,7 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table, seq = bsearch (compose_buffer + 1, table->data + seq_index[i], (seq_index[i + 1] - seq_index[i]) / row_stride, - sizeof (guint16) * row_stride, + sizeof (guint16) * row_stride, compare_seq); if (seq) @@ -1204,12 +1213,15 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table, if (i == n_compose - 1) { value = seq[row_stride - 1]; + + if ((value & (1 << 15)) != 0) + g_string_append (output, &table->char_data[value & ~(1 << 15)]); + else + g_string_append_unichar (output, value); match = TRUE; } else { - if (output_char) - *output_char = value; if (match) { if (compose_match) @@ -1228,8 +1240,6 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table, *compose_match = TRUE; if (compose_finish) *compose_finish = TRUE; - if (output_char) - *output_char = value; return TRUE; } @@ -1237,6 +1247,65 @@ gtk_compose_table_compact_check (const GtkComposeTableCompact *table, return FALSE; } +void +gtk_compose_table_foreach (const GtkComposeTable *table, + GtkComposeSequenceCallback callback, + gpointer data) +{ + int index_stride = table->max_seq_len + 1; + gunichar *sequence; + int seqno; + + sequence = g_new0 (gunichar, table->max_seq_len + 1); + + seqno = 0; + for (int idx = 0; idx < table->n_index_size; idx++) + { + const guint16 *seq_index = table->data + (idx * index_stride); + + for (int i = 1; i < table->max_seq_len; i++) + { + int len = i + 1; + + g_assert (seq_index[i] <= seq_index[i + 1]); + g_assert (seq_index[i + 1] <= table->data_size); + g_assert ((seq_index[i + 1] - seq_index[i]) % len == 0); + + for (int j = seq_index[i]; j < seq_index[i + 1]; j += len) + { + char buf[8] = { 0, }; + guint16 encoded_value; + char *value; + + sequence[0] = seq_index[0]; + for (int k = 0; k < len - 1; k++) + sequence[k + 1] = (gunichar) table->data[j + k]; + sequence[len] = 0; + + encoded_value = table->data[j + len - 1]; + g_assert (encoded_value != 0); + if ((encoded_value & (1 << 15)) != 0) + { + int char_offset = encoded_value & ~(1 << 15); + g_assert (char_offset < table->n_chars); + value = &table->char_data[char_offset]; + g_assert (strlen (value) < 20); + } + else + { + g_unichar_to_utf8 ((gunichar)encoded_value, buf); + value = buf; + } + + callback (sequence, len, value, data); + seqno++; + } + } + } + + g_free (sequence); +} + /* Checks if a keysym is a dead key. * Dead key keysym values are defined in ../gdk/gdkkeysyms.h and the * first is GDK_KEY_dead_grave. As X.Org is updated, more dead keys @@ -1428,4 +1497,3 @@ gtk_check_algorithmically (const guint16 *compose_buffer, return FALSE; } - diff --git a/gtk/gtkcomposetable.h b/gtk/gtkcomposetable.h index 1f28f83e73..0e6c1aec9c 100644 --- a/gtk/gtkcomposetable.h +++ b/gtk/gtkcomposetable.h @@ -26,50 +26,65 @@ G_BEGIN_DECLS typedef struct _GtkComposeTable GtkComposeTable; typedef struct _GtkComposeTableCompact GtkComposeTableCompact; +/* The layout of the data is as follows: + * + * The first part of the data contains rows of length max_seq_len + 1, + * where the first element is the item of the sequence, and the + * following elements are offsets to the data for sequences that + * start with the first item of length 2, ..., max_seq_len. + * + * The second part of the data contains the rest of the sequence + * data. It does not have a fixed stride. For each sequence, we + * put seq[2], ..., seq[len - 1], followed by the encoded value + * for this sequence. + * + * The values are encoded as follows: + * + * If the value is a single Unicode character smaler than 0x8000, + * then we place it directly. Otherwise, we put the UTF8-encoded + * value in the char_data array, and use offset | 0x8000 as the + * encoded value. + */ struct _GtkComposeTable { guint16 *data; char *char_data; int max_seq_len; - int n_seqs; + int n_index_size; + int data_size; int n_chars; guint32 id; }; -struct _GtkComposeTableCompact -{ - const guint16 *data; - int max_seq_len; - int n_index_size; - int n_index_stride; -}; +GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file); +GtkComposeTable * gtk_compose_table_parse (const char *compose_file); +GtkComposeTable * gtk_compose_table_new_with_data (const guint16 *data, + int max_seq_len, + int n_seqs); -GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file); -GtkComposeTable * gtk_compose_table_new_with_data (const guint16 *data, - int max_seq_len, - int n_seqs); +typedef void (* GtkComposeSequenceCallback) (gunichar *sequence, + int len, + const char *value, + gpointer data); -gboolean gtk_compose_table_check (const GtkComposeTable *table, - const guint16 *compose_buffer, - int n_compose, - gboolean *compose_finish, - gboolean *compose_match, - GString *output); +void gtk_compose_table_foreach (const GtkComposeTable *table, + GtkComposeSequenceCallback callback, + gpointer data); -gboolean gtk_compose_table_compact_check (const GtkComposeTableCompact *table, - const guint16 *compose_buffer, - int n_compose, - gboolean *compose_finish, - gboolean *compose_match, - gunichar *output_char); +gboolean gtk_compose_table_check (const GtkComposeTable *table, + const guint16 *compose_buffer, + int n_compose, + gboolean *compose_finish, + gboolean *compose_match, + GString *output); -gboolean gtk_check_algorithmically (const guint16 *compose_buffer, - int n_compose, - gunichar *output); +gboolean gtk_check_algorithmically (const guint16 *compose_buffer, + int n_compose, + gunichar *output); -guint32 gtk_compose_table_data_hash (const guint16 *data, - int max_seq_len, - int n_seqs); +guint32 gtk_compose_table_data_hash (const guint16 *data, + int max_seq_len, + int n_seqs); G_END_DECLS diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 078ed6f612..5ad9f8c8ab 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -74,18 +74,32 @@ struct _GtkIMContextSimplePrivate guint modifiers_dropped : 1; }; -/* From the values below, the value 30 means the number of different first keysyms - * that exist in the Compose file (from Xorg). When running compose-parse.py without - * parameters, you get the count that you can put here. Needed when updating the - * gtkimcontextsimpleseqs.h header file (contains the compose sequences). - */ -const GtkComposeTableCompact gtk_compose_table_compact = { - gtk_compose_seqs_compact, - 5, - 30, - 6 +#include "gtk/compose/gtkcomposedata.h" + +GtkComposeTable builtin_compose_table = { + NULL, + NULL, + MAX_SEQ_LEN, + N_INDEX_SIZE, + DATA_SIZE, + N_CHARS, + 0 }; +static void +init_builtin_table (void) +{ + GBytes *bytes; + + bytes = g_resources_lookup_data ("/org/gtk/libgtk/compose/sequences", 0, NULL); + builtin_compose_table.data = (guint16 *) g_bytes_get_data (bytes, NULL); + g_bytes_unref (bytes); + + bytes = g_resources_lookup_data ("/org/gtk/libgtk/compose/chars", 0, NULL); + builtin_compose_table.char_data = (char *) g_bytes_get_data (bytes, NULL); + g_bytes_unref (bytes); +} + G_LOCK_DEFINE_STATIC (global_tables); static GSList *global_tables; static gboolean omit_builtin_sequences; @@ -147,6 +161,7 @@ gtk_im_context_simple_class_init (GtkIMContextSimpleClass *class) im_context_class->get_preedit_string = gtk_im_context_simple_get_preedit_string; gobject_class->finalize = gtk_im_context_simple_finalize; + init_builtin_table (); init_compose_table_async (NULL, NULL, NULL); } @@ -200,9 +215,9 @@ add_compose_table_from_file (const char *compose_file, } static void -add_compose_table_from_data (const guint16 *data, - int max_seq_len, - int n_seqs) +add_compose_table_from_data (guint16 *data, + int max_seq_len, + int n_seqs) { guint hash; @@ -337,7 +352,7 @@ gtk_im_context_simple_init (GtkIMContextSimple *context_simple) priv = context_simple->priv = gtk_im_context_simple_get_instance_private (context_simple); - priv->compose_buffer_len = gtk_compose_table_compact.max_seq_len + 1; + priv->compose_buffer_len = builtin_compose_table.max_seq_len + 1; priv->compose_buffer = g_new0 (guint16, priv->compose_buffer_len); priv->tentative_match = g_string_new (""); priv->tentative_match_len = 0; @@ -1069,18 +1084,19 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, G_UNLOCK (global_tables); - g_string_free (output, TRUE); - if (success) - return TRUE; + { + g_string_free (output, TRUE); + return TRUE; + } G_LOCK (global_tables); if (!omit_builtin_sequences && - gtk_compose_table_compact_check (>k_compose_table_compact, - priv->compose_buffer, n_compose, - &compose_finish, &compose_match, - &output_char)) + gtk_compose_table_check (&builtin_compose_table, + priv->compose_buffer, n_compose, + &compose_finish, &compose_match, + output)) { if (!priv->in_compose_sequence) { @@ -1091,24 +1107,28 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, if (compose_finish) { if (compose_match) - gtk_im_context_simple_commit_char (context_simple, output_char); + gtk_im_context_simple_commit_string (context_simple, output->str); } else { if (compose_match) { - g_string_set_size (priv->tentative_match, 0); - g_string_append_unichar (priv->tentative_match, output_char); + g_string_assign (priv->tentative_match, output->str); priv->tentative_match_len = n_compose; } g_signal_emit_by_name (context_simple, "preedit-changed"); } - return TRUE; + success = TRUE; } G_UNLOCK (global_tables); + g_string_free (output, TRUE); + + if (success) + return TRUE; + if (gtk_check_algorithmically (priv->compose_buffer, n_compose, &output_char)) { if (!priv->in_compose_sequence) @@ -1261,12 +1281,14 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context, * The table must be sorted in dictionary order on the * numeric value of the key symbol fields. (Values beyond * the length of the sequence should be zero.) - **/ + * + * Deprecated: 4.4: Use gtk_im_context_simple_add_compose_file() + */ void gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple, - guint16 *data, - int max_seq_len, - int n_seqs) + guint16 *data, + int max_seq_len, + int n_seqs) { g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); diff --git a/gtk/gtkimcontextsimple.h b/gtk/gtkimcontextsimple.h index 7bd4454b1c..c2629a8fdd 100644 --- a/gtk/gtkimcontextsimple.h +++ b/gtk/gtkimcontextsimple.h @@ -63,11 +63,11 @@ GType gtk_im_context_simple_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GtkIMContext *gtk_im_context_simple_new (void); -GDK_AVAILABLE_IN_ALL +GDK_DEPRECATED_IN_4_4_FOR(gtk_im_context_simple_add_compose_file) void gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple, - guint16 *data, - int max_seq_len, - int n_seqs); + guint16 *data, + int max_seq_len, + int n_seqs); GDK_AVAILABLE_IN_ALL void gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple, const char *compose_file); diff --git a/gtk/meson.build b/gtk/meson.build index 9e2e04d798..4a16e2808f 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -1276,3 +1276,5 @@ libgtk_static_dep = declare_dependency(sources: gtk_dep_sources, link_with: [libgtk_static, libgtk_css, libgdk, libgsk ], link_args: common_ldflags, ) + +subdir('compose') diff --git a/testsuite/gtk/compose/basic.expected b/testsuite/gtk/compose/basic.expected index ab7a0d2b94..96e2f4e0e3 100644 --- a/testsuite/gtk/compose/basic.expected +++ b/testsuite/gtk/compose/basic.expected @@ -1,3 +1,5 @@ -# n_seqs: 1 # max_seq_len: 4 +# n_index_size: 1 +# data_size: 9 +# n_chars: 0 : "!" # U21 diff --git a/testsuite/gtk/compose/codepoint.expected b/testsuite/gtk/compose/codepoint.expected index d2c09f6c3f..295e71882f 100644 --- a/testsuite/gtk/compose/codepoint.expected +++ b/testsuite/gtk/compose/codepoint.expected @@ -1,3 +1,5 @@ -# n_seqs: 1 # max_seq_len: 4 +# n_index_size: 1 +# data_size: 9 +# n_chars: 0 : "!" # U21 diff --git a/testsuite/gtk/compose/comments.expected b/testsuite/gtk/compose/comments.expected index 728817b5db..683486e499 100644 --- a/testsuite/gtk/compose/comments.expected +++ b/testsuite/gtk/compose/comments.expected @@ -1,5 +1,7 @@ -# n_seqs: 3 # max_seq_len: 2 +# n_index_size: 1 +# data_size: 9 +# n_chars: 0 : "a" # U61 : "#" # U23 : "a" # U61 diff --git a/testsuite/gtk/compose/cycle b/testsuite/gtk/compose/cycle index b65eca834f..2f9a0c6a15 100644 --- a/testsuite/gtk/compose/cycle +++ b/testsuite/gtk/compose/cycle @@ -1,3 +1,3 @@ -include "testsuite/gtk/compose/cycle" # create an include cycle +include "cycle" # create an include cycle : "!" diff --git a/testsuite/gtk/compose/hex.expected b/testsuite/gtk/compose/hex.expected index 603344216c..f753c59688 100644 --- a/testsuite/gtk/compose/hex.expected +++ b/testsuite/gtk/compose/hex.expected @@ -1,3 +1,5 @@ -# n_seqs: 1 # max_seq_len: 4 +# n_index_size: 1 +# data_size: 9 +# n_chars: 7 : "⏾⏳" diff --git a/testsuite/gtk/compose/include b/testsuite/gtk/compose/include index f69d7a79e7..d6c3ee7bb6 100644 --- a/testsuite/gtk/compose/include +++ b/testsuite/gtk/compose/include @@ -1,4 +1,4 @@ -include "testsuite/gtk/compose/included" # see if this works +include "included" # see if this works : "!" # replace this entry : "" # remove this entry diff --git a/testsuite/gtk/compose/include.expected b/testsuite/gtk/compose/include.expected index b2145d544b..bb0bd50a9c 100644 --- a/testsuite/gtk/compose/include.expected +++ b/testsuite/gtk/compose/include.expected @@ -1,3 +1,5 @@ -# n_seqs: 1 # max_seq_len: 4 +# n_index_size: 1 +# data_size: 9 +# n_chars: 0 : "!" # U21 diff --git a/testsuite/gtk/compose/long.expected b/testsuite/gtk/compose/long.expected index 17de9b5575..e50a95d39a 100644 --- a/testsuite/gtk/compose/long.expected +++ b/testsuite/gtk/compose/long.expected @@ -1,3 +1,5 @@ -# n_seqs: 1 # max_seq_len: 11 +# n_index_size: 1 +# data_size: 23 +# n_chars: 5 : "🧀" # U1f9c0 diff --git a/testsuite/gtk/compose/match.expected b/testsuite/gtk/compose/match.expected index c9013cac3c..6a2deaa724 100644 --- a/testsuite/gtk/compose/match.expected +++ b/testsuite/gtk/compose/match.expected @@ -1,5 +1,7 @@ -# n_seqs: 3 # max_seq_len: 7 - : "!" # U21 - : "?" # U3f - : "🥂" # U1f942 +# n_index_size: 1 +# data_size: 24 +# n_chars: 4 + : "!" # U21 + : "?" # U3f + : "🥂" diff --git a/testsuite/gtk/compose/multi.expected b/testsuite/gtk/compose/multi.expected index 21b97a0fe5..72a9fbe92d 100644 --- a/testsuite/gtk/compose/multi.expected +++ b/testsuite/gtk/compose/multi.expected @@ -1,5 +1,7 @@ -# n_seqs: 3 # max_seq_len: 5 - : "_" # U5f - : "!" # U21 +# n_index_size: 1 +# data_size: 19 +# n_chars: 0 + : "_" # U5f + : "!" # U21 : "/" # U2f diff --git a/testsuite/gtk/compose/octal.expected b/testsuite/gtk/compose/octal.expected index ab7a0d2b94..96e2f4e0e3 100644 --- a/testsuite/gtk/compose/octal.expected +++ b/testsuite/gtk/compose/octal.expected @@ -1,3 +1,5 @@ -# n_seqs: 1 # max_seq_len: 4 +# n_index_size: 1 +# data_size: 9 +# n_chars: 0 : "!" # U21 diff --git a/testsuite/gtk/compose/strings.expected b/testsuite/gtk/compose/strings.expected index e1dfdc6dc1..4eff96267a 100644 --- a/testsuite/gtk/compose/strings.expected +++ b/testsuite/gtk/compose/strings.expected @@ -1,6 +1,8 @@ -# n_seqs: 4 # max_seq_len: 5 - : "\"\\" - : "!a" +# n_index_size: 1 +# data_size: 24 +# n_chars: 9 + : "\"\\" + : "!a" : "?" # U3f : "QR" diff --git a/testsuite/gtk/compose/system.expected b/testsuite/gtk/compose/system.expected index 92a4710596..04902d2c76 100644 --- a/testsuite/gtk/compose/system.expected +++ b/testsuite/gtk/compose/system.expected @@ -1,472 +1,899 @@ -# n_seqs: 4476 # max_seq_len: 5 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "`" # U60 - : "Ǜ" # U1db - : "ǜ" # U1dc - : "̀" # U300 - : "`" # U60 - : "Ǜ" # U1db - : "ǜ" # U1dc - : "ῒ" # U1fd2 - : "ῢ" # U1fe2 - : "Ἃ" # U1f0b - : "Ἓ" # U1f1b - : "Ἣ" # U1f2b - : "Ἳ" # U1f3b - : "Ὃ" # U1f4b - : "Ὓ" # U1f5b - : "Ὣ" # U1f6b - : "ἃ" # U1f03 - : "ἓ" # U1f13 - : "ἣ" # U1f23 - : "ἳ" # U1f33 - : "ὃ" # U1f43 - : "ὓ" # U1f53 - : "ὣ" # U1f63 - : "Ἂ" # U1f0a - : "Ἒ" # U1f1a - : "Ἢ" # U1f2a - : "Ἲ" # U1f3a - : "Ὂ" # U1f4a - : "Ὢ" # U1f6a - : "ἂ" # U1f02 - : "ἒ" # U1f12 - : "ἢ" # U1f22 - : "ἲ" # U1f32 - : "ὂ" # U1f42 - : "ὒ" # U1f52 - : "ὢ" # U1f62 - : "Ờ" # U1edc - : "Ừ" # U1eea - : "ờ" # U1edd - : "ừ" # U1eeb - : "Ằ" # U1eb0 - : "ằ" # U1eb1 - : "Ầ" # U1ea6 - : "Ề" # U1ec0 - : "Ồ" # U1ed2 - : "ầ" # U1ea7 - : "ề" # U1ec1 - : "ồ" # U1ed3 - : "Ḕ" # U1e14 - : "Ṑ" # U1e50 - : "ḕ" # U1e15 - : "ṑ" # U1e51 - : "Ằ" # U1eb0 - : "ằ" # U1eb1 - : "Ḕ" # U1e14 - : "Ṑ" # U1e50 - : "ḕ" # U1e15 - : "ṑ" # U1e51 - : "'" # U27 - : "Ǘ" # U1d7 - : "ǘ" # U1d8 - : "́" # U301 - : "´" # Ub4 - : "΅" # U385 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "Ḯ" # U1e2e - : "Ǘ" # U1d7 - : "ḯ" # U1e2f - : "ǘ" # U1d8 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "Ἅ" # U1f0d - : "Ἕ" # U1f1d - : "Ἥ" # U1f2d - : "Ἵ" # U1f3d - : "Ὅ" # U1f4d - : "Ὕ" # U1f5d - : "Ὥ" # U1f6d - : "ἅ" # U1f05 - : "ἕ" # U1f15 - : "ἥ" # U1f25 - : "ἵ" # U1f35 - : "ὅ" # U1f45 - : "ὕ" # U1f55 - : "ὥ" # U1f65 - : "Ἄ" # U1f0c - : "Ἔ" # U1f1c - : "Ἤ" # U1f2c - : "Ἴ" # U1f3c - : "Ὄ" # U1f4c - : "Ὤ" # U1f6c - : "ἄ" # U1f04 - : "ἔ" # U1f14 - : "ἤ" # U1f24 - : "ἴ" # U1f34 - : "ὄ" # U1f44 - : "ὔ" # U1f54 - : "ὤ" # U1f64 - : "Ớ" # U1eda - : "Ứ" # U1ee8 - : "ớ" # U1edb - : "ứ" # U1ee9 - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "Ắ" # U1eae - : "ắ" # U1eaf - : "Ấ" # U1ea4 - : "Ế" # U1ebe - : "Ố" # U1ed0 - : "ấ" # U1ea5 - : "ế" # U1ebf - : "ố" # U1ed1 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "Ǻ" # U1fa - : "ǻ" # U1fb - : "Ṍ" # U1e4c - : "Ṹ" # U1e78 - : "ṍ" # U1e4d - : "ṹ" # U1e79 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "^" # U5e - : "⁽" # U207d - : "⁾" # U207e - : "⁺" # U207a - : "⁻" # U207b - : "⁰" # U2070 - : "¹" # Ub9 - : "²" # Ub2 - : "³" # Ub3 - : "⁴" # U2074 - : "⁵" # U2075 - : "⁶" # U2076 - : "⁷" # U2077 - : "⁸" # U2078 - : "⁹" # U2079 - : "⁼" # U207c - : "̂" # U302 - : "Ầ" # U1ea6 - : "Ấ" # U1ea4 - : "Ẫ" # U1eaa - : "Ề" # U1ec0 - : "Ế" # U1ebe - : "Ồ" # U1ed2 - : "Ố" # U1ed0 - : "Ỗ" # U1ed6 - : "ầ" # U1ea7 - : "ấ" # U1ea5 - : "ẫ" # U1eab - : "ề" # U1ec1 - : "ế" # U1ebf - : "ồ" # U1ed3 - : "ố" # U1ed1 - : "ỗ" # U1ed7 - : "⁻" # U207b - : "㆒" # U3192 - : "㆜" # U319c - : "㆔" # U3194 - : "㆖" # U3196 - : "㆘" # U3198 - : "㆛" # U319b - : "㆗" # U3197 - : "㆚" # U319a - : "㆓" # U3193 - : "㆟" # U319f - : "㆕" # U3195 - : "㆞" # U319e - : "㆝" # U319d - : "㆙" # U3199 - : "^" # U5e - : "Ậ" # U1eac - : "Ệ" # U1ec6 - : "Ộ" # U1ed8 - : "ậ" # U1ead - : "ệ" # U1ec7 - : "ộ" # U1ed9 - : "℠" # U2120 - : "℠" # U2120 - : "™" # U2122 - : "™" # U2122 - : "ª" # Uaa - : "ʰ" # U2b0 - : "ⁱ" # U2071 - : "ʲ" # U2b2 - : "ˡ" # U2e1 - : "ⁿ" # U207f - : "º" # Uba - : "ʳ" # U2b3 - : "ˢ" # U2e2 - : "ʷ" # U2b7 - : "ˣ" # U2e3 - : "ʸ" # U2b8 - : "ˠ" # U2e0 - : "ʱ" # U2b1 - : "ʴ" # U2b4 - : "ʵ" # U2b5 - : "ʶ" # U2b6 - : "ˤ" # U2e4 - : "℠" # U2120 - : "℠" # U2120 - : "™" # U2122 - : "™" # U2122 - : "ª" # Uaa - : "ʰ" # U2b0 - : "ⁱ" # U2071 - : "ʲ" # U2b2 - : "ˡ" # U2e1 - : "ⁿ" # U207f - : "º" # Uba - : "ʳ" # U2b3 - : "ˢ" # U2e2 - : "ʷ" # U2b7 - : "ˣ" # U2e3 - : "ʸ" # U2b8 - : "ˠ" # U2e0 - : "ʱ" # U2b1 - : "ʴ" # U2b4 - : "ʵ" # U2b5 - : "ʶ" # U2b6 - : "ˤ" # U2e4 - : "²" # Ub2 - : "⁺" # U207a - : "⁰" # U2070 - : "¹" # Ub9 - : "²" # Ub2 - : "³" # Ub3 - : "⁴" # U2074 - : "⁵" # U2075 - : "⁶" # U2076 - : "⁷" # U2077 - : "⁸" # U2078 - : "⁹" # U2079 - : "⁼" # U207c - : "~" # U7e - : "≲" # U2272 - : "≃" # U2243 - : "≳" # U2273 - : "̃" # U303 - : "Ṍ" # U1e4c - : "Ṏ" # U1e4e - : "Ṹ" # U1e78 - : "ṍ" # U1e4d - : "ṏ" # U1e4f - : "ṹ" # U1e79 - : "Ȭ" # U22c - : "ȭ" # U22d - : "ἆ" # U1f06 - : "ἇ" # U1f07 - : "Ἆ" # U1f0e - : "Ἇ" # U1f0f - : "ἦ" # U1f26 - : "ἧ" # U1f27 - : "Ἦ" # U1f2e - : "Ἧ" # U1f2f - : "ἶ" # U1f36 - : "ἷ" # U1f37 - : "Ἶ" # U1f3e - : "Ἷ" # U1f3f - : "ὖ" # U1f56 - : "ὗ" # U1f57 - : "Ὗ" # U1f5f - : "ὦ" # U1f66 - : "ὧ" # U1f67 - : "Ὦ" # U1f6e - : "Ὧ" # U1f6f - : "~" # U7e - : "ῗ" # U1fd7 - : "ῧ" # U1fe7 - : "Ἇ" # U1f0f - : "Ἧ" # U1f2f - : "Ἷ" # U1f3f - : "Ὗ" # U1f5f - : "Ὧ" # U1f6f - : "ἇ" # U1f07 - : "ἧ" # U1f27 - : "ἷ" # U1f37 - : "ὗ" # U1f57 - : "ὧ" # U1f67 - : "Ἆ" # U1f0e - : "Ἦ" # U1f2e - : "Ἶ" # U1f3e - : "Ὦ" # U1f6e - : "ἆ" # U1f06 - : "ἦ" # U1f26 - : "ἶ" # U1f36 - : "ὖ" # U1f56 - : "ὦ" # U1f66 - : "Ỡ" # U1ee0 - : "Ữ" # U1eee - : "ỡ" # U1ee1 - : "ữ" # U1eef - : "Ẵ" # U1eb4 - : "ẵ" # U1eb5 - : "Ẫ" # U1eaa - : "Ễ" # U1ec4 - : "Ỗ" # U1ed6 - : "ẫ" # U1eab - : "ễ" # U1ec5 - : "ỗ" # U1ed7 - : "Ẵ" # U1eb4 - : "ẵ" # U1eb5 - : "¯" # Uaf - : "Ǖ" # U1d5 - : "ǖ" # U1d6 - : "̄" # U304 - : "Ḕ" # U1e14 - : "Ḗ" # U1e16 - : "Ṑ" # U1e50 - : "Ṓ" # U1e52 - : "ḕ" # U1e15 - : "ḗ" # U1e17 - : "ṑ" # U1e51 - : "ṓ" # U1e53 - : "¯" # Uaf - : "Ᾱ" # U1fb9 - : "Ῑ" # U1fd9 - : "Ῡ" # U1fe9 - : "ᾱ" # U1fb1 - : "ῑ" # U1fd1 - : "ῡ" # U1fe1 - : "Ḹ" # U1e38 - : "Ṝ" # U1e5c - : "ḹ" # U1e39 - : "ṝ" # U1e5d - : "Ǟ" # U1de - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ȫ" # U22b - : "ǖ" # U1d6 - : "Ǡ" # U1e0 - : "Ȱ" # U230 - : "ǡ" # U1e1 - : "ȱ" # U231 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ȭ" # U22c - : "ȭ" # U22d - : "˘" # U2d8 - : "̆" # U306 - : "Ằ" # U1eb0 - : "Ắ" # U1eae - : "Ẵ" # U1eb4 - : "ằ" # U1eb1 - : "ắ" # U1eaf - : "ẵ" # U1eb5 - : "˘" # U2d8 - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "˙" # U2d9 - : "Ŀ" # U13f - : "ı" # U131 - : "ȷ" # U237 - : "ŀ" # U140 - : "̇" # U307 - : "Ǡ" # U1e0 - : "Ȱ" # U230 - : "ǡ" # U1e1 - : "ȱ" # U231 - : "˙" # U2d9 - : "ɟ" # U25f - : "Ṩ" # U1e68 - : "ṩ" # U1e69 - : "Ṥ" # U1e64 - : "ṥ" # U1e65 - : "Ṧ" # U1e66 - : "ṧ" # U1e67 - : "ẛ" # U1e9b - : "Ṥ" # U1e64 - : "ṥ" # U1e65 - : """ # U22 - : "̈́" # U344 - : "̈" # U308 - : "̈́" # U344 - : "Ḯ" # U1e2e - : "Ǜ" # U1db - : "Ǘ" # U1d7 - : "ḯ" # U1e2f - : "ǜ" # U1dc - : "ǘ" # U1d8 - : "Ǚ" # U1d9 - : "ǚ" # U1da - : "Ǟ" # U1de - : "ǟ" # U1df - : "ȫ" # U22b - : "΅" # U385 - : "¨" # Ua8 - : "⩷" # U2a77 - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "Ṏ" # U1e4e - : "ṏ" # U1e4f - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "°" # Ub0 - : "̊" # U30a - : "Ǻ" # U1fa - : "ǻ" # U1fb - : "°" # Ub0 - : "˝" # U2dd - : "̋" # U30b - : "˝" # U2dd - : "ˇ" # U2c7 - : "₍" # U208d - : "₎" # U208e - : "₊" # U208a - : "₋" # U208b - : "₀" # U2080 - : "₁" # U2081 - : "₂" # U2082 - : "₃" # U2083 - : "₄" # U2084 - : "₅" # U2085 - : "₆" # U2086 - : "₇" # U2087 - : "₈" # U2088 - : "₉" # U2089 - : "₌" # U208c - : "Ǚ" # U1d9 - : "ǚ" # U1da - : "̌" # U30c - : "Dž" # U1c5 - : "ˇ" # U2c7 - : "Ǚ" # U1d9 - : "ǚ" # U1da - : "¸" # Ub8 - : "̧" # U327 - : "₵" # U20b5 - : "¸" # Ub8 - : "₵" # U20b5 - : "₵" # U20b5 - : "˛" # U2db - : "̨" # U328 - : "˛" # U2db - : "ͺ" # U37a - : "ᾊ" # U1f8a - : "ᾚ" # U1f9a - : "ᾪ" # U1faa - : "ᾂ" # U1f82 - : "ᾒ" # U1f92 - : "ᾢ" # U1fa2 - : "ᾋ" # U1f8b - : "ᾛ" # U1f9b - : "ᾫ" # U1fab - : "ᾃ" # U1f83 - : "ᾓ" # U1f93 - : "ᾣ" # U1fa3 +# n_index_size: 30 +# data_size: 16521 +# n_chars: 1572 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "`" # U60 + : "M̀" + : "Ǜ" # U1db + : "m̀" + : "ǜ" # U1dc + : "̀" # U300 + : "Ɔ̀" + : "Ǝ̀" + : "Ɛ̀" + : "Ɩ̀" + : "Ʊ̀" + : "Ʋ̀" + : "ǝ̀" + : "ɔ̀" + : "ɛ̀" + : "ɩ̀" + : "ʊ̀" + : "ʋ̀" + : "Ŋ̀" + : "ŋ̀" + : "а̀" + : "о̀" + : "р̀" + : "у̀" + : "А̀" + : "О̀" + : "Р̀" + : "У̀" + : "ἂ" # U1f02 + : "ἃ" # U1f03 + : "Ἂ" # U1f0a + : "Ἃ" # U1f0b + : "ἒ" # U1f12 + : "ἓ" # U1f13 + : "Ἒ" # U1f1a + : "Ἓ" # U1f1b + : "ἢ" # U1f22 + : "ἣ" # U1f23 + : "Ἢ" # U1f2a + : "Ἣ" # U1f2b + : "ἲ" # U1f32 + : "ἳ" # U1f33 + : "Ἲ" # U1f3a + : "Ἳ" # U1f3b + : "ὂ" # U1f42 + : "ὃ" # U1f43 + : "Ὂ" # U1f4a + : "Ὃ" # U1f4b + : "ὒ" # U1f52 + : "ὓ" # U1f53 + : "Ὓ" # U1f5b + : "ὢ" # U1f62 + : "ὣ" # U1f63 + : "Ὢ" # U1f6a + : "Ὣ" # U1f6b + : "`" # U60 + : "Ã̀" + : "Ẽ̀" + : "Ĩ̀" + : "Õ̀" + : "Ũ̀" + : "ã̀" + : "ẽ̀" + : "ĩ̀" + : "õ̀" + : "ũ̀" + : "Ɔ̃̀" + : "Ǝ̃̀" + : "Ɛ̃̀" + : "ǝ̃̀" + : "ɔ̃̀" + : "ɛ̃̀" + : "Ǜ" # U1db + : "ǜ" # U1dc + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ἃ" # U1f0b + : "Ἓ" # U1f1b + : "Ἣ" # U1f2b + : "Ἳ" # U1f3b + : "Ὃ" # U1f4b + : "Ὓ" # U1f5b + : "Ὣ" # U1f6b + : "ἃ" # U1f03 + : "ἓ" # U1f13 + : "ἣ" # U1f23 + : "ἳ" # U1f33 + : "ὃ" # U1f43 + : "ὓ" # U1f53 + : "ὣ" # U1f63 + : "Ἂ" # U1f0a + : "Ἒ" # U1f1a + : "Ἢ" # U1f2a + : "Ἲ" # U1f3a + : "Ὂ" # U1f4a + : "Ὢ" # U1f6a + : "ἂ" # U1f02 + : "ἒ" # U1f12 + : "ἢ" # U1f22 + : "ἲ" # U1f32 + : "ὂ" # U1f42 + : "ὒ" # U1f52 + : "ὢ" # U1f62 + : "Ờ" # U1edc + : "Ừ" # U1eea + : "ờ" # U1edd + : "ừ" # U1eeb + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "'" # U27 + : "J́" + : "Ǘ" # U1d7 + : "j́" + : "ǘ" # U1d8 + : "́" # U301 + : "Ɔ́" + : "Ǝ́" + : "Ɛ́" + : "Ɩ́" + : "Ʊ́" + : "Ʋ́" + : "ǝ́" + : "ɔ́" + : "ɛ́" + : "ɩ́" + : "ʊ́" + : "ʋ́" + : "Ŋ́" + : "ŋ́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "´" # Ub4 + : "Ã́" + : "Ẽ́" + : "Ĩ́" + : "ã́" + : "ẽ́" + : "ĩ́" + : "Ɔ̃́" + : "Ǝ̃́" + : "Ɛ̃́" + : "ǝ̃́" + : "ɔ̃́" + : "ɛ̃́" + : "΅" # U385 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "^" # U5e + : "⁽" # U207d + : "⁾" # U207e + : "⁺" # U207a + : "⁻" # U207b + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "̂" # U302 + : "Ầ" # U1ea6 + : "Ấ" # U1ea4 + : "Ẫ" # U1eaa + : "Ề" # U1ec0 + : "Ế" # U1ebe + : "Ồ" # U1ed2 + : "Ố" # U1ed0 + : "Ỗ" # U1ed6 + : "ầ" # U1ea7 + : "ấ" # U1ea5 + : "ẫ" # U1eab + : "ề" # U1ec1 + : "ế" # U1ebf + : "ồ" # U1ed3 + : "ố" # U1ed1 + : "ỗ" # U1ed7 + : "Ɔ̂" + : "Ǝ̂" + : "Ɛ̂" + : "Ɩ̂" + : "Ʊ̂" + : "Ʋ̂" + : "ǝ̂" + : "ɔ̂" + : "ɛ̂" + : "ɩ̂" + : "ʊ̂" + : "ʋ̂" + : "а̂" + : "е̂" + : "и̂" + : "о̂" + : "р̂" + : "у̂" + : "А̂" + : "Е̂" + : "И̂" + : "О̂" + : "Р̂" + : "У̂" + : "Ậ" # U1eac + : "ậ" # U1ead + : "Ệ" # U1ec6 + : "ệ" # U1ec7 + : "Ộ" # U1ed8 + : "ộ" # U1ed9 + : "⁻" # U207b + : "㆒" # U3192 + : "㆜" # U319c + : "㆔" # U3194 + : "㆖" # U3196 + : "㆘" # U3198 + : "㆛" # U319b + : "㆗" # U3197 + : "㆚" # U319a + : "㆓" # U3193 + : "㆟" # U319f + : "㆕" # U3195 + : "㆞" # U319e + : "㆝" # U319d + : "㆙" # U3199 + : "^" # U5e + : "²" # Ub2 + : "⁺" # U207a + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "Ậ" # U1eac + : "Ệ" # U1ec6 + : "Ộ" # U1ed8 + : "ậ" # U1ead + : "ệ" # U1ec7 + : "ộ" # U1ed9 + : "℠" # U2120 + : "℠" # U2120 + : "™" # U2122 + : "™" # U2122 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "℠" # U2120 + : "℠" # U2120 + : "™" # U2122 + : "™" # U2122 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "~" # U7e + : "≲" # U2272 + : "≃" # U2243 + : "≳" # U2273 + : "̃" # U303 + : "Ṍ" # U1e4c + : "Ṏ" # U1e4e + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṏ" # U1e4f + : "ṹ" # U1e79 + : "Ɔ̃" + : "Ǝ̃" + : "Ɛ̃" + : "ǝ̃" + : "ɔ̃" + : "ɛ̃" + : "Ȭ" # U22c + : "ȭ" # U22d + : "ἆ" # U1f06 + : "ἇ" # U1f07 + : "Ἆ" # U1f0e + : "Ἇ" # U1f0f + : "ἦ" # U1f26 + : "ἧ" # U1f27 + : "Ἦ" # U1f2e + : "Ἧ" # U1f2f + : "ἶ" # U1f36 + : "ἷ" # U1f37 + : "Ἶ" # U1f3e + : "Ἷ" # U1f3f + : "ὖ" # U1f56 + : "ὗ" # U1f57 + : "Ὗ" # U1f5f + : "ὦ" # U1f66 + : "ὧ" # U1f67 + : "Ὦ" # U1f6e + : "Ὧ" # U1f6f + : "~" # U7e + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "Ἇ" # U1f0f + : "Ἧ" # U1f2f + : "Ἷ" # U1f3f + : "Ὗ" # U1f5f + : "Ὧ" # U1f6f + : "ἇ" # U1f07 + : "ἧ" # U1f27 + : "ἷ" # U1f37 + : "ὗ" # U1f57 + : "ὧ" # U1f67 + : "Ἆ" # U1f0e + : "Ἦ" # U1f2e + : "Ἶ" # U1f3e + : "Ὦ" # U1f6e + : "ἆ" # U1f06 + : "ἦ" # U1f26 + : "ἶ" # U1f36 + : "ὖ" # U1f56 + : "ὦ" # U1f66 + : "Ỡ" # U1ee0 + : "Ữ" # U1eee + : "ỡ" # U1ee1 + : "ữ" # U1eef + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "¯" # Uaf + : "Ǖ" # U1d5 + : "ǖ" # U1d6 + : "̄" # U304 + : "Ḕ" # U1e14 + : "Ḗ" # U1e16 + : "Ṑ" # U1e50 + : "Ṓ" # U1e52 + : "ḕ" # U1e15 + : "ḗ" # U1e17 + : "ṑ" # U1e51 + : "ṓ" # U1e53 + : "Ɔ̄" + : "Ǝ̄" + : "Ɛ̄" + : "Ɩ̄" + : "Ʊ̄" + : "Ʋ̄" + : "ǝ̄" + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "ɔ̄" + : "ɛ̄" + : "ɩ̄" + : "ʊ̄" + : "ʋ̄" + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c + : "ṝ" # U1e5d + : "¯" # Uaf + : "Ǖ" # U1d5 + : "ǖ" # U1d6 + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ȭ" # U22c + : "ȭ" # U22d + : "˘" # U2d8 + : "̆" # U306 + : "Ằ" # U1eb0 + : "Ắ" # U1eae + : "Ẵ" # U1eb4 + : "ằ" # U1eb1 + : "ắ" # U1eaf + : "ẵ" # U1eb5 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "˘" # U2d8 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "˙" # U2d9 + : "Ŀ" # U13f + : "ı" # U131 + : "ȷ" # U237 + : "ŀ" # U140 + : "̇" # U307 + : "ẛ" # U1e9b + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "˙" # U2d9 + : "ɟ" # U25f + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "Ṧ" # U1e66 + : "ṧ" # U1e67 + : "ẛ" # U1e9b + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "\"" # U22 + : "̈́" # U344 + : "̈" # U308 + : "̈́" # U344 + : "Ḯ" # U1e2e + : "Ǜ" # U1db + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǜ" # U1dc + : "ǘ" # U1d8 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "Ǟ" # U1de + : "Ȫ" # U22a + : "ǟ" # U1df + : "ȫ" # U22b + : "Ӛ" # U4da + : "ӛ" # U4db + : "Ӫ" # U4ea + : "ӫ" # U4eb + : "¨" # Ua8 + : "΅" # U385 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "⩷" # U2a77 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "°" # Ub0 + : "̊" # U30a + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "°" # Ub0 + : "˝" # U2dd + : "̋" # U30b + : "˝" # U2dd + : "ˇ" # U2c7 + : "₍" # U208d + : "₎" # U208e + : "₊" # U208a + : "₋" # U208b + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "̌" # U30c + : "Ɔ̌" + : "Ǝ̌" + : "Ɛ̌" + : "Ɩ̌" + : "Ʊ̌" + : "Ʋ̌" + : "ǝ̌" + : "Dž" # U1c5 + : "ɔ̌" + : "ɛ̌" + : "ɩ̌" + : "ʊ̌" + : "ʋ̌" + : "ˇ" # U2c7 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "¸" # Ub8 + : "̧" # U327 + : "₵" # U20b5 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "¸" # Ub8 + : "₵" # U20b5 + : "₵" # U20b5 + : "˛" # U2db + : "̨" # U328 + : "˛" # U2db + : "ͺ" # U37a + : "ᾀ" # U1f80 + : "ᾁ" # U1f81 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾈ" # U1f88 + : "ᾉ" # U1f89 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾐ" # U1f90 + : "ᾑ" # U1f91 + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾘ" # U1f98 + : "ᾙ" # U1f99 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾠ" # U1fa0 + : "ᾡ" # U1fa1 + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾨ" # U1fa8 + : "ᾩ" # U1fa9 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ͺ" # U37a + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾊ" # U1f8a + : "ᾚ" # U1f9a + : "ᾪ" # U1faa + : "ᾂ" # U1f82 + : "ᾒ" # U1f92 + : "ᾢ" # U1fa2 + : "ᾋ" # U1f8b + : "ᾛ" # U1f9b + : "ᾫ" # U1fab + : "ᾃ" # U1f83 + : "ᾓ" # U1f93 + : "ᾣ" # U1fa3 + : "ᾌ" # U1f8c + : "ᾜ" # U1f9c + : "ᾬ" # U1fac + : "ᾄ" # U1f84 + : "ᾔ" # U1f94 + : "ᾤ" # U1fa4 + : "ᾍ" # U1f8d + : "ᾝ" # U1f9d + : "ᾭ" # U1fad + : "ᾅ" # U1f85 + : "ᾕ" # U1f95 + : "ᾥ" # U1fa5 + : "ᾎ" # U1f8e + : "ᾞ" # U1f9e + : "ᾮ" # U1fae + : "ᾆ" # U1f86 + : "ᾖ" # U1f96 + : "ᾦ" # U1fa6 + : "ᾏ" # U1f8f + : "ᾟ" # U1f9f + : "ᾯ" # U1faf + : "ᾇ" # U1f87 + : "ᾗ" # U1f97 + : "ᾧ" # U1fa7 + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾉ" # U1f89 + : "ᾙ" # U1f99 + : "ᾩ" # U1fa9 + : "ᾁ" # U1f81 + : "ᾑ" # U1f91 + : "ᾡ" # U1fa1 + : "ᾈ" # U1f88 + : "ᾘ" # U1f98 + : "ᾨ" # U1fa8 + : "ᾀ" # U1f80 + : "ᾐ" # U1f90 + : "ᾠ" # U1fa0 + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad : "ᾋ" # U1f8b : "ᾛ" # U1f9b : "ᾫ" # U1fab @@ -479,18 +906,6 @@ : "ᾂ" # U1f82 : "ᾒ" # U1f92 : "ᾢ" # U1fa2 - : "ᾌ" # U1f8c - : "ᾜ" # U1f9c - : "ᾬ" # U1fac - : "ᾄ" # U1f84 - : "ᾔ" # U1f94 - : "ᾤ" # U1fa4 - : "ᾍ" # U1f8d - : "ᾝ" # U1f9d - : "ᾭ" # U1fad - : "ᾅ" # U1f85 - : "ᾕ" # U1f95 - : "ᾥ" # U1fa5 : "ᾍ" # U1f8d : "ᾝ" # U1f9d : "ᾭ" # U1fad @@ -503,30 +918,6 @@ : "ᾄ" # U1f84 : "ᾔ" # U1f94 : "ᾤ" # U1fa4 - : "ᾆ" # U1f86 - : "ᾇ" # U1f87 - : "ᾎ" # U1f8e - : "ᾏ" # U1f8f - : "ᾖ" # U1f96 - : "ᾗ" # U1f97 - : "ᾞ" # U1f9e - : "ᾟ" # U1f9f - : "ᾦ" # U1fa6 - : "ᾧ" # U1fa7 - : "ᾮ" # U1fae - : "ᾯ" # U1faf - : "ᾎ" # U1f8e - : "ᾞ" # U1f9e - : "ᾮ" # U1fae - : "ᾆ" # U1f86 - : "ᾖ" # U1f96 - : "ᾦ" # U1fa6 - : "ᾏ" # U1f8f - : "ᾟ" # U1f9f - : "ᾯ" # U1faf - : "ᾇ" # U1f87 - : "ᾗ" # U1f97 - : "ᾧ" # U1fa7 : "ᾏ" # U1f8f : "ᾟ" # U1f9f : "ᾯ" # U1faf @@ -539,7 +930,6 @@ : "ᾆ" # U1f86 : "ᾖ" # U1f96 : "ᾦ" # U1fa6 - : "ͺ" # U37a : "ᾍ" # U1f8d : "ᾝ" # U1f9d : "ᾭ" # U1fad @@ -552,21 +942,6 @@ : "ᾄ" # U1f84 : "ᾔ" # U1f94 : "ᾤ" # U1fa4 - : "ᾴ" # U1fb4 - : "ῄ" # U1fc4 - : "ῴ" # U1ff4 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾬ" # U1fac - : "ᾭ" # U1fad : "ᾌ" # U1f8c : "ᾜ" # U1f9c : "ᾬ" # U1fac @@ -579,18 +954,6 @@ : "ᾅ" # U1f85 : "ᾕ" # U1f95 : "ᾥ" # U1fa5 - : "ᾉ" # U1f89 - : "ᾙ" # U1f99 - : "ᾩ" # U1fa9 - : "ᾁ" # U1f81 - : "ᾑ" # U1f91 - : "ᾡ" # U1fa1 - : "ᾈ" # U1f88 - : "ᾘ" # U1f98 - : "ᾨ" # U1fa8 - : "ᾀ" # U1f80 - : "ᾐ" # U1f90 - : "ᾠ" # U1fa0 : "ᾋ" # U1f8b : "ᾛ" # U1f9b : "ᾫ" # U1fab @@ -603,21 +966,6 @@ : "ᾂ" # U1f82 : "ᾒ" # U1f92 : "ᾢ" # U1fa2 - : "ᾲ" # U1fb2 - : "ῂ" # U1fc2 - : "ῲ" # U1ff2 - : "ᾂ" # U1f82 - : "ᾃ" # U1f83 - : "ᾊ" # U1f8a - : "ᾋ" # U1f8b - : "ᾒ" # U1f92 - : "ᾓ" # U1f93 - : "ᾚ" # U1f9a - : "ᾛ" # U1f9b - : "ᾢ" # U1fa2 - : "ᾣ" # U1fa3 - : "ᾪ" # U1faa - : "ᾫ" # U1fab : "ᾊ" # U1f8a : "ᾚ" # U1f9a : "ᾪ" # U1faa @@ -642,21 +990,6 @@ : "ᾆ" # U1f86 : "ᾖ" # U1f96 : "ᾦ" # U1fa6 - : "ᾷ" # U1fb7 - : "ῇ" # U1fc7 - : "ῷ" # U1ff7 - : "ᾆ" # U1f86 - : "ᾇ" # U1f87 - : "ᾎ" # U1f8e - : "ᾏ" # U1f8f - : "ᾖ" # U1f96 - : "ᾗ" # U1f97 - : "ᾞ" # U1f9e - : "ᾟ" # U1f9f - : "ᾦ" # U1fa6 - : "ᾧ" # U1fa7 - : "ᾮ" # U1fae - : "ᾯ" # U1faf : "ᾎ" # U1f8e : "ᾞ" # U1f9e : "ᾮ" # U1fae @@ -681,21 +1014,6 @@ : "ᾄ" # U1f84 : "ᾔ" # U1f94 : "ᾤ" # U1fa4 - : "ᾴ" # U1fb4 - : "ῄ" # U1fc4 - : "ῴ" # U1ff4 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾬ" # U1fac - : "ᾭ" # U1fad : "ᾌ" # U1f8c : "ᾜ" # U1f9c : "ᾬ" # U1fac @@ -708,620 +1026,3512 @@ : "ᾅ" # U1f85 : "ᾕ" # U1f95 : "ᾥ" # U1fa5 - : "̣" # U323 - : "⨥" # U2a25 - : "⨪" # U2a2a - : "⩦" # U2a66 - : "̣" # U323 - : "̣" # U323 - : "Ợ" # U1ee2 - : "Ự" # U1ef0 - : "ợ" # U1ee3 - : "ự" # U1ef1 - : "̉" # U309 - : "Ɓ" # U181 - : "Ƈ" # U187 - : "Ɗ" # U18a - : "Ƒ" # U191 - : "Ɠ" # U193 - : "Ƙ" # U198 - : "Ɱ" # U2c6e - : "Ɲ" # U19d - : "Ƥ" # U1a4 - : "Ƭ" # U1ac - : "Ʋ" # U1b2 - : "Ⱳ" # U2c72 - : "Ȥ" # U224 - : "ɓ" # U253 - : "ƈ" # U188 - : "ɗ" # U257 - : "ƒ" # U192 - : "ɠ" # U260 - : "ɦ" # U266 - : "ƙ" # U199 - : "ɱ" # U271 - : "ɲ" # U272 - : "ƥ" # U1a5 - : "ʠ" # U2a0 - : "ɼ" # U27c - : "ʂ" # U282 - : "ƭ" # U1ad - : "ʋ" # U28b - : "ⱳ" # U2c73 - : "ȥ" # U225 - : "̉" # U309 - : "ᶑ" # U1d91 - : "ɝ" # U25d - : "ʄ" # U284 - : "ɻ" # U27b - : "̉" # U309 - : "ϒ" # U3d2 - : "Ở" # U1ede - : "Ử" # U1eec - : "ở" # U1edf - : "ử" # U1eed - : "Ẳ" # U1eb2 - : "ẳ" # U1eb3 - : "Ẩ" # U1ea8 - : "Ể" # U1ec2 - : "Ổ" # U1ed4 - : "ẩ" # U1ea9 - : "ể" # U1ec3 - : "ổ" # U1ed5 - : "Ẳ" # U1eb2 - : "ẳ" # U1eb3 - : "̛" # U31b - : "̛" # U31b - : "̛" # U31b - : "/" # U2f - : "ƻ" # U1bb - : "Ⱥ" # U23a - : "Ƀ" # U243 - : "Ȼ" # U23b - : "Đ" # U110 - : "Ɇ" # U246 - : "Ǥ" # U1e4 - : "Ħ" # U126 - : "Ɨ" # U197 - : "Ɉ" # U248 - : "Ł" # U141 - : "Ø" # Ud8 - : "Ᵽ" # U2c63 - : "Ɍ" # U24c - : "Ŧ" # U166 - : "Ʉ" # U244 - : "Ɏ" # U24e - : "Ƶ" # U1b5 - : "ⱥ" # U2c65 - : "ƀ" # U180 - : "ȼ" # U23c - : "đ" # U111 - : "ɇ" # U247 - : "ǥ" # U1e5 - : "ħ" # U127 - : "ɨ" # U268 - : "ɉ" # U249 - : "ł" # U142 - : "ø" # Uf8 - : "ᵽ" # U1d7d - : "ɍ" # U24d - : "ŧ" # U167 - : "ʉ" # U289 - : "ɏ" # U24f - : "ƶ" # U1b6 - : "̸" # U338 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "ɟ" # U25f - : "ᵼ" # U1d7c - : "≰" # U2270 - : "≱" # U2271 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "ɟ" # U25f - : "/" # U2f - : "ϼ" # U3fc - : "⫰" # U2af0 - : "⨦" # U2a26 - : "⩷" # U2a77 - : "," # U2c - : "̦" # U326 - : "," # U2c - : "¤" # Ua4 - : "₳" # U20b3 - : "₱" # U20b1 - : "₡" # U20a1 - : "₯" # U20af - : "₠" # U20a0 - : "₣" # U20a3 - : "₲" # U20b2 - : "₴" # U20b4 - : "៛" # U17db - : "₭" # U20ad - : "₤" # U20a4 - : "ℳ" # U2133 - : "₦" # U20a6 - : "૱" # Uaf1 - : "₧" # U20a7 - : "₨" # U20a8 - : "$" # U24 - : "₮" # U20ae - : "圓" # U5713 - : "₩" # U20a9 - : "円" # U5186 - : "؋" # U60b - : "฿" # Ue3f - : "¢" # Ua2 - : "₫" # U20ab - : "€" # U20ac - : "ƒ" # U192 - : "₲" # U20b2 - : "₴" # U20b4 - : "﷼" # Ufdfc - : "₭" # U20ad - : "£" # Ua3 - : "₥" # U20a5 - : "₦" # U20a6 - : "௹" # Ubf9 - : "₰" # U20b0 - : "₢" # U20a2 - : "₪" # U20aa - : "৳" # U9f3 - : "元" # U5143 - : "₩" # U20a9 - : "¥" # Ua5 - : "¤" # Ua4 - : "₵" # U20b5 - : "৲" # U9f2 - : "₵" # U20b5 - : "৲" # U9f2 - : "₵" # U20b5 - : "₵" # U20b5 - : "¤" # Ua4 - : "µ" # Ub5 - : "Α" # U391 - : "Β" # U392 - : "Δ" # U394 - : "Ε" # U395 - : "Φ" # U3a6 - : "Γ" # U393 - : "Η" # U397 - : "Ι" # U399 - : "Θ" # U398 - : "Κ" # U39a - : "Λ" # U39b - : "Μ" # U39c - : "Ν" # U39d - : "Ο" # U39f - : "Π" # U3a0 - : "Χ" # U3a7 - : "Ρ" # U3a1 - : "Σ" # U3a3 - : "Τ" # U3a4 - : "Υ" # U3a5 - : "Ω" # U3a9 - : "Ξ" # U39e - : "Ψ" # U3a8 - : "Ζ" # U396 - : "α" # U3b1 - : "β" # U3b2 - : "δ" # U3b4 - : "ε" # U3b5 - : "φ" # U3c6 - : "γ" # U3b3 - : "η" # U3b7 - : "ι" # U3b9 - : "θ" # U3b8 - : "κ" # U3ba - : "λ" # U3bb - : "μ" # U3bc - : "ν" # U3bd - : "ο" # U3bf - : "π" # U3c0 - : "χ" # U3c7 - : "ρ" # U3c1 - : "σ" # U3c3 - : "τ" # U3c4 - : "υ" # U3c5 - : "ω" # U3c9 - : "ξ" # U3be - : "ψ" # U3c8 - : "ζ" # U3b6 - : "µ" # Ub5 - : "Ᾱ" # U1fb9 - : "Ῑ" # U1fd9 - : "Ῡ" # U1fe9 - : "ᾱ" # U1fb1 - : "ῑ" # U1fd1 - : "ῡ" # U1fe1 - : "ϒ" # U3d2 - : "ϼ" # U3fc - : "µ" # Ub5 - : " " # Ua0 - : "'" # U27 - : "˘" # U2d8 - : "¸" # Ub8 - : "~" # U7e - : " " # U2008 - : "ˇ" # U2c7 - : "^" # U5e - : "^" # U5e - : "`" # U60 - : "~" # U7e - : "¡" # Ua1 - : "Ợ" # U1ee2 - : "Ự" # U1ef0 - : "ợ" # U1ee3 - : "ự" # U1ef1 - : "‽" # U203d - : "Ạ" # U1ea0 - : "Ḅ" # U1e04 - : "Ḍ" # U1e0c - : "Ẹ" # U1eb8 - : "Ḥ" # U1e24 - : "Ị" # U1eca - : "Ḳ" # U1e32 - : "Ḷ" # U1e36 - : "Ṃ" # U1e42 - : "Ṇ" # U1e46 - : "Ọ" # U1ecc - : "¶" # Ub6 - : "Ṛ" # U1e5a - : "Ṣ" # U1e62 - : "Ṭ" # U1e6c - : "Ụ" # U1ee4 - : "Ṿ" # U1e7e - : "Ẉ" # U1e88 - : "Ỵ" # U1ef4 - : "Ẓ" # U1e92 - : "¦" # Ua6 - : "ạ" # U1ea1 - : "ḅ" # U1e05 - : "ḍ" # U1e0d - : "ẹ" # U1eb9 - : "ḥ" # U1e25 - : "ị" # U1ecb - : "ḳ" # U1e33 - : "ḷ" # U1e37 - : "ṃ" # U1e43 - : "ṇ" # U1e47 - : "ọ" # U1ecd - : "¶" # Ub6 - : "ṛ" # U1e5b - : "ṣ" # U1e63 - : "ṭ" # U1e6d - : "ụ" # U1ee5 - : "ṿ" # U1e7f - : "ẉ" # U1e89 - : "ỵ" # U1ef5 - : "ẓ" # U1e93 - : "Ợ" # U1ee2 - : "Ự" # U1ef0 - : "ợ" # U1ee3 - : "ự" # U1ef1 - : "¨" # Ua8 - : "̈́" # U344 - : "΅" # U385 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "„" # U201e - : "“" # U201c - : "”" # U201d - : "Ä" # Uc4 - : "Ë" # Ucb - : "Ḧ" # U1e26 - : "Ï" # Ucf - : "Ö" # Ud6 - : "Ü" # Udc - : "Ẅ" # U1e84 - : "Ẍ" # U1e8c - : "Ÿ" # U178 - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "ä" # Ue4 - : "ë" # Ueb - : "ḧ" # U1e27 - : "ï" # Uef - : "ö" # Uf6 - : "ẗ" # U1e97 - : "ü" # Ufc - : "ẅ" # U1e85 - : "ẍ" # U1e8d - : "ÿ" # Uff - : "Ṏ" # U1e4e - : "ṏ" # U1e4f - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "̈́" # U344 - : "Ṏ" # U1e4e - : "ṏ" # U1e4f - : "ϔ" # U3d4 - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "Ӛ" # U4da - : "ӛ" # U4db - : "Ӫ" # U4ea - : "ӫ" # U4eb - : "ї" # U457 - : "Ї" # U407 - : "ӓ" # U4d3 - : "ё" # U451 - : "ӥ" # U4e5 - : "ӧ" # U4e7 - : "ӱ" # U4f1 - : "ӝ" # U4dd - : "ӹ" # U4f9 - : "ӟ" # U4df - : "ӭ" # U4ed - : "ӵ" # U4f5 - : "Ӓ" # U4d2 - : "Ё" # U401 - : "Ӥ" # U4e4 - : "Ӧ" # U4e6 - : "Ӱ" # U4f0 - : "Ӝ" # U4dc - : "Ӹ" # U4f8 - : "Ӟ" # U4de - : "Ӭ" # U4ec - : "Ӵ" # U4f4 - : "Ϊ" # U3aa - : "Ϋ" # U3ab - : "ϊ" # U3ca - : "ϋ" # U3cb - : "̈́" # U344 - : "Ṏ" # U1e4e - : "ṏ" # U1e4f - : "Ṻ" # U1e7a - : "ṻ" # U1e7b - : "♯" # U266f - : "♫" # U266b - : "♬" # U266c - : "♭" # U266d - : "♪" # U266a - : "♮" # U266e - : "♩" # U2669 - : "‰" # U2030 - : "'" # U27 - : "΅" # U385 - : "Ḯ" # U1e2e - : "Ǘ" # U1d7 - : "ḯ" # U1e2f - : "ǘ" # U1d8 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "´" # Ub4 - : "Ἅ" # U1f0d - : "Ἕ" # U1f1d - : "Ἥ" # U1f2d - : "Ἵ" # U1f3d - : "Ὅ" # U1f4d - : "Ὕ" # U1f5d - : "Ὥ" # U1f6d - : "ἅ" # U1f05 - : "ἕ" # U1f15 - : "ἥ" # U1f25 - : "ἵ" # U1f35 - : "ὅ" # U1f45 - : "ὕ" # U1f55 - : "ὥ" # U1f65 - : "Ἄ" # U1f0c - : "Ἔ" # U1f1c - : "Ἤ" # U1f2c - : "Ἴ" # U1f3c - : "Ὄ" # U1f4c - : "Ὤ" # U1f6c - : "ἄ" # U1f04 - : "ἔ" # U1f14 - : "ἤ" # U1f24 - : "ἴ" # U1f34 - : "ὄ" # U1f44 - : "ὔ" # U1f54 - : "ὤ" # U1f64 - : "Ớ" # U1eda - : "Ứ" # U1ee8 - : "ớ" # U1edb - : "ứ" # U1ee9 - : "‚" # U201a - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "‘" # U2018 - : "’" # U2019 - : "Á" # Uc1 - : "Ć" # U106 - : "É" # Uc9 - : "Ǵ" # U1f4 - : "Í" # Ucd - : "Ḱ" # U1e30 - : "Ĺ" # U139 - : "Ḿ" # U1e3e - : "Ń" # U143 - : "Ó" # Ud3 - : "Ṕ" # U1e54 - : "Ŕ" # U154 - : "Ś" # U15a - : "Ú" # Uda - : "Ẃ" # U1e82 - : "Ý" # Udd - : "Ź" # U179 - : "Ấ" # U1ea4 - : "Ế" # U1ebe - : "Ố" # U1ed0 - : "ấ" # U1ea5 - : "ế" # U1ebf - : "ố" # U1ed1 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "á" # Ue1 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "ć" # U107 - : "é" # Ue9 - : "ǵ" # U1f5 - : "í" # Ued - : "ḱ" # U1e31 - : "ĺ" # U13a - : "ḿ" # U1e3f - : "ń" # U144 - : "ó" # Uf3 - : "ṕ" # U1e55 - : "ŕ" # U155 - : "ś" # U15b - : "ú" # Ufa - : "ẃ" # U1e83 - : "ý" # Ufd - : "ź" # U17a - : "Ṍ" # U1e4c - : "Ṹ" # U1e78 - : "ṍ" # U1e4d - : "ṹ" # U1e79 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ấ" # U1ea4 - : "Ǻ" # U1fa - : "Ǽ" # U1fc - : "Ḉ" # U1e08 - : "Ế" # U1ebe - : "Ḯ" # U1e2e - : "Ố" # U1ed0 - : "Ṍ" # U1e4c - : "Ǿ" # U1fe - : "Ǘ" # U1d7 - : "ấ" # U1ea5 - : "ǻ" # U1fb - : "ǽ" # U1fd - : "ḉ" # U1e09 - : "ế" # U1ebf - : "ḯ" # U1e2f - : "ố" # U1ed1 - : "ṍ" # U1e4d - : "ǿ" # U1ff - : "ǘ" # U1d8 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "Ḗ" # U1e16 - : "ḗ" # U1e17 - : "Ṓ" # U1e52 - : "Ṹ" # U1e78 - : "ṓ" # U1e53 - : "ṹ" # U1e79 - : "ѓ" # U453 - : "ќ" # U45c - : "Ѓ" # U403 - : "Ќ" # U40c - : "ΐ" # U390 - : "ΰ" # U3b0 - : "Ά" # U386 - : "Έ" # U388 - : "Ή" # U389 - : "Ί" # U38a - : "Ό" # U38c - : "Ύ" # U38e - : "Ώ" # U38f - : "ά" # U3ac - : "έ" # U3ad - : "ή" # U3ae - : "ί" # U3af - : "ό" # U3cc - : "ύ" # U3cd - : "ώ" # U3ce - : "ἄ" # U1f04 - : "ἅ" # U1f05 - : "Ἄ" # U1f0c - : "Ἅ" # U1f0d - : "ἔ" # U1f14 - : "ἕ" # U1f15 - : "Ἔ" # U1f1c - : "Ἕ" # U1f1d - : "ἤ" # U1f24 - : "ἥ" # U1f25 - : "Ἤ" # U1f2c - : "Ἥ" # U1f2d - : "ἴ" # U1f34 - : "ἵ" # U1f35 - : "Ἴ" # U1f3c - : "Ἵ" # U1f3d - : "ὄ" # U1f44 - : "ὅ" # U1f45 - : "Ὄ" # U1f4c - : "Ὅ" # U1f4d - : "ὔ" # U1f54 - : "ὕ" # U1f55 - : "Ὕ" # U1f5d - : "ὤ" # U1f64 - : "ὥ" # U1f65 - : "Ὤ" # U1f6c - : "Ὥ" # U1f6d - : "⍞" # U235e - : "Ấ" # U1ea4 - : "Ế" # U1ebe - : "Ố" # U1ed0 - : "ấ" # U1ea5 - : "ế" # U1ebf - : "ố" # U1ed1 - : "Ṍ" # U1e4c - : "Ṹ" # U1e78 - : "ṍ" # U1e4d - : "ṹ" # U1e79 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "Ḯ" # U1e2e - : "Ǘ" # U1d7 - : "ḯ" # U1e2f - : "ǘ" # U1d8 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "Ǻ" # U1fa - : "ǻ" # U1fb - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ớ" # U1eda - : "Ứ" # U1ee8 - : "ớ" # U1edb - : "ứ" # U1ee9 - : "Ἄ" # U1f0c - : "Ἔ" # U1f1c - : "Ἤ" # U1f2c - : "Ἴ" # U1f3c - : "Ὄ" # U1f4c - : "Ὤ" # U1f6c - : "ἄ" # U1f04 - : "ἔ" # U1f14 - : "ἤ" # U1f24 - : "ἴ" # U1f34 - : "ὄ" # U1f44 - : "ὔ" # U1f54 - : "ὤ" # U1f64 - : "Ἅ" # U1f0d - : "Ἕ" # U1f1d - : "Ἥ" # U1f2d - : "Ἵ" # U1f3d - : "Ὅ" # U1f4d - : "Ὕ" # U1f5d - : "Ὥ" # U1f6d - : "ἅ" # U1f05 - : "ἕ" # U1f15 - : "ἥ" # U1f25 - : "ἵ" # U1f35 - : "ὅ" # U1f45 - : "ὕ" # U1f55 - : "ὥ" # U1f65 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "˘" # U2d8 - : "[" # U5b - : "{" # U7b - : "⓪" # U24ea - : "①" # U2460 + : "ゔ" # U3094 + : "が" # U304c + : "ぎ" # U304e + : "ぐ" # U3050 + : "げ" # U3052 + : "ご" # U3054 + : "ざ" # U3056 + : "じ" # U3058 + : "ず" # U305a + : "ぜ" # U305c + : "ぞ" # U305e + : "だ" # U3060 + : "ぢ" # U3062 + : "づ" # U3065 + : "で" # U3067 + : "ど" # U3069 + : "ば" # U3070 + : "び" # U3073 + : "ぶ" # U3076 + : "べ" # U3079 + : "ぼ" # U307c + : "ゞ" # U309e + : "ヸ" # U30f8 + : "ヹ" # U30f9 + : "ヾ" # U30fe + : "ぱ" # U3071 + : "ぴ" # U3074 + : "ぷ" # U3077 + : "ぺ" # U307a + : "ぽ" # U307d + : "̣" # U323 + : "⨥" # U2a25 + : "⨪" # U2a2a + : "⩦" # U2a66 + : "̣" # U323 + : "̣" # U323 + : "Ợ" # U1ee2 + : "Ự" # U1ef0 + : "ợ" # U1ee3 + : "ự" # U1ef1 + : "̉" # U309 + : "Ɓ" # U181 + : "Ƈ" # U187 + : "Ɗ" # U18a + : "Ƒ" # U191 + : "Ɠ" # U193 + : "Ƙ" # U198 + : "Ɱ" # U2c6e + : "Ɲ" # U19d + : "Ƥ" # U1a4 + : "Ƭ" # U1ac + : "Ʋ" # U1b2 + : "Ⱳ" # U2c72 + : "Ȥ" # U224 + : "ɓ" # U253 + : "ƈ" # U188 + : "ɗ" # U257 + : "ƒ" # U192 + : "ɠ" # U260 + : "ɦ" # U266 + : "ƙ" # U199 + : "ɱ" # U271 + : "ɲ" # U272 + : "ƥ" # U1a5 + : "ʠ" # U2a0 + : "ɼ" # U27c + : "ʂ" # U282 + : "ƭ" # U1ad + : "ʋ" # U28b + : "ⱳ" # U2c73 + : "ȥ" # U225 + : "̉" # U309 + : "ᶑ" # U1d91 + : "ɝ" # U25d + : "ʄ" # U284 + : "ɻ" # U27b + : "̉" # U309 + : "ϒ" # U3d2 + : "Ở" # U1ede + : "Ử" # U1eec + : "ở" # U1edf + : "ử" # U1eed + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "̛" # U31b + : "̛" # U31b + : "̛" # U31b + : "/" # U2f + : "ƻ" # U1bb + : "≮" # U226e + : "≠" # U2260 + : "≯" # U226f + : "Ⱥ" # U23a + : "Ƀ" # U243 + : "Ȼ" # U23b + : "Đ" # U110 + : "Ɇ" # U246 + : "Ǥ" # U1e4 + : "Ħ" # U126 + : "Ɨ" # U197 + : "Ɉ" # U248 + : "Ł" # U141 + : "Ø" # Ud8 + : "Ᵽ" # U2c63 + : "Ɍ" # U24c + : "Ŧ" # U166 + : "Ʉ" # U244 + : "Ɏ" # U24e + : "Ƶ" # U1b5 + : "ⱥ" # U2c65 + : "ƀ" # U180 + : "ȼ" # U23c + : "đ" # U111 + : "ɇ" # U247 + : "ǥ" # U1e5 + : "ħ" # U127 + : "ɨ" # U268 + : "ɉ" # U249 + : "ł" # U142 + : "ø" # Uf8 + : "ᵽ" # U1d7d + : "ɍ" # U24d + : "ŧ" # U167 + : "ʉ" # U289 + : "ɏ" # U24f + : "ƶ" # U1b6 + : "̸" # U338 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "ɟ" # U25f + : "ᵼ" # U1d7c + : "≰" # U2270 + : "≱" # U2271 + : "/" # U2f + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "ɟ" # U25f + : "ϼ" # U3fc + : "Ѷ" # U476 + : "ѷ" # U477 + : "а̏" + : "е̏" + : "и̏" + : "о̏" + : "р̏" + : "у̏" + : "А̏" + : "Е̏" + : "И̏" + : "О̏" + : "Р̏" + : "У̏" + : "⫰" # U2af0 + : "⨦" # U2a26 + : "⩷" # U2a77 + : "Ȃ" # U202 + : "Ȇ" # U206 + : "Ȋ" # U20a + : "Ȏ" # U20e + : "Ȓ" # U212 + : "Ȗ" # U216 + : "ȃ" # U203 + : "ȇ" # U207 + : "ȋ" # U20b + : "ȏ" # U20f + : "ȓ" # U213 + : "ȗ" # U217 + : "а̑" + : "е̑" + : "и̑" + : "о̑" + : "р̑" + : "у̑" + : "А̑" + : "Е̑" + : "И̑" + : "О̑" + : "Р̑" + : "У̑" + : "," # U2c + : "̦" # U326 + : "," # U2c + : "¤" # Ua4 + : "₳" # U20b3 + : "₱" # U20b1 + : "₡" # U20a1 + : "₯" # U20af + : "₠" # U20a0 + : "₣" # U20a3 + : "₲" # U20b2 + : "₴" # U20b4 + : "៛" # U17db + : "₭" # U20ad + : "₤" # U20a4 + : "ℳ" # U2133 + : "₦" # U20a6 + : "૱" # Uaf1 + : "₧" # U20a7 + : "₨" # U20a8 + : "$" # U24 + : "₮" # U20ae + : "圓" # U5713 + : "₩" # U20a9 + : "円" # U5186 + : "؋" # U60b + : "฿" # Ue3f + : "¢" # Ua2 + : "₫" # U20ab + : "€" # U20ac + : "ƒ" # U192 + : "₲" # U20b2 + : "₴" # U20b4 + : "﷼" # Ufdfc + : "₭" # U20ad + : "£" # Ua3 + : "₥" # U20a5 + : "₦" # U20a6 + : "௹" # Ubf9 + : "₰" # U20b0 + : "₢" # U20a2 + : "₪" # U20aa + : "৳" # U9f3 + : "元" # U5143 + : "₩" # U20a9 + : "¥" # Ua5 + : "¤" # Ua4 + : "₵" # U20b5 + : "৲" # U9f2 + : "₵" # U20b5 + : "৲" # U9f2 + : "¤" # Ua4 + : "₵" # U20b5 + : "₵" # U20b5 + : "µ" # Ub5 + : "Α" # U391 + : "Β" # U392 + : "Δ" # U394 + : "Ε" # U395 + : "Φ" # U3a6 + : "Γ" # U393 + : "Η" # U397 + : "Ι" # U399 + : "Θ" # U398 + : "Κ" # U39a + : "Λ" # U39b + : "Μ" # U39c + : "Ν" # U39d + : "Ο" # U39f + : "Π" # U3a0 + : "Χ" # U3a7 + : "Ρ" # U3a1 + : "Σ" # U3a3 + : "Τ" # U3a4 + : "Υ" # U3a5 + : "Ω" # U3a9 + : "Ξ" # U39e + : "Ψ" # U3a8 + : "Ζ" # U396 + : "α" # U3b1 + : "β" # U3b2 + : "δ" # U3b4 + : "ε" # U3b5 + : "φ" # U3c6 + : "γ" # U3b3 + : "η" # U3b7 + : "ι" # U3b9 + : "θ" # U3b8 + : "κ" # U3ba + : "λ" # U3bb + : "μ" # U3bc + : "ν" # U3bd + : "ο" # U3bf + : "π" # U3c0 + : "χ" # U3c7 + : "ρ" # U3c1 + : "σ" # U3c3 + : "τ" # U3c4 + : "υ" # U3c5 + : "ω" # U3c9 + : "ξ" # U3be + : "ψ" # U3c8 + : "ζ" # U3b6 + : "µ" # Ub5 + : "µ" # Ub5 + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "ϒ" # U3d2 + : "ϼ" # U3fc + : " " # Ua0 + : "'" # U27 + : "˘" # U2d8 + : "¸" # Ub8 + : "~" # U7e + : " " # U2008 + : "ˇ" # U2c7 + : "^" # U5e + : "^" # U5e + : "`" # U60 + : "~" # U7e + : "¡" # Ua1 + : "‽" # U203d + : "Ạ" # U1ea0 + : "Ḅ" # U1e04 + : "Ḍ" # U1e0c + : "Ẹ" # U1eb8 + : "Ḥ" # U1e24 + : "Ị" # U1eca + : "Ḳ" # U1e32 + : "Ḷ" # U1e36 + : "Ṃ" # U1e42 + : "Ṇ" # U1e46 + : "Ọ" # U1ecc + : "Ṛ" # U1e5a + : "Ṣ" # U1e62 + : "Ṭ" # U1e6c + : "Ụ" # U1ee4 + : "Ṿ" # U1e7e + : "Ẉ" # U1e88 + : "Ỵ" # U1ef4 + : "Ẓ" # U1e92 + : "¦" # Ua6 + : "ạ" # U1ea1 + : "ḅ" # U1e05 + : "ḍ" # U1e0d + : "ẹ" # U1eb9 + : "ḥ" # U1e25 + : "ị" # U1ecb + : "ḳ" # U1e33 + : "ḷ" # U1e37 + : "ṃ" # U1e43 + : "ṇ" # U1e47 + : "ọ" # U1ecd + : "ṛ" # U1e5b + : "ṣ" # U1e63 + : "ṭ" # U1e6d + : "ụ" # U1ee5 + : "ṿ" # U1e7f + : "ẉ" # U1e89 + : "ỵ" # U1ef5 + : "ẓ" # U1e93 + : "¨" # Ua8 + : "̈́" # U344 + : "„" # U201e + : "“" # U201c + : "”" # U201d + : "Ä" # Uc4 + : "Ë" # Ucb + : "Ḧ" # U1e26 + : "Ï" # Ucf + : "Ö" # Ud6 + : "Ü" # Udc + : "Ẅ" # U1e84 + : "Ẍ" # U1e8c + : "Ÿ" # U178 + : "ä" # Ue4 + : "ë" # Ueb + : "ḧ" # U1e27 + : "ï" # Uef + : "ö" # Uf6 + : "ẗ" # U1e97 + : "ü" # Ufc + : "ẅ" # U1e85 + : "ẍ" # U1e8d + : "ÿ" # Uff + : "̈́" # U344 + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "ϔ" # U3d4 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ӛ" # U4da + : "ӛ" # U4db + : "Ӫ" # U4ea + : "ӫ" # U4eb + : "ї" # U457 + : "Ї" # U407 + : "ӓ" # U4d3 + : "ё" # U451 + : "ӥ" # U4e5 + : "ӧ" # U4e7 + : "ӱ" # U4f1 + : "ӝ" # U4dd + : "ӹ" # U4f9 + : "ӟ" # U4df + : "ӭ" # U4ed + : "ӵ" # U4f5 + : "Ӓ" # U4d2 + : "Ё" # U401 + : "Ӥ" # U4e4 + : "Ӧ" # U4e6 + : "Ӱ" # U4f0 + : "Ӝ" # U4dc + : "Ӹ" # U4f8 + : "Ӟ" # U4de + : "Ӭ" # U4ec + : "Ӵ" # U4f4 + : "Ϊ" # U3aa + : "Ϋ" # U3ab + : "ϊ" # U3ca + : "ϋ" # U3cb + : "̈́" # U344 + : "♯" # U266f + : "♫" # U266b + : "♬" # U266c + : "♭" # U266d + : "♪" # U266a + : "♮" # U266e + : "♩" # U2669 + : "‰" # U2030 + : "'" # U27 + : "´" # Ub4 + : "‚" # U201a + : "‘" # U2018 + : "’" # U2019 + : "Á" # Uc1 + : "Ć" # U106 + : "É" # Uc9 + : "Ǵ" # U1f4 + : "Í" # Ucd + : "J́" + : "Ḱ" # U1e30 + : "Ĺ" # U139 + : "Ḿ" # U1e3e + : "Ń" # U143 + : "Ó" # Ud3 + : "Ṕ" # U1e54 + : "Ŕ" # U154 + : "Ś" # U15a + : "Ú" # Uda + : "Ẃ" # U1e82 + : "Ý" # Udd + : "Ź" # U179 + : "á" # Ue1 + : "ć" # U107 + : "é" # Ue9 + : "ǵ" # U1f5 + : "í" # Ued + : "j́" + : "ḱ" # U1e31 + : "ĺ" # U13a + : "ḿ" # U1e3f + : "ń" # U144 + : "ó" # Uf3 + : "ṕ" # U1e55 + : "ŕ" # U155 + : "ś" # U15b + : "ú" # Ufa + : "ẃ" # U1e83 + : "ý" # Ufd + : "ź" # U17a + : "Ấ" # U1ea4 + : "Ǻ" # U1fa + : "Ǽ" # U1fc + : "Ḉ" # U1e08 + : "Ế" # U1ebe + : "Ḯ" # U1e2e + : "Ố" # U1ed0 + : "Ṍ" # U1e4c + : "Ǿ" # U1fe + : "Ǘ" # U1d7 + : "ấ" # U1ea5 + : "ǻ" # U1fb + : "ǽ" # U1fd + : "ḉ" # U1e09 + : "ế" # U1ebf + : "ḯ" # U1e2f + : "ố" # U1ed1 + : "ṍ" # U1e4d + : "ǿ" # U1ff + : "ǘ" # U1d8 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḗ" # U1e16 + : "ḗ" # U1e17 + : "Ṓ" # U1e52 + : "Ṹ" # U1e78 + : "ṓ" # U1e53 + : "ṹ" # U1e79 + : "ю́" + : "а́" + : "е́" + : "ѓ" # U453 + : "и́" + : "ќ" # U45c + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "Ѓ" # U403 + : "И́" + : "Ќ" # U40c + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ά" # U386 + : "Έ" # U388 + : "Ή" # U389 + : "Ί" # U38a + : "Ό" # U38c + : "Ύ" # U38e + : "Ώ" # U38f + : "ά" # U3ac + : "έ" # U3ad + : "ή" # U3ae + : "ί" # U3af + : "ό" # U3cc + : "ύ" # U3cd + : "ώ" # U3ce + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "⍞" # U235e + : "˘" # U2d8 + : "[" # U5b + : "{" # U7b + : "Ἁ" # U1f09 + : "Ἑ" # U1f19 + : "Ἡ" # U1f29 + : "Ἱ" # U1f39 + : "Ὁ" # U1f49 + : "Ῥ" # U1fec + : "Ὑ" # U1f59 + : "Ὡ" # U1f69 + : "ἁ" # U1f01 + : "ἑ" # U1f11 + : "ἡ" # U1f21 + : "ἱ" # U1f31 + : "ὁ" # U1f41 + : "ῥ" # U1fe5 + : "ὑ" # U1f51 + : "ὡ" # U1f61 + : "]" # U5d + : "}" # U7d + : "Ἀ" # U1f08 + : "Ἐ" # U1f18 + : "Ἠ" # U1f28 + : "Ἰ" # U1f38 + : "Ὀ" # U1f48 + : "Ὠ" # U1f68 + : "ἀ" # U1f00 + : "ἐ" # U1f10 + : "ἠ" # U1f20 + : "ἰ" # U1f30 + : "ὀ" # U1f40 + : "ῤ" # U1fe4 + : "ὐ" # U1f50 + : "ὠ" # U1f60 + : "°" # Ub0 + : "Å" # Uc5 + : "Ů" # U16e + : "å" # Ue5 + : "ů" # U16f + : "⍣" # U2363 + : "⍟" # U235f + : "#" # U23 + : "±" # Ub1 + : "Ơ" # U1a0 + : "Ư" # U1af + : "ơ" # U1a1 + : "ư" # U1b0 + : "¸" # Ub8 + : "„" # U201e + : "‚" # U201a + : "¸" # Ub8 + : "¬" # Uac + : "Ą" # U104 + : "Ç" # Uc7 + : "Ḑ" # U1e10 + : "Ę" # U118 + : "Ģ" # U122 + : "Ḩ" # U1e28 + : "Į" # U12e + : "Ķ" # U136 + : "Ļ" # U13b + : "Ņ" # U145 + : "Ǫ" # U1ea + : "Ŗ" # U156 + : "Ş" # U15e + : "Ţ" # U162 + : "Ų" # U172 + : "ą" # U105 + : "ç" # Ue7 + : "ḑ" # U1e11 + : "ę" # U119 + : "ģ" # U123 + : "ḩ" # U1e29 + : "į" # U12f + : "ķ" # U137 + : "ļ" # U13c + : "ņ" # U146 + : "ǫ" # U1eb + : "ŗ" # U157 + : "ş" # U15f + : "ţ" # U163 + : "ų" # U173 + : "~" # U7e + : "{" # U7b + : "}" # U7d + : "±" # Ub1 + : "¬" # Uac + : "⌿" # U233f + : "÷" # Uf7 + : "→" # U2192 + : "Ā" # U100 + : "Đ" # U110 + : "Ē" # U112 + : "Ī" # U12a + : "£" # Ua3 + : "Ō" # U14c + : "Ū" # U16a + : "¥" # Ua5 + : "⍀" # U2340 + : "¯" # Uaf + : "ā" # U101 + : "đ" # U111 + : "ē" # U113 + : "ī" # U12b + : "£" # Ua3 + : "ō" # U14d + : "ū" # U16b + : "¥" # Ua5 + : "⍏" # U234f + : "⍖" # U2356 + : "⊖" # U2296 + : "·" # Ub7 + : "…" # U2026 + : "∵" # U2235 + : "‹" # U2039 + : "•" # U2022 + : "›" # U203a + : "Ȧ" # U226 + : "Ḃ" # U1e02 + : "Ċ" # U10a + : "Ḋ" # U1e0a + : "Ė" # U116 + : "Ḟ" # U1e1e + : "Ġ" # U120 + : "Ḣ" # U1e22 + : "İ" # U130 + : "Ṁ" # U1e40 + : "Ṅ" # U1e44 + : "Ȯ" # U22e + : "Ṗ" # U1e56 + : "Ṙ" # U1e58 + : "Ṡ" # U1e60 + : "Ṫ" # U1e6a + : "Ẇ" # U1e86 + : "Ẋ" # U1e8a + : "Ẏ" # U1e8e + : "Ż" # U17b + : "·" # Ub7 + : "ȧ" # U227 + : "ḃ" # U1e03 + : "ċ" # U10b + : "ḋ" # U1e0b + : "ė" # U117 + : "ḟ" # U1e1f + : "ġ" # U121 + : "ḣ" # U1e23 + : "ı" # U131 + : "ṁ" # U1e41 + : "ṅ" # U1e45 + : "ȯ" # U22f + : "ṗ" # U1e57 + : "ṙ" # U1e59 + : "ṡ" # U1e61 + : "ṫ" # U1e6b + : "ẇ" # U1e87 + : "ẋ" # U1e8b + : "ẏ" # U1e8f + : "ż" # U17c + : "ẛ" # U1e9b + : "Ṥ" # U1e64 + : "Ṧ" # U1e66 + : "ṥ" # U1e65 + : "ṧ" # U1e67 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "⊙" # U2299 + : "⌿" # U233f + : "\\" # U5c + : "\\" # U5c + : "≠" # U2260 + : "₡" # U20a1 + : "Đ" # U110 + : "Ǥ" # U1e4 + : "Ħ" # U126 + : "Ɨ" # U197 + : "Ł" # U141 + : "Ø" # Ud8 + : "Ŧ" # U166 + : "Ƶ" # U1b5 + : "|" # U7c + : "ƀ" # U180 + : "¢" # Ua2 + : "đ" # U111 + : "ǥ" # U1e5 + : "ħ" # U127 + : "ɨ" # U268 + : "ł" # U142 + : "₥" # U20a5 + : "ø" # Uf8 + : "ŧ" # U167 + : "µ" # Ub5 + : "√" # U221a + : "ƶ" # U1b6 + : "ʡ" # U2a1 + : "Ұ" # U4b0 + : "ұ" # U4b1 + : "ғ" # U493 + : "ҟ" # U49f + : "Ғ" # U492 + : "Ҟ" # U49e + : "↚" # U219a + : "↛" # U219b + : "↮" # U21ae + : "⍁" # U2341 + : "°" # Ub0 + : "↉" # U2189 + : "⍬" # U236c + : "½" # Ubd + : "⅓" # U2153 + : "¼" # Ubc + : "⅕" # U2155 + : "⅙" # U2159 + : "⅐" # U2150 + : "⅛" # U215b + : "⅑" # U2151 + : "¹" # Ub9 + : "⅔" # U2154 + : "⅖" # U2156 + : "²" # Ub2 + : "¾" # Ube + : "⅗" # U2157 + : "⅜" # U215c + : "³" # Ub3 + : "⅘" # U2158 + : "⅚" # U215a + : "⅝" # U215d + : "⅞" # U215e + : "∞" # U221e + : "☹" # U2639 + : "☺" # U263a + : "÷" # Uf7 + : "∴" # U2234 + : "⍠" # U2360 + : "Ą" # U104 + : "Ę" # U118 + : "Į" # U12e + : "Ǫ" # U1ea + : "Ș" # U218 + : "Ț" # U21a + : "Ų" # U172 + : "⍮" # U236e + : "ą" # U105 + : "ę" # U119 + : "į" # U12f + : "ǫ" # U1eb + : "ș" # U219 + : "ț" # U21b + : "ų" # U173 + : "ˇ" # U2c7 + : "“" # U201c + : "‘" # U2018 + : "←" # U2190 + : "\\" # U5c + : "♥" # U2665 + : "«" # Uab + : "≤" # U2264 + : "⋄" # U22c4 + : "Č" # U10c + : "Ď" # U10e + : "Ě" # U11a + : "Ľ" # U13d + : "Ň" # U147 + : "Ř" # U158 + : "Š" # U160 + : "Ť" # U164 + : "Ž" # U17d + : "≤" # U2264 + : "č" # U10d + : "ď" # U10f + : "ě" # U11b + : "ľ" # U13e + : "ň" # U148 + : "ř" # U159 + : "š" # U161 + : "ť" # U165 + : "ž" # U17e + : "≮" # U226e + : "⍃" # U2343 + : "≠" # U2260 + : "⇒" # U21d2 + : "€" # U20ac + : "€" # U20ac + : "₤" # U20a4 + : "₦" # U20a6 + : "Ő" # U150 + : "₽" # U20bd + : "₹" # U20b9 + : "Ű" # U170 + : "₩" # U20a9 + : "¥" # Ua5 + : "≡" # U2261 + : "€" # U20ac + : "₫" # U20ab + : "€" # U20ac + : "ő" # U151 + : "₽" # U20bd + : "₹" # U20b9 + : "ű" # U171 + : "¥" # Ua5 + : "≠" # U2260 + : "ӳ" # U4f3 + : "₽" # U20bd + : "€" # U20ac + : "€" # U20ac + : "Ӳ" # U4f2 + : "₽" # U20bd + : "⌸" # U2338 + : "^" # U5e + : "”" # U201d + : "’" # U2019 + : "⋄" # U22c4 + : "≥" # U2265 + : "»" # Ubb + : "Â" # Uc2 + : "Ê" # Uca + : "Î" # Uce + : "Ô" # Ud4 + : "Û" # Udb + : "≥" # U2265 + : "â" # Ue2 + : "ê" # Uea + : "î" # Uee + : "ô" # Uf4 + : "û" # Ufb + : "⍩" # U2369 + : "≯" # U226f + : "⍄" # U2344 + : "⸘" # U2e18 + : "¿" # Ubf + : "Ả" # U1ea2 + : "Ẻ" # U1eba + : "Ỉ" # U1ec8 + : "Ỏ" # U1ece + : "Ủ" # U1ee6 + : "Ỷ" # U1ef6 + : "ả" # U1ea3 + : "ẻ" # U1ebb + : "ỉ" # U1ec9 + : "ỏ" # U1ecf + : "ủ" # U1ee7 + : "ỷ" # U1ef7 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "⍰" # U2370 + : "Ä" # Uc4 + : "Á" # Uc1 + : "Ă" # U102 + : "Å" # Uc5 + : "Ą" # U104 + : "Ā" # U100 + : "Ą" # U104 + : "Â" # Uc2 + : "Å" # Uc5 + : "Æ" # Uc6 + : "@" # U40 + : "Â" # Uc2 + : "Ā" # U100 + : "À" # Uc0 + : "Ã" # Uc3 + : "Ä" # Uc4 + : "Á" # Uc1 + : "Ḃ" # U1e02 + : "Ć" # U106 + : "Ç" # Uc7 + : "Ċ" # U10a + : "₡" # U20a1 + : "Č" # U10c + : "€" # U20ac + : "₠" # U20a0 + : "©" # Ua9 + : "©" # Ua9 + : "₢" # U20a2 + : "¢" # Ua2 + : "Ḑ" # U1e10 + : "Đ" # U110 + : "Ḋ" # U1e0a + : "Ď" # U10e + : "Ð" # Ud0 + : "Ë" # Ucb + : "É" # Uc9 + : "Ę" # U118 + : "Ē" # U112 + : "Ė" # U116 + : "Ę" # U118 + : "Ě" # U11a + : "€" # U20ac + : "Ê" # Uca + : "Ê" # Uca + : "Ē" # U112 + : "È" # Uc8 + : "Ë" # Ucb + : "É" # Uc9 + : "Ḟ" # U1e1e + : "🖕" # U1f595 + : "ffi" # Ufb03 + : "ffl" # Ufb04 + : "₣" # U20a3 + : "Ğ" # U11e + : "Ģ" # U122 + : "Ġ" # U120 + : ">" # U3e + : "Ğ" # U11e + : "Ğ" # U11e + : "Ḩ" # U1e28 + : "Ï" # Ucf + : "Í" # Ucd + : "Į" # U12e + : "Ī" # U12a + : "İ" # U130 + : "Į" # U12e + : "Î" # Uce + : "IJ" # U132 + : "Î" # Uce + : "Ī" # U12a + : "Ì" # Ucc + : "IJ" # U132 + : "Ĩ" # U128 + : "Ï" # Ucf + : "Í" # Ucd + : "J́" + : "J́" + : "Ķ" # U136 + : "Ĺ" # U139 + : "Ļ" # U13b + : "£" # Ua3 + : "Ł" # U141 + : "Ľ" # U13d + : "₤" # U20a4 + : "<" # U3c + : "|" # U7c + : "Ṁ" # U1e40 + : "Ń" # U143 + : "Ņ" # U145 + : "Ň" # U147 + : "₦" # U20a6 + : "Ŋ" # U14a + : "№" # U2116 + : "№" # U2116 + : "Ñ" # Ud1 + : "Ö" # Ud6 + : "Ó" # Ud3 + : "Ǫ" # U1ea + : "Ō" # U14c + : "Ø" # Ud8 + : "Ǫ" # U1ea + : "Ô" # Ud4 + : "Ⓐ" # U24b6 + : "©" # Ua9 + : "Œ" # U152 + : "®" # Uae + : "§" # Ua7 + : "¤" # Ua4 + : "Ô" # Ud4 + : "Ō" # U14c + : "Ò" # Ud2 + : "©" # Ua9 + : "®" # Uae + : "¤" # Ua4 + : "Õ" # Ud5 + : "Ö" # Ud6 + : "Ó" # Ud3 + : "¶" # Ub6 + : "Ṗ" # U1e56 + : "₽" # U20bd + : "¶" # Ub6 + : "₧" # U20a7 + : "Ŕ" # U154 + : "Ŗ" # U156 + : "Ř" # U158 + : "₹" # U20b9 + : "®" # Uae + : "®" # Uae + : "₨" # U20a8 + : "§" # Ua7 + : "Ś" # U15a + : "Ş" # U15e + : "Ṡ" # U1e60 + : "Ș" # U218 + : "Š" # U160 + : "℠" # U2120 + : "§" # Ua7 + : "ẞ" # U1e9e + : "℠" # U2120 + : "Ţ" # U162 + : "Ŧ" # U166 + : "Ṫ" # U1e6a + : "Ŧ" # U166 + : "Ț" # U21a + : "Ť" # U164 + : "Þ" # Ude + : "™" # U2122 + : "™" # U2122 + : "Ü" # Udc + : "Ú" # Uda + : "Ů" # U16e + : "Ų" # U172 + : "Ū" # U16a + : "Ų" # U172 + : "Û" # Udb + : "Ă" # U102 + : "Ĕ" # U114 + : "Ğ" # U11e + : "Ĭ" # U12c + : "Ŏ" # U14e + : "Ŭ" # U16c + : "Û" # Udb + : "Ū" # U16a + : "Ù" # Ud9 + : "ă" # U103 + : "ĕ" # U115 + : "ğ" # U11f + : "ĭ" # U12d + : "ŏ" # U14f + : "ŭ" # U16d + : "Ũ" # U168 + : "Ü" # Udc + : "Ú" # Uda + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ӑ" # U4d1 + : "ӗ" # U4d7 + : "й" # U439 + : "ў" # U45e + : "ӂ" # U4c2 + : "Ӑ" # U4d0 + : "Ӗ" # U4d6 + : "Й" # U419 + : "Ў" # U40e + : "Ӂ" # U4c1 + : "Ᾰ" # U1fb8 + : "Ῐ" # U1fd8 + : "Ῠ" # U1fe8 + : "ᾰ" # U1fb0 + : "ῐ" # U1fd0 + : "ῠ" # U1fe0 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "|" # U7c + : "₩" # U20a9 + : "Ŵ" # U174 + : "¤" # Ua4 + : "¤" # Ua4 + : "Ÿ" # U178 + : "Ý" # Udd + : "¥" # Ua5 + : "¥" # Ua5 + : "Ŷ" # U176 + : "Ÿ" # U178 + : "Ý" # Udd + : "Ź" # U179 + : "Ż" # U17b + : "Ž" # U17d + : "⌷" # U2337 + : "⍀" # U2340 + : "⍂" # U2342 + : "⍉" # U2349 + : "⌷" # U2337 + : "^" # U5e + : "⁽" # U207d + : "⁾" # U207e + : "⁺" # U207a + : "¯" # Uaf + : "·" # Ub7 + : "|" # U7c + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "Â" # Uc2 + : "Ĉ" # U108 + : "Ê" # Uca + : "Ĝ" # U11c + : "Ĥ" # U124 + : "Î" # Uce + : "Ĵ" # U134 + : "Ô" # Ud4 + : "Ŝ" # U15c + : "Û" # Udb + : "Ŵ" # U174 + : "Ŷ" # U176 + : "Ẑ" # U1e90 + : "â" # Ue2 + : "ĉ" # U109 + : "ê" # Uea + : "ĝ" # U11d + : "ĥ" # U125 + : "î" # Uee + : "ĵ" # U135 + : "ô" # Uf4 + : "ŝ" # U15d + : "û" # Ufb + : "ŵ" # U175 + : "ŷ" # U177 + : "ẑ" # U1e91 + : "↑" # U2191 + : "а̂" + : "е̂" + : "и̂" + : "о̂" + : "р̂" + : "у̂" + : "А̂" + : "Е̂" + : "И̂" + : "О̂" + : "Р̂" + : "У̂" + : "Ậ" # U1eac + : "ậ" # U1ead + : "Ệ" # U1ec6 + : "ệ" # U1ec7 + : "Ộ" # U1ed8 + : "ộ" # U1ed9 + : "⁻" # U207b + : "㆒" # U3192 + : "㆜" # U319c + : "㆔" # U3194 + : "㆖" # U3196 + : "㆘" # U3198 + : "㆛" # U319b + : "㆗" # U3197 + : "㆚" # U319a + : "㆓" # U3193 + : "㆟" # U319f + : "㆕" # U3195 + : "㆞" # U319e + : "㆝" # U319d + : "㆙" # U3199 + : "²" # Ub2 + : "⁺" # U207a + : "⁰" # U2070 + : "¹" # Ub9 + : "²" # Ub2 + : "³" # Ub3 + : "⁴" # U2074 + : "⁵" # U2075 + : "⁶" # U2076 + : "⁷" # U2077 + : "⁸" # U2078 + : "⁹" # U2079 + : "⁼" # U207c + : "⍘" # U2358 + : "₍" # U208d + : "₎" # U208e + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "≤" # U2264 + : "₌" # U208c + : "≥" # U2265 + : "Ā" # U100 + : "Ē" # U112 + : "Ḡ" # U1e20 + : "Ī" # U12a + : "Ō" # U14c + : "Ū" # U16a + : "Ȳ" # U232 + : "¯" # Uaf + : "¯" # Uaf + : "ā" # U101 + : "ē" # U113 + : "ḡ" # U1e21 + : "ī" # U12b + : "ō" # U14d + : "ū" # U16b + : "ȳ" # U233 + : "Ǟ" # U1de + : "Ǣ" # U1e2 + : "Ȭ" # U22c + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ǣ" # U1e3 + : "ȭ" # U22d + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "а̄" + : "е̄" + : "ӣ" # U4e3 + : "о̄" + : "р̄" + : "ӯ" # U4ef + : "А̄" + : "Е̄" + : "Ӣ" # U4e2 + : "О̄" + : "Р̄" + : "Ӯ" # U4ee + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c + : "ṝ" # U1e5d + : "⍙" # U2359 + : "⍷" # U2377 + : "₋" # U208b + : "⍛" # U235b + : "≢" # U2262 + : "⊆" # U2286 + : "⊇" # U2287 + : "⍊" # U234a + : "⍚" # U235a + : "⍸" # U2378 + : "⍹" # U2379 + : "⍶" # U2376 + : "⍜" # U235c + : "₂" # U2082 + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "`" # U60 + : "À" # Uc0 + : "È" # Uc8 + : "Ì" # Ucc + : "Ǹ" # U1f8 + : "Ò" # Ud2 + : "Ù" # Ud9 + : "Ẁ" # U1e80 + : "Ỳ" # U1ef2 + : "à" # Ue0 + : "è" # Ue8 + : "ì" # Uec + : "ǹ" # U1f9 + : "ò" # Uf2 + : "ù" # Uf9 + : "ẁ" # U1e81 + : "ỳ" # U1ef3 + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "Ǜ" # U1db + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "ǜ" # U1dc + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ḕ" # U1e14 + : "ḕ" # U1e15 + : "Ṑ" # U1e50 + : "ṑ" # U1e51 + : "а̀" + : "ѐ" # U450 + : "ѝ" # U45d + : "о̀" + : "р̀" + : "у̀" + : "А̀" + : "Ѐ" # U400 + : "Ѝ" # U40d + : "О̀" + : "Р̀" + : "У̀" + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ὰ" # U1fba + : "Ὲ" # U1fc8 + : "Ὴ" # U1fca + : "Ὶ" # U1fda + : "Ὸ" # U1ff8 + : "Ὺ" # U1fea + : "Ὼ" # U1ffa + : "ὰ" # U1f70 + : "ὲ" # U1f72 + : "ὴ" # U1f74 + : "ὶ" # U1f76 + : "ὸ" # U1f78 + : "ὺ" # U1f7a + : "ὼ" # U1f7c + : "ἂ" # U1f02 + : "ἃ" # U1f03 + : "Ἂ" # U1f0a + : "Ἃ" # U1f0b + : "ἒ" # U1f12 + : "ἓ" # U1f13 + : "Ἒ" # U1f1a + : "Ἓ" # U1f1b + : "ἢ" # U1f22 + : "ἣ" # U1f23 + : "Ἢ" # U1f2a + : "Ἣ" # U1f2b + : "ἲ" # U1f32 + : "ἳ" # U1f33 + : "Ἲ" # U1f3a + : "Ἳ" # U1f3b + : "ὂ" # U1f42 + : "ὃ" # U1f43 + : "Ὂ" # U1f4a + : "Ὃ" # U1f4b + : "ὒ" # U1f52 + : "ὓ" # U1f53 + : "Ὓ" # U1f5b + : "ὢ" # U1f62 + : "ὣ" # U1f63 + : "Ὢ" # U1f6a + : "Ὣ" # U1f6b + : "ä" # Ue4 + : "á" # Ue1 + : "ă" # U103 + : "å" # Ue5 + : "ą" # U105 + : "ā" # U101 + : "ą" # U105 + : "â" # Ue2 + : "â" # Ue2 + : "ā" # U101 + : "à" # Ue0 + : "å" # Ue5 + : "æ" # Ue6 + : "ã" # Ue3 + : "ä" # Ue4 + : "á" # Ue1 + : "ḃ" # U1e03 + : "Ă" # U102 + : "Ĕ" # U114 + : "Ğ" # U11e + : "Ĭ" # U12c + : "Ŏ" # U14e + : "Ŭ" # U16c + : "ă" # U103 + : "ĕ" # U115 + : "ğ" # U11f + : "ĭ" # U12d + : "ŏ" # U14f + : "ŭ" # U16d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ӑ" # U4d1 + : "ӗ" # U4d7 + : "й" # U439 + : "ў" # U45e + : "ӂ" # U4c2 + : "Ӑ" # U4d0 + : "Ӗ" # U4d6 + : "Й" # U419 + : "Ў" # U40e + : "Ӂ" # U4c1 + : "Ᾰ" # U1fb8 + : "Ῐ" # U1fd8 + : "Ῠ" # U1fe8 + : "ᾰ" # U1fb0 + : "ῐ" # U1fd0 + : "ῠ" # U1fe0 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "ć" # U107 + : "ç" # Ue7 + : "ċ" # U10b + : "¢" # Ua2 + : "č" # U10d + : "€" # U20ac + : "Ǎ" # U1cd + : "Č" # U10c + : "Ď" # U10e + : "Ě" # U11a + : "Ǧ" # U1e6 + : "Ȟ" # U21e + : "Ǐ" # U1cf + : "Ǩ" # U1e8 + : "Ľ" # U13d + : "Ň" # U147 + : "Ǒ" # U1d1 + : "Ř" # U158 + : "Š" # U160 + : "Ť" # U164 + : "Ǔ" # U1d3 + : "Ž" # U17d + : "ǎ" # U1ce + : "č" # U10d + : "ď" # U10f + : "ě" # U11b + : "ǧ" # U1e7 + : "ȟ" # U21f + : "ǐ" # U1d0 + : "ǰ" # U1f0 + : "ǩ" # U1e9 + : "ľ" # U13e + : "ň" # U148 + : "ǒ" # U1d2 + : "ř" # U159 + : "š" # U161 + : "ť" # U165 + : "ǔ" # U1d4 + : "ž" # U17e + : "¢" # Ua2 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "ḑ" # U1e11 + : "đ" # U111 + : "ḋ" # U1e0b + : "ď" # U10f + : "₫" # U20ab + : "ð" # Uf0 + : "⌀" # U2300 + : "ë" # Ueb + : "é" # Ue9 + : "ę" # U119 + : "ē" # U113 + : "ė" # U117 + : "ę" # U119 + : "ě" # U11b + : "€" # U20ac + : "ê" # Uea + : "ê" # Uea + : "ē" # U113 + : "è" # Ue8 + : "ə" # U259 + : "ë" # Ueb + : "é" # Ue9 + : "ḟ" # U1e1f + : "ſ" # U17f + : "ff" # Ufb00 + : "fi" # Ufb01 + : "fl" # Ufb02 + : "ſ" # U17f + : "ğ" # U11f + : "ģ" # U123 + : "ġ" # U121 + : "ğ" # U11f + : ">" # U3e + : "ğ" # U11f + : "ḩ" # U1e29 + : "ï" # Uef + : "í" # Ued + : "į" # U12f + : "ī" # U12b + : "ı" # U131 + : "į" # U12f + : "î" # Uee + : "î" # Uee + : "ī" # U12b + : "ì" # Uec + : "ij" # U133 + : "ĩ" # U129 + : "ï" # Uef + : "í" # Ued + : "j́" + : "j́" + : "ķ" # U137 + : "ĸ" # U138 + : "ĺ" # U13a + : "ļ" # U13c + : "£" # Ua3 + : "ł" # U142 + : "ľ" # U13e + : "<" # U3c + : "|" # U7c + : "ṁ" # U1e41 + : "₥" # U20a5 + : "µ" # Ub5 + : "ń" # U144 + : "ņ" # U146 + : "ň" # U148 + : "ŋ" # U14b + : "ñ" # Uf1 + : "ö" # Uf6 + : "ó" # Uf3 + : "ǫ" # U1eb + : "ō" # U14d + : "ø" # Uf8 + : "ǫ" # U1eb + : "ô" # Uf4 + : "Å" # Uc5 + : "©" # Ua9 + : "®" # Uae + : "Ů" # U16e + : "¤" # Ua4 + : "ô" # Uf4 + : "ō" # U14d + : "ò" # Uf2 + : "å" # Ue5 + : "©" # Ua9 + : "œ" # U153 + : "°" # Ub0 + : "®" # Uae + : "§" # Ua7 + : "ů" # U16f + : "ẘ" # U1e98 + : "¤" # Ua4 + : "ẙ" # U1e99 + : "õ" # Uf5 + : "ö" # Uf6 + : "ó" # Uf3 + : "¶" # Ub6 + : "ṗ" # U1e57 + : "₽" # U20bd + : "ŕ" # U155 + : "ŗ" # U157 + : "ř" # U159 + : "₹" # U20b9 + : "§" # Ua7 + : "ś" # U15b + : "ş" # U15f + : "ṡ" # U1e61 + : "ș" # U219 + : "š" # U161 + : "℠" # U2120 + : "℠" # U2120 + : "§" # Ua7 + : "ß" # Udf + : "ş" # U15f + : "ţ" # U163 + : "ŧ" # U167 + : "ṫ" # U1e6b + : "ŧ" # U167 + : "ț" # U21b + : "ť" # U165 + : "™" # U2122 + : "þ" # Ufe + : "™" # U2122 + : "ü" # Ufc + : "ú" # Ufa + : "ů" # U16f + : "ų" # U173 + : "ū" # U16b + : "µ" # Ub5 + : "ų" # U173 + : "û" # Ufb + : "Ă" # U102 + : "Ŭ" # U16c + : "û" # Ufb + : "ū" # U16b + : "ù" # Uf9 + : "ă" # U103 + : "ŭ" # U16d + : "ũ" # U169 + : "ü" # Ufc + : "ú" # Ufa + : "√" # U221a + : "Ǎ" # U1cd + : "Č" # U10c + : "Ď" # U10e + : "Ě" # U11a + : "Ǧ" # U1e6 + : "Ȟ" # U21e + : "Ǐ" # U1cf + : "Ǩ" # U1e8 + : "Ň" # U147 + : "Ǒ" # U1d1 + : "Ř" # U158 + : "Š" # U160 + : "Ť" # U164 + : "Ǔ" # U1d3 + : "Ž" # U17d + : "ǎ" # U1ce + : "č" # U10d + : "ď" # U10f + : "ě" # U11b + : "ǧ" # U1e7 + : "ȟ" # U21f + : "ǐ" # U1d0 + : "ǰ" # U1f0 + : "ǩ" # U1e9 + : "|" # U7c + : "ň" # U148 + : "ǒ" # U1d2 + : "ř" # U159 + : "š" # U161 + : "ť" # U165 + : "ǔ" # U1d4 + : "ž" # U17e + : "↓" # U2193 + : "ŵ" # U175 + : "¤" # Ua4 + : "¤" # Ua4 + : "×" # Ud7 + : "ÿ" # Uff + : "ý" # Ufd + : "¥" # Ua5 + : "¥" # Ua5 + : "ŷ" # U177 + : "ÿ" # Uff + : "ý" # Ufd + : "ź" # U17a + : "ż" # U17c + : "ž" # U17e + : "∅" # U2205 + : "¢" # Ua2 + : "↑" # U2191 + : "¢" # Ua2 + : "↓" # U2193 + : "⍭" # U236d + : "⍅" # U2345 + : "⍆" # U2346 + : "⍋" # U234b + : "⍒" # U2352 + : "⍦" # U2366 + : "⍧" # U2367 + : "⌽" # U233d + : "~" # U7e + : "⍬" # U236c + : "Ã" # Uc3 + : "Ẽ" # U1ebc + : "Ĩ" # U128 + : "Ñ" # Ud1 + : "Õ" # Ud5 + : "Ũ" # U168 + : "Ṽ" # U1e7c + : "Ỹ" # U1ef8 + : "ã" # Ue3 + : "ẽ" # U1ebd + : "ĩ" # U129 + : "ñ" # Uf1 + : "õ" # Uf5 + : "ũ" # U169 + : "ṽ" # U1e7d + : "ỹ" # U1ef9 + : "⍭" # U236d + : "≈" # U2248 + : "⍨" # U2368 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "ᾶ" # U1fb6 + : "ῆ" # U1fc6 + : "ῖ" # U1fd6 + : "ῦ" # U1fe6 + : "ῶ" # U1ff6 + : "ἆ" # U1f06 + : "ἇ" # U1f07 + : "Ἆ" # U1f0e + : "Ἇ" # U1f0f + : "ἦ" # U1f26 + : "ἧ" # U1f27 + : "Ἦ" # U1f2e + : "Ἧ" # U1f2f + : "ἶ" # U1f36 + : "ἷ" # U1f37 + : "Ἶ" # U1f3e + : "Ἷ" # U1f3f + : "ὖ" # U1f56 + : "ὗ" # U1f57 + : "Ὗ" # U1f5f + : "ὦ" # U1f66 + : "ὧ" # U1f67 + : "Ὦ" # U1f6e + : "Ὧ" # U1f6f + : "⍫" # U236b + : "⍲" # U2372 + : "⍱" # U2371 + : "΅" # U385 + : "⍣" # U2363 + : "⍩" # U2369 + : "Ä" # Uc4 + : "Ë" # Ucb + : "Ï" # Ucf + : "Ö" # Ud6 + : "Ü" # Udc + : "Ÿ" # U178 + : "῭" # U1fed + : "ä" # Ue4 + : "ë" # Ueb + : "ï" # Uef + : "ö" # Uf6 + : "ü" # Ufc + : "ÿ" # Uff + : "῁" # U1fc1 + : "΅" # U385 + : "⍢" # U2362 + : "⍤" # U2364 + : "⍡" # U2361 + : "⍥" # U2365 + : "῭" # U1fed + : "΅" # U385 + : "῁" # U1fc1 + : "Ā" # U100 + : "Ē" # U112 + : "Ḡ" # U1e20 + : "Ī" # U12a + : "Ō" # U14c + : "Ū" # U16a + : "Ȳ" # U232 + : "ā" # U101 + : "ē" # U113 + : "ḡ" # U1e21 + : "ī" # U12b + : "ō" # U14d + : "ū" # U16b + : "ȳ" # U233 + : "Ǟ" # U1de + : "Ǣ" # U1e2 + : "Ȭ" # U22c + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ǣ" # U1e3 + : "ȭ" # U22d + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "а̄" + : "е̄" + : "ӣ" # U4e3 + : "о̄" + : "р̄" + : "ӯ" # U4ef + : "А̄" + : "Е̄" + : "Ӣ" # U4e2 + : "О̄" + : "Р̄" + : "Ӯ" # U4ee + : "Ᾱ" # U1fb9 + : "Ῑ" # U1fd9 + : "Ῡ" # U1fe9 + : "ᾱ" # U1fb1 + : "ῑ" # U1fd1 + : "ῡ" # U1fe1 + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c + : "ṝ" # U1e5d + : "⍑" # U2351 + : "Á" # Uc1 + : "Ć" # U106 + : "É" # Uc9 + : "Ǵ" # U1f4 + : "Í" # Ucd + : "J́" + : "Ḱ" # U1e30 + : "Ĺ" # U139 + : "Ḿ" # U1e3e + : "Ń" # U143 + : "Ó" # Ud3 + : "Ṕ" # U1e54 + : "Ŕ" # U154 + : "Ś" # U15a + : "Ú" # Uda + : "Ẃ" # U1e82 + : "Ý" # Udd + : "Ź" # U179 + : "á" # Ue1 + : "ć" # U107 + : "é" # Ue9 + : "ǵ" # U1f5 + : "í" # Ued + : "j́" + : "ḱ" # U1e31 + : "ĺ" # U13a + : "ḿ" # U1e3f + : "ń" # U144 + : "ó" # Uf3 + : "ṕ" # U1e55 + : "ŕ" # U155 + : "ś" # U15b + : "ú" # Ufa + : "ẃ" # U1e83 + : "ý" # Ufd + : "ź" # U17a + : "Ấ" # U1ea4 + : "Ǻ" # U1fa + : "Ǽ" # U1fc + : "Ḉ" # U1e08 + : "Ế" # U1ebe + : "Ḯ" # U1e2e + : "Ố" # U1ed0 + : "Ṍ" # U1e4c + : "Ǿ" # U1fe + : "Ǘ" # U1d7 + : "ấ" # U1ea5 + : "ǻ" # U1fb + : "ǽ" # U1fd + : "ḉ" # U1e09 + : "ế" # U1ebf + : "ḯ" # U1e2f + : "ố" # U1ed1 + : "ṍ" # U1e4d + : "ǿ" # U1ff + : "ǘ" # U1d8 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḗ" # U1e16 + : "ḗ" # U1e17 + : "Ṓ" # U1e52 + : "Ṹ" # U1e78 + : "ṓ" # U1e53 + : "ṹ" # U1e79 + : "ю́" + : "а́" + : "е́" + : "ѓ" # U453 + : "и́" + : "ќ" # U45c + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "Ѓ" # U403 + : "И́" + : "Ќ" # U40c + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ά" # U386 + : "Έ" # U388 + : "Ή" # U389 + : "Ί" # U38a + : "Ό" # U38c + : "Ύ" # U38e + : "Ώ" # U38f + : "ά" # U3ac + : "έ" # U3ad + : "ή" # U3ae + : "ί" # U3af + : "ό" # U3cc + : "ύ" # U3cd + : "ώ" # U3ce + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "Ç" # Uc7 + : "Ḑ" # U1e10 + : "Ȩ" # U228 + : "Ģ" # U122 + : "Ḩ" # U1e28 + : "Ķ" # U136 + : "Ļ" # U13b + : "Ņ" # U145 + : "Ŗ" # U156 + : "Ş" # U15e + : "Ţ" # U162 + : "ç" # Ue7 + : "ḑ" # U1e11 + : "ȩ" # U229 + : "ģ" # U123 + : "ḩ" # U1e29 + : "ķ" # U137 + : "ļ" # U13c + : "ņ" # U146 + : "ŗ" # U157 + : "ş" # U15f + : "ţ" # U163 + : "⌹" # U2339 + : "Ğ" # U11e + : "ğ" # U11f + : "יִ" # Ufb1d + : "ײַ" # Ufb1f + : "אַ" # Ufb2e + : "אָ" # Ufb2f + : "וֹ" # Ufb4b + : "אּ" # Ufb30 + : "בּ" # Ufb31 + : "גּ" # Ufb32 + : "דּ" # Ufb33 + : "הּ" # Ufb34 + : "וּ" # Ufb35 + : "זּ" # Ufb36 + : "טּ" # Ufb38 + : "יּ" # Ufb39 + : "ךּ" # Ufb3a + : "כּ" # Ufb3b + : "לּ" # Ufb3c + : "מּ" # Ufb3e + : "נּ" # Ufb40 + : "סּ" # Ufb41 + : "ףּ" # Ufb43 + : "פּ" # Ufb44 + : "צּ" # Ufb46 + : "קּ" # Ufb47 + : "רּ" # Ufb48 + : "שּ" # Ufb49 + : "תּ" # Ufb4a + : "בֿ" # Ufb4c + : "כֿ" # Ufb4d + : "פֿ" # Ufb4e + : "שׁ" # Ufb2a + : "שּׁ" # Ufb2c + : "שׂ" # Ufb2b + : "שּׂ" # Ufb2d + : "آ" # U622 + : "أ" # U623 + : "ؤ" # U624 + : "ئ" # U626 + : "ۂ" # U6c2 + : "ۓ" # U6d3 + : "ۀ" # U6c0 + : "إ" # U625 + : "§" # Ua7 + : "₽" # U20bd + : "€" # U20ac + : "№" # U2116 + : "№" # U2116 + : "€" # U20ac + : "₽" # U20bd + : "Ά" # U386 + : "Έ" # U388 + : "Ή" # U389 + : "Ϊ" # U3aa + : "Ί" # U38a + : "Ό" # U38c + : "Ϋ" # U3ab + : "Ύ" # U38e + : "Ώ" # U38f + : "ά" # U3ac + : "έ" # U3ad + : "ή" # U3ae + : "ϊ" # U3ca + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾼ" # U1fbc + : "ῌ" # U1fcc + : "ῼ" # U1ffc + : "ᾳ" # U1fb3 + : "ῃ" # U1fc3 + : "ῳ" # U1ff3 + : "ᾀ" # U1f80 + : "ᾁ" # U1f81 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾈ" # U1f88 + : "ᾉ" # U1f89 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾐ" # U1f90 + : "ᾑ" # U1f91 + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾘ" # U1f98 + : "ᾙ" # U1f99 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾠ" # U1fa0 + : "ᾡ" # U1fa1 + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾨ" # U1fa8 + : "ᾩ" # U1fa9 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ό" # U3cc + : "ϋ" # U3cb + : "ύ" # U3cd + : "ώ" # U3ce + : "≰" # U2270 + : "≱" # U2271 + : "≇" # U2247 + : "≢" # U2262 + : "⊄" # U2284 + : "⊅" # U2285 + : "क़" # U958 + : "ख़" # U959 + : "ग़" # U95a + : "ज़" # U95b + : "ड़" # U95c + : "ढ़" # U95d + : "ऩ" # U929 + : "फ़" # U95e + : "य़" # U95f + : "ऱ" # U931 + : "ऴ" # U934 + : "ড়" # U9dc + : "ঢ়" # U9dd + : "য়" # U9df + : "ো" # U9cb + : "ৌ" # U9cc + : "ਖ਼" # Ua59 + : "ਗ਼" # Ua5a + : "ਜ਼" # Ua5b + : "ਫ਼" # Ua5e + : "ਲ਼" # Ua33 + : "ਸ਼" # Ua36 + : "ଡ଼" # Ub5c + : "ଢ଼" # Ub5d + : "ୋ" # Ub4b + : "ୈ" # Ub48 + : "ୌ" # Ub4c + : "≮" # U226e + : "≯" # U226f + : "₍" # U208d + : "₎" # U208e + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "ொ" # Ubca + : "ௌ" # Ubcc + : "₋" # U208b + : "₂" # U2082 + : "₊" # U208a + : "₀" # U2080 + : "₁" # U2081 + : "₂" # U2082 + : "₃" # U2083 + : "₄" # U2084 + : "₅" # U2085 + : "₆" # U2086 + : "₇" # U2087 + : "₈" # U2088 + : "₉" # U2089 + : "₌" # U208c + : "ோ" # Ubcb + : "ஔ" # Ub94 + : "⊅" # U2285 + : "⊄" # U2284 + : "⊬" # U22ac + : "ై" # Uc48 + : "ೀ" # Ucc0 + : "ೊ" # Ucca + : "ೇ" # Ucc7 + : "ೈ" # Ucc8 + : "ೋ" # Uccb + : "ൊ" # Ud4a + : "ൌ" # Ud4c + : "ോ" # Ud4b + : "ේ" # Udda + : "ො" # Uddc + : "ෞ" # Udde + : "ෝ" # Uddd + : "ཱི" # Uf73 + : "ཱུ" # Uf75 + : "ཱྀ" # Uf81 + : "ྐྵ" # Ufb9 + : "ྒྷ" # Uf93 + : "ྜྷ" # Uf9d + : "ྡྷ" # Ufa2 + : "ྦྷ" # Ufa7 + : "ྫྷ" # Ufac + : "ྲྀ" # Uf76 + : "ླྀ" # Uf78 + : "ཀྵ" # Uf69 + : "གྷ" # Uf43 + : "ཌྷ" # Uf4d + : "དྷ" # Uf52 + : "བྷ" # Uf57 + : "ཛྷ" # Uf5c + : "ဦ" # U1026 + : "ᄁ" # U1101 + : "ᄓ" # U1113 + : "ᄔ" # U1114 + : "ᄕ" # U1115 + : "ᄖ" # U1116 + : "ᄗ" # U1117 + : "ᄄ" # U1104 + : "ᄘ" # U1118 + : "ᄙ" # U1119 + : "ᄛ" # U111b + : "ᄚ" # U111a + : "ᄜ" # U111c + : "ᄝ" # U111d + : "ᄞ" # U111e + : "ᄟ" # U111f + : "ᄠ" # U1120 + : "ᄈ" # U1108 + : "ᄡ" # U1121 + : "ᄥ" # U1125 + : "ᄫ" # U112b + : "ᄧ" # U1127 + : "ᄨ" # U1128 + : "ᄩ" # U1129 + : "ᄪ" # U112a + : "ᄬ" # U112c + : "ᄢ" # U1122 + : "ᄣ" # U1123 + : "ᄤ" # U1124 + : "ᄦ" # U1126 + : "ᄬ" # U112c + : "ᄭ" # U112d + : "ᄮ" # U112e + : "ᄯ" # U112f + : "ᄰ" # U1130 + : "ᄱ" # U1131 + : "ᄲ" # U1132 + : "ᄊ" # U110a + : "ᄴ" # U1134 + : "ᄵ" # U1135 + : "ᄶ" # U1136 + : "ᄷ" # U1137 + : "ᄸ" # U1138 + : "ᄹ" # U1139 + : "ᄺ" # U113a + : "ᄻ" # U113b + : "ᄳ" # U1133 + : "ᄴ" # U1134 + : "ᅁ" # U1141 + : "ᅂ" # U1142 + : "ᅃ" # U1143 + : "ᅄ" # U1144 + : "ᅅ" # U1145 + : "ᅇ" # U1147 + : "ᅈ" # U1148 + : "ᅉ" # U1149 + : "ᅊ" # U114a + : "ᅋ" # U114b + : "ᅆ" # U1146 + : "ᅍ" # U114d + : "ᄍ" # U110d + : "ᅒ" # U1152 + : "ᅓ" # U1153 + : "ᅖ" # U1156 + : "ᅗ" # U1157 + : "ᅘ" # U1158 + : "ᄢ" # U1122 + : "ᄣ" # U1123 + : "ᄤ" # U1124 + : "ᄥ" # U1125 + : "ᄦ" # U1126 + : "ᄳ" # U1133 + : "ᄽ" # U113d + : "ᄿ" # U113f + : "ᅏ" # U114f + : "ᅑ" # U1151 + : "ᅶ" # U1176 + : "ᅷ" # U1177 + : "ᅢ" # U1162 + : "ᅸ" # U1178 + : "ᅹ" # U1179 + : "ᅤ" # U1164 + : "ᅺ" # U117a + : "ᅻ" # U117b + : "ᅼ" # U117c + : "ᅦ" # U1166 + : "ᅽ" # U117d + : "ᅾ" # U117e + : "ᅨ" # U1168 + : "ᅪ" # U116a + : "ᅫ" # U116b + : "ᅿ" # U117f + : "ᆀ" # U1180 + : "ᆁ" # U1181 + : "ᆂ" # U1182 + : "ᆃ" # U1183 + : "ᅬ" # U116c + : "ᅫ" # U116b + : "ᆄ" # U1184 + : "ᆅ" # U1185 + : "ᆆ" # U1186 + : "ᆇ" # U1187 + : "ᆈ" # U1188 + : "ᆉ" # U1189 + : "ᆊ" # U118a + : "ᅯ" # U116f + : "ᅰ" # U1170 + : "ᆌ" # U118c + : "ᆍ" # U118d + : "ᅱ" # U1171 + : "ᆋ" # U118b + : "ᆋ" # U118b + : "ᅰ" # U1170 + : "ᆎ" # U118e + : "ᆏ" # U118f + : "ᆐ" # U1190 + : "ᆑ" # U1191 + : "ᆒ" # U1192 + : "ᆓ" # U1193 + : "ᆔ" # U1194 + : "ᆕ" # U1195 + : "ᆖ" # U1196 + : "ᅴ" # U1174 + : "ᆗ" # U1197 + : "ᆘ" # U1198 + : "ᆙ" # U1199 + : "ᆚ" # U119a + : "ᆛ" # U119b + : "ᆜ" # U119c + : "ᆝ" # U119d + : "ᆟ" # U119f + : "ᆠ" # U11a0 + : "ᆡ" # U11a1 + : "ᆢ" # U11a2 + : "ᆩ" # U11a9 + : "ᇃ" # U11c3 + : "ᆪ" # U11aa + : "ᇄ" # U11c4 + : "ᇄ" # U11c4 + : "ᇅ" # U11c5 + : "ᇆ" # U11c6 + : "ᇇ" # U11c7 + : "ᆬ" # U11ac + : "ᇉ" # U11c9 + : "ᆭ" # U11ad + : "ᇈ" # U11c8 + : "ᇊ" # U11ca + : "ᇋ" # U11cb + : "ᆰ" # U11b0 + : "ᇌ" # U11cc + : "ᇍ" # U11cd + : "ᇎ" # U11ce + : "ᇐ" # U11d0 + : "ᆱ" # U11b1 + : "ᆲ" # U11b2 + : "ᇓ" # U11d3 + : "ᆳ" # U11b3 + : "ᇖ" # U11d6 + : "ᇘ" # U11d8 + : "ᆴ" # U11b4 + : "ᆵ" # U11b5 + : "ᆶ" # U11b6 + : "ᇑ" # U11d1 + : "ᇒ" # U11d2 + : "ᇔ" # U11d4 + : "ᇕ" # U11d5 + : "ᇗ" # U11d7 + : "ᇙ" # U11d9 + : "ᇌ" # U11cc + : "ᇑ" # U11d1 + : "ᇒ" # U11d2 + : "ᇓ" # U11d3 + : "ᇕ" # U11d5 + : "ᇔ" # U11d4 + : "ᇖ" # U11d6 + : "ᇚ" # U11da + : "ᇛ" # U11db + : "ᇜ" # U11dc + : "ᇝ" # U11dd + : "ᇞ" # U11de + : "ᇢ" # U11e2 + : "ᇠ" # U11e0 + : "ᇡ" # U11e1 + : "ᇟ" # U11df + : "ᇣ" # U11e3 + : "ᆹ" # U11b9 + : "ᇦ" # U11e6 + : "ᇤ" # U11e4 + : "ᇥ" # U11e5 + : "ᇧ" # U11e7 + : "ᇨ" # U11e8 + : "ᇩ" # U11e9 + : "ᇪ" # U11ea + : "ᆻ" # U11bb + : "ᇬ" # U11ec + : "ᇭ" # U11ed + : "ᇮ" # U11ee + : "ᇯ" # U11ef + : "ᇳ" # U11f3 + : "ᇴ" # U11f4 + : "ᇵ" # U11f5 + : "ᇶ" # U11f6 + : "ᇷ" # U11f7 + : "ᇸ" # U11f8 + : "ᇏ" # U11cf + : "ᇞ" # U11de + : "ᇭ" # U11ed + : "ᇱ" # U11f1 + : "ᇲ" # U11f2 + : "῎" # U1fce + : "῍" # U1fcd + : "῏" # U1fcf + : "῎" # U1fce + : "῍" # U1fcd + : "῎" # U1fce + : "῏" # U1fcf + : "῞" # U1fde + : "῝" # U1fdd + : "῟" # U1fdf + : "῞" # U1fde + : "῝" # U1fdd + : "῞" # U1fde + : "῟" # U1fdf + : "⍅" # U2345 + : "⍇" # U2347 + : "⍏" # U234f + : "⍐" # U2350 + : "⍆" # U2346 + : "⍈" # U2348 + : "⍖" # U2356 + : "⍗" # U2357 + : "∄" # U2204 + : "⍙" # U2359 + : "⍋" # U234b + : "⍍" # U234d + : "⍒" # U2352 + : "⍫" # U236b + : "⍢" # U2362 + : "⍔" # U2354 + : "∉" # U2209 + : "⍷" # U2377 + : "∌" # U220c + : "⍛" # U235b + : "⍤" # U2364 + : "⍝" # U235d + : "⍕" # U2355 + : "⍎" # U234e + : "⌻" # U233b + : "⌾" # U233e + : "∤" # U2224 + : "∦" # U2226 + : "⍲" # U2372 + : "⋄" # U22c4 + : "⍓" # U2353 + : "⍱" # U2371 + : "⋄" # U22c4 + : "⍌" # U234c + : "⍝" # U235d + : "⍦" # U2366 + : "≁" # U2241 + : "≄" # U2244 + : "≉" # U2249 + : "≭" # U226d + : "≢" # U2262 + : "⍯" # U236f + : "≴" # U2274 + : "≵" # U2275 + : "≸" # U2278 + : "≹" # U2279 + : "⊀" # U2280 + : "⊁" # U2281 + : "⋠" # U22e0 + : "⋡" # U22e1 + : "⊆" # U2286 + : "⍧" # U2367 + : "⊇" # U2287 + : "⊈" # U2288 + : "⊉" # U2289 + : "⋢" # U22e2 + : "⋣" # U22e3 + : "⍡" # U2361 + : "⍑" # U2351 + : "⍕" # U2355 + : "⌶" # U2336 + : "⍊" # U234a + : "⍎" # U234e + : "⌶" # U2336 + : "⊭" # U22ad + : "⊮" # U22ae + : "⊯" # U22af + : "⋪" # U22ea + : "⋫" # U22eb + : "⋬" # U22ec + : "⋭" # U22ed + : "⍚" # U235a + : "⌺" # U233a + : "⍸" # U2378 + : "⍹" # U2379 + : "⍶" # U2376 + : "⍞" # U235e + : "⍁" # U2341 + : "⍠" # U2360 + : "⍃" # U2343 + : "⌸" # U2338 + : "⍄" # U2344 + : "⍰" # U2370 + : "⍂" # U2342 + : "⌹" # U2339 + : "⍇" # U2347 + : "⍐" # U2350 + : "⍈" # U2348 + : "⍗" # U2357 + : "⍍" # U234d + : "⍔" # U2354 + : "⌻" # U233b + : "⍓" # U2353 + : "⍌" # U234c + : "⍯" # U236f + : "⌺" # U233a + : "⌼" # U233c + : "⍟" # U235f + : "⊖" # U2296 + : "⊙" # U2299 + : "⍉" # U2349 + : "⍜" # U235c + : "⌽" # U233d + : "⍥" # U2365 + : "⌾" # U233e + : "⌼" # U233c + : "⫝̸" # U2adc + : "Đ" # U110 + : "Ǥ" # U1e4 + : "Ħ" # U126 + : "Ɨ" # U197 + : "Ł" # U141 + : "Ø" # Ud8 + : "Ŧ" # U166 + : "Ƶ" # U1b5 + : "ƀ" # U180 + : "đ" # U111 + : "ǥ" # U1e5 + : "ħ" # U127 + : "ɨ" # U268 + : "ł" # U142 + : "ø" # Uf8 + : "ŧ" # U167 + : "ƶ" # U1b6 + : "ʡ" # U2a1 + : "Ұ" # U4b0 + : "ұ" # U4b1 + : "ғ" # U493 + : "ҟ" # U49f + : "Ғ" # U492 + : "Ҟ" # U49e + : "↚" # U219a + : "↛" # U219b + : "↮" # U21ae + : "≠" # U2260 + : "Ợ" # U1ee2 + : "Ự" # U1ef0 + : "ợ" # U1ee3 + : "ự" # U1ef1 + : "Ợ" # U1ee2 + : "Ự" # U1ef0 + : "ợ" # U1ee3 + : "ự" # U1ef1 + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ṏ" # U1e4e + : "ṏ" # U1e4f + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "΅" # U385 + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "⓪" # U24ea + : "①" # U2460 + : "②" # U2461 + : "③" # U2462 + : "④" # U2463 + : "⑤" # U2464 + : "⑥" # U2465 + : "⑦" # U2466 + : "⑧" # U2467 + : "⑨" # U2468 + : "Ⓐ" # U24b6 + : "Ⓑ" # U24b7 + : "Ⓒ" # U24b8 + : "Ⓓ" # U24b9 + : "Ⓔ" # U24ba + : "Ⓕ" # U24bb + : "Ⓖ" # U24bc + : "Ⓗ" # U24bd + : "Ⓘ" # U24be + : "Ⓙ" # U24bf + : "Ⓚ" # U24c0 + : "Ⓛ" # U24c1 + : "Ⓜ" # U24c2 + : "Ⓝ" # U24c3 + : "Ⓞ" # U24c4 + : "Ⓟ" # U24c5 + : "Ⓠ" # U24c6 + : "Ⓡ" # U24c7 + : "Ⓢ" # U24c8 + : "Ⓣ" # U24c9 + : "Ⓤ" # U24ca + : "Ⓥ" # U24cb + : "Ⓦ" # U24cc + : "Ⓧ" # U24cd + : "Ⓨ" # U24ce + : "Ⓩ" # U24cf + : "ⓐ" # U24d0 + : "ⓑ" # U24d1 + : "ⓒ" # U24d2 + : "ⓓ" # U24d3 + : "ⓔ" # U24d4 + : "ⓕ" # U24d5 + : "ⓖ" # U24d6 + : "ⓗ" # U24d7 + : "ⓘ" # U24d8 + : "ⓙ" # U24d9 + : "ⓚ" # U24da + : "ⓛ" # U24db + : "ⓜ" # U24dc + : "ⓝ" # U24dd + : "ⓞ" # U24de + : "ⓟ" # U24df + : "ⓠ" # U24e0 + : "ⓡ" # U24e1 + : "ⓢ" # U24e2 + : "ⓣ" # U24e3 + : "ⓤ" # U24e4 + : "ⓥ" # U24e5 + : "ⓦ" # U24e6 + : "ⓧ" # U24e7 + : "ⓨ" # U24e8 + : "ⓩ" # U24e9 + : "㋾" # U32fe + : "㋐" # U32d0 + : "㋑" # U32d1 + : "㋒" # U32d2 + : "㋓" # U32d3 + : "㋔" # U32d4 + : "㋕" # U32d5 + : "㋖" # U32d6 + : "㋗" # U32d7 + : "㋘" # U32d8 + : "㋙" # U32d9 + : "㋚" # U32da + : "㋛" # U32db + : "㋜" # U32dc + : "㋝" # U32dd + : "㋞" # U32de + : "㋟" # U32df + : "㋠" # U32e0 + : "㋡" # U32e1 + : "㋢" # U32e2 + : "㋣" # U32e3 + : "㋤" # U32e4 + : "㋥" # U32e5 + : "㋦" # U32e6 + : "㋧" # U32e7 + : "㋨" # U32e8 + : "㋩" # U32e9 + : "㋪" # U32ea + : "㋫" # U32eb + : "㋬" # U32ec + : "㋭" # U32ed + : "㋮" # U32ee + : "㋯" # U32ef + : "㋰" # U32f0 + : "㋱" # U32f1 + : "㋲" # U32f2 + : "㋳" # U32f3 + : "㋴" # U32f4 + : "㋵" # U32f5 + : "㋶" # U32f6 + : "㋷" # U32f7 + : "㋸" # U32f8 + : "㋹" # U32f9 + : "㋺" # U32fa + : "㋻" # U32fb + : "㉠" # U3260 + : "㉡" # U3261 + : "㉢" # U3262 + : "㉣" # U3263 + : "㉤" # U3264 + : "㉥" # U3265 + : "㉦" # U3266 + : "㉧" # U3267 + : "㉨" # U3268 + : "㉩" # U3269 + : "㉪" # U326a + : "㉫" # U326b + : "㉬" # U326c + : "㉭" # U326d + : "㋼" # U32fc + : "㋽" # U32fd + : "㊀" # U3280 + : "㊆" # U3286 + : "㊂" # U3282 + : "㊤" # U32a4 + : "㊦" # U32a6 + : "㊥" # U32a5 + : "㊈" # U3288 + : "㊁" # U3281 + : "㊄" # U3284 + : "㊭" # U32ad + : "㊡" # U32a1 + : "㊝" # U329d + : "㊇" # U3287 + : "㊅" # U3285 + : "㊢" # U32a2 + : "㊘" # U3298 + : "㊩" # U32a9 + : "㊉" # U3289 + : "㊯" # U32af + : "㊞" # U329e + : "㊨" # U32a8 + : "㊔" # U3294 + : "㊃" # U3283 + : "㊏" # U328f + : "㊰" # U32b0 + : "㊛" # U329b + : "㊫" # U32ab + : "㊪" # U32aa + : "㊧" # U32a7 + : "㊐" # U3290 + : "㊊" # U328a + : "㊒" # U3292 + : "㊍" # U328d + : "㊑" # U3291 + : "㊣" # U32a3 + : "㊌" # U328c + : "㊟" # U329f + : "㊋" # U328b + : "㊕" # U3295 + : "㊚" # U329a + : "㊬" # U32ac + : "㊓" # U3293 + : "㊗" # U3297 + : "㊙" # U3299 + : "㊖" # U3296 + : "㊮" # U32ae + : "㊜" # U329c + : "㊎" # U328e + : "㊠" # U32a0 + : "②" # U2461 + : "⓪" # U24ea + : "①" # U2460 + : "②" # U2461 + : "③" # U2462 + : "④" # U2463 + : "⑤" # U2464 + : "⑥" # U2465 + : "⑦" # U2466 + : "⑧" # U2467 + : "⑨" # U2468 + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "\0\2\5\5" # Uad + : "—" # U2014 + : "–" # U2013 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "Ṥ" # U1e64 + : "ṥ" # U1e65 + : "Ṧ" # U1e66 + : "ṧ" # U1e67 + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "⅒" # U2152 + : "Ở" # U1ede + : "Ử" # U1eec + : "ở" # U1edf + : "ử" # U1eed + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "Ẩ" # U1ea8 + : "Ể" # U1ec2 + : "Ổ" # U1ed4 + : "ẩ" # U1ea9 + : "ể" # U1ec3 + : "ổ" # U1ed5 + : "Ẳ" # U1eb2 + : "ẳ" # U1eb3 + : "Ở" # U1ede + : "Ử" # U1eec + : "ở" # U1edf + : "ử" # U1eed + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "🙌" # U1f64c + : "Ậ" # U1eac + : "Ệ" # U1ec6 + : "Ộ" # U1ed8 + : "ậ" # U1ead + : "ệ" # U1ec7 + : "ộ" # U1ed9 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "ª" # Uaa + : "ʰ" # U2b0 + : "ⁱ" # U2071 + : "ʲ" # U2b2 + : "ˡ" # U2e1 + : "ⁿ" # U207f + : "º" # Uba + : "ʳ" # U2b3 + : "ˢ" # U2e2 + : "ʷ" # U2b7 + : "ˣ" # U2e3 + : "ʸ" # U2b8 + : "ˠ" # U2e0 + : "ʱ" # U2b1 + : "ʴ" # U2b4 + : "ʵ" # U2b5 + : "ʶ" # U2b6 + : "ˤ" # U2e4 + : "Ậ" # U1eac + : "Ệ" # U1ec6 + : "Ộ" # U1ed8 + : "ậ" # U1ead + : "ệ" # U1ec7 + : "ộ" # U1ed9 + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǜ" # U1db + : "ǜ" # U1dc + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ἃ" # U1f0b + : "Ἓ" # U1f1b + : "Ἣ" # U1f2b + : "Ἳ" # U1f3b + : "Ὃ" # U1f4b + : "Ὓ" # U1f5b + : "Ὣ" # U1f6b + : "ἃ" # U1f03 + : "ἓ" # U1f13 + : "ἣ" # U1f23 + : "ἳ" # U1f33 + : "ὃ" # U1f43 + : "ὓ" # U1f53 + : "ὣ" # U1f63 + : "Ἂ" # U1f0a + : "Ἒ" # U1f1a + : "Ἢ" # U1f2a + : "Ἲ" # U1f3a + : "Ὂ" # U1f4a + : "Ὢ" # U1f6a + : "ἂ" # U1f02 + : "ἒ" # U1f12 + : "ἢ" # U1f22 + : "ἲ" # U1f32 + : "ὂ" # U1f42 + : "ὒ" # U1f52 + : "ὢ" # U1f62 + : "Ờ" # U1edc + : "Ừ" # U1eea + : "ờ" # U1edd + : "ừ" # U1eeb + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "а̏" + : "е̏" + : "и̏" + : "о̏" + : "р̏" + : "у̏" + : "А̏" + : "Е̏" + : "И̏" + : "О̏" + : "Р̏" + : "У̏" + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "Ầ" # U1ea6 + : "Ề" # U1ec0 + : "Ồ" # U1ed2 + : "ầ" # U1ea7 + : "ề" # U1ec1 + : "ồ" # U1ed3 + : "Ḕ" # U1e14 + : "Ṑ" # U1e50 + : "ḕ" # U1e15 + : "ṑ" # U1e51 + : "Ằ" # U1eb0 + : "ằ" # U1eb1 + : "Ǜ" # U1db + : "ǜ" # U1dc + : "ῒ" # U1fd2 + : "ῢ" # U1fe2 + : "Ờ" # U1edc + : "Ừ" # U1eea + : "ờ" # U1edd + : "ừ" # U1eeb + : "Ἂ" # U1f0a + : "Ἒ" # U1f1a + : "Ἢ" # U1f2a + : "Ἲ" # U1f3a + : "Ὂ" # U1f4a + : "Ὢ" # U1f6a + : "ἂ" # U1f02 + : "ἒ" # U1f12 + : "ἢ" # U1f22 + : "ἲ" # U1f32 + : "ὂ" # U1f42 + : "ὒ" # U1f52 + : "ὢ" # U1f62 + : "Ἃ" # U1f0b + : "Ἓ" # U1f1b + : "Ἣ" # U1f2b + : "Ἳ" # U1f3b + : "Ὃ" # U1f4b + : "Ὓ" # U1f5b + : "Ὣ" # U1f6b + : "ἃ" # U1f03 + : "ἓ" # U1f13 + : "ἣ" # U1f23 + : "ἳ" # U1f33 + : "ὃ" # U1f43 + : "ὓ" # U1f53 + : "ὣ" # U1f63 + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "Ǚ" # U1d9 + : "ǚ" # U1da + : "💩" # U1f4a9 + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "Ἇ" # U1f0f + : "Ἧ" # U1f2f + : "Ἷ" # U1f3f + : "Ὗ" # U1f5f + : "Ὧ" # U1f6f + : "ἇ" # U1f07 + : "ἧ" # U1f27 + : "ἷ" # U1f37 + : "ὗ" # U1f57 + : "ὧ" # U1f67 + : "Ἆ" # U1f0e + : "Ἦ" # U1f2e + : "Ἶ" # U1f3e + : "Ὦ" # U1f6e + : "ἆ" # U1f06 + : "ἦ" # U1f26 + : "ἶ" # U1f36 + : "ὖ" # U1f56 + : "ὦ" # U1f66 + : "Ỡ" # U1ee0 + : "Ữ" # U1eee + : "ỡ" # U1ee1 + : "ữ" # U1eef + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "Ẫ" # U1eaa + : "Ễ" # U1ec4 + : "Ỗ" # U1ed6 + : "ẫ" # U1eab + : "ễ" # U1ec5 + : "ỗ" # U1ed7 + : "Ẵ" # U1eb4 + : "ẵ" # U1eb5 + : "ῗ" # U1fd7 + : "ῧ" # U1fe7 + : "Ỡ" # U1ee0 + : "Ữ" # U1eee + : "ỡ" # U1ee1 + : "ữ" # U1eef + : "Ἆ" # U1f0e + : "Ἦ" # U1f2e + : "Ἶ" # U1f3e + : "Ὦ" # U1f6e + : "ἆ" # U1f06 + : "ἦ" # U1f26 + : "ἶ" # U1f36 + : "ὖ" # U1f56 + : "ὦ" # U1f66 + : "Ἇ" # U1f0f + : "Ἧ" # U1f2f + : "Ἷ" # U1f3f + : "Ὗ" # U1f5f + : "Ὧ" # U1f6f + : "ἇ" # U1f07 + : "ἧ" # U1f27 + : "ἷ" # U1f37 + : "ὗ" # U1f57 + : "ὧ" # U1f67 + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ȭ" # U22c + : "ȭ" # U22d + : "Ǡ" # U1e0 + : "Ȱ" # U230 + : "ǡ" # U1e1 + : "ȱ" # U231 + : "Ǟ" # U1de + : "Ȫ" # U22a + : "Ǖ" # U1d5 + : "ǟ" # U1df + : "ȫ" # U22b + : "ǖ" # U1d6 + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ḹ" # U1e38 + : "Ṝ" # U1e5c + : "ḹ" # U1e39 + : "ṝ" # U1e5d + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ấ" # U1ea4 + : "Ế" # U1ebe + : "Ố" # U1ed0 + : "ấ" # U1ea5 + : "ế" # U1ebf + : "ố" # U1ed1 + : "Ṍ" # U1e4c + : "Ṹ" # U1e78 + : "ṍ" # U1e4d + : "ṹ" # U1e79 + : "Ḗ" # U1e16 + : "Ṓ" # U1e52 + : "ḗ" # U1e17 + : "ṓ" # U1e53 + : "Ắ" # U1eae + : "ắ" # U1eaf + : "Ḯ" # U1e2e + : "Ǘ" # U1d7 + : "ḯ" # U1e2f + : "ǘ" # U1d8 + : "ΐ" # U390 + : "ΰ" # U3b0 + : "Ǻ" # U1fa + : "ǻ" # U1fb + : "Ḉ" # U1e08 + : "ḉ" # U1e09 + : "Ớ" # U1eda + : "Ứ" # U1ee8 + : "ớ" # U1edb + : "ứ" # U1ee9 + : "Ἄ" # U1f0c + : "Ἔ" # U1f1c + : "Ἤ" # U1f2c + : "Ἴ" # U1f3c + : "Ὄ" # U1f4c + : "Ὤ" # U1f6c + : "ἄ" # U1f04 + : "ἔ" # U1f14 + : "ἤ" # U1f24 + : "ἴ" # U1f34 + : "ὄ" # U1f44 + : "ὔ" # U1f54 + : "ὤ" # U1f64 + : "Ἅ" # U1f0d + : "Ἕ" # U1f1d + : "Ἥ" # U1f2d + : "Ἵ" # U1f3d + : "Ὅ" # U1f4d + : "Ὕ" # U1f5d + : "Ὥ" # U1f6d + : "ἅ" # U1f05 + : "ἕ" # U1f15 + : "ἥ" # U1f25 + : "ἵ" # U1f35 + : "ὅ" # U1f45 + : "ὕ" # U1f55 + : "ὥ" # U1f65 + : "Ǿ" # U1fe + : "ǿ" # U1ff + : "שּׁ" # Ufb2c + : "שּׂ" # Ufb2d + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾉ" # U1f89 + : "ᾙ" # U1f99 + : "ᾩ" # U1fa9 + : "ᾁ" # U1f81 + : "ᾑ" # U1f91 + : "ᾡ" # U1fa1 + : "ᾈ" # U1f88 + : "ᾘ" # U1f98 + : "ᾨ" # U1fa8 + : "ᾀ" # U1f80 + : "ᾐ" # U1f90 + : "ᾠ" # U1fa0 + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾴ" # U1fb4 + : "ῄ" # U1fc4 + : "ῴ" # U1ff4 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾈ" # U1f88 + : "ᾘ" # U1f98 + : "ᾨ" # U1fa8 + : "ᾀ" # U1f80 + : "ᾐ" # U1f90 + : "ᾠ" # U1fa0 + : "ᾉ" # U1f89 + : "ᾙ" # U1f99 + : "ᾩ" # U1fa9 + : "ᾁ" # U1f81 + : "ᾑ" # U1f91 + : "ᾡ" # U1fa1 + : "ẛ" # U1e9b : "⑩" # U2469 : "⑪" # U246a : "⑫" # U246b @@ -1343,7 +4553,6 @@ : "⑰" # U2470 : "⑱" # U2471 : "⑲" # U2472 - : "②" # U2461 : "⑳" # U2473 : "㉑" # U3251 : "㉒" # U3252 @@ -1365,7 +4574,6 @@ : "㉗" # U3257 : "㉘" # U3258 : "㉙" # U3259 - : "③" # U2462 : "㉚" # U325a : "㉛" # U325b : "㉜" # U325c @@ -1387,7 +4595,6 @@ : "㊲" # U32b2 : "㊳" # U32b3 : "㊴" # U32b4 - : "④" # U2463 : "㊵" # U32b5 : "㊶" # U32b6 : "㊷" # U32b7 @@ -1409,211 +4616,22 @@ : "㊼" # U32bc : "㊽" # U32bd : "㊾" # U32be - : "⑤" # U2464 + : "㊿" # U32bf : "㊿" # U32bf - : "⑥" # U2465 - : "⑦" # U2466 - : "⑧" # U2467 - : "⑨" # U2468 - : "Ă" # U102 - : "Ⓐ" # U24b6 - : "Ⓑ" # U24b7 - : "Ⓒ" # U24b8 - : "Ⓓ" # U24b9 - : "Ⓔ" # U24ba - : "Ⓕ" # U24bb - : "Ğ" # U11e - : "Ⓖ" # U24bc - : "Ⓗ" # U24bd - : "Ⓘ" # U24be - : "Ⓙ" # U24bf - : "Ⓚ" # U24c0 - : "Ⓛ" # U24c1 - : "Ⓜ" # U24c2 - : "Ⓝ" # U24c3 - : "Ⓞ" # U24c4 - : "Ⓟ" # U24c5 - : "Ⓠ" # U24c6 - : "Ⓡ" # U24c7 - : "Ⓢ" # U24c8 - : "Ⓣ" # U24c9 - : "Ⓤ" # U24ca - : "Ⓥ" # U24cb - : "Ⓦ" # U24cc - : "Ⓧ" # U24cd - : "Ⓨ" # U24ce - : "Ⓩ" # U24cf - : "ă" # U103 - : "ⓐ" # U24d0 - : "ⓑ" # U24d1 - : "©" # Ua9 - : "ⓒ" # U24d2 - : "ⓓ" # U24d3 - : "ⓔ" # U24d4 - : "ⓕ" # U24d5 - : "ğ" # U11f - : "ⓖ" # U24d6 - : "ⓗ" # U24d7 - : "ⓘ" # U24d8 - : "ⓙ" # U24d9 - : "ⓚ" # U24da - : "ⓛ" # U24db - : "ⓜ" # U24dc - : "ⓝ" # U24dd - : "ⓞ" # U24de - : "ⓟ" # U24df - : "ⓠ" # U24e0 - : "®" # Uae - : "ⓡ" # U24e1 - : "ⓢ" # U24e2 - : "ⓣ" # U24e3 - : "ⓤ" # U24e4 - : "ⓥ" # U24e5 - : "ⓦ" # U24e6 - : "ⓧ" # U24e7 - : "ⓨ" # U24e8 - : "ⓩ" # U24e9 - : "㋾" # U32fe - : "㋐" # U32d0 - : "㋑" # U32d1 - : "㋒" # U32d2 - : "㋓" # U32d3 - : "㋔" # U32d4 - : "㋕" # U32d5 - : "㋖" # U32d6 - : "㋗" # U32d7 - : "㋘" # U32d8 - : "㋙" # U32d9 - : "㋚" # U32da - : "㋛" # U32db - : "㋜" # U32dc - : "㋝" # U32dd - : "㋞" # U32de - : "㋟" # U32df - : "㋠" # U32e0 - : "㋡" # U32e1 - : "㋢" # U32e2 - : "㋣" # U32e3 - : "㋤" # U32e4 - : "㋥" # U32e5 - : "㋦" # U32e6 - : "㋧" # U32e7 - : "㋨" # U32e8 - : "㋩" # U32e9 - : "㋪" # U32ea - : "㋫" # U32eb - : "㋬" # U32ec - : "㋭" # U32ed - : "㋮" # U32ee - : "㋯" # U32ef - : "㋰" # U32f0 - : "㋱" # U32f1 - : "㋲" # U32f2 - : "㋳" # U32f3 - : "㋴" # U32f4 - : "㋵" # U32f5 - : "㋶" # U32f6 - : "㋷" # U32f7 - : "㋸" # U32f8 - : "㋹" # U32f9 - : "㋺" # U32fa - : "㋻" # U32fb - : "Ἁ" # U1f09 - : "Ἑ" # U1f19 - : "Ἡ" # U1f29 - : "Ἱ" # U1f39 - : "Ὁ" # U1f49 - : "Ῥ" # U1fec - : "Ὑ" # U1f59 - : "Ὡ" # U1f69 - : "ἁ" # U1f01 - : "ἑ" # U1f11 - : "ἡ" # U1f21 - : "ἱ" # U1f31 - : "ὁ" # U1f41 - : "ῥ" # U1fe5 - : "ὑ" # U1f51 - : "ὡ" # U1f61 - : "㉠" # U3260 : "㉮" # U326e - : "㉡" # U3261 : "㉯" # U326f - : "㉢" # U3262 : "㉰" # U3270 - : "㉣" # U3263 : "㉱" # U3271 - : "㉤" # U3264 : "㉲" # U3272 - : "㉥" # U3265 : "㉳" # U3273 - : "㉦" # U3266 : "㉴" # U3274 - : "㉧" # U3267 : "㉵" # U3275 - : "㉨" # U3268 : "㉶" # U3276 - : "㉩" # U3269 : "㉷" # U3277 - : "㉪" # U326a : "㉸" # U3278 - : "㉫" # U326b : "㉹" # U3279 - : "㉬" # U326c : "㉺" # U327a - : "㉭" # U326d : "㉻" # U327b - : "㋼" # U32fc - : "㋽" # U32fd - : "㊀" # U3280 - : "㊆" # U3286 - : "㊂" # U3282 - : "㊤" # U32a4 - : "㊦" # U32a6 - : "㊥" # U32a5 - : "㊈" # U3288 - : "㊁" # U3281 - : "㊄" # U3284 - : "㊭" # U32ad - : "㊡" # U32a1 - : "㊝" # U329d - : "㊇" # U3287 - : "㊅" # U3285 - : "㊢" # U32a2 - : "㊘" # U3298 - : "㊩" # U32a9 - : "㊉" # U3289 - : "㊯" # U32af - : "㊞" # U329e - : "㊨" # U32a8 - : "㊔" # U3294 - : "㊃" # U3283 - : "㊏" # U328f - : "㊰" # U32b0 - : "㊛" # U329b - : "㊫" # U32ab - : "㊪" # U32aa - : "㊧" # U32a7 - : "㊐" # U3290 - : "㊊" # U328a - : "㊒" # U3292 - : "㊍" # U328d - : "㊑" # U3291 - : "㊣" # U32a3 - : "㊌" # U328c - : "㊟" # U329f - : "㊋" # U328b - : "㊕" # U3295 - : "㊚" # U329a - : "㊬" # U32ac - : "㊓" # U3293 - : "㊗" # U3297 - : "㊙" # U3299 - : "㊖" # U3296 - : "㊮" # U32ae - : "㊜" # U329c - : "㊎" # U328e - : "㊠" # U32a0 - : "②" # U2461 : "⑳" # U2473 : "㉑" # U3251 : "㉒" # U3252 @@ -1635,8 +4653,6 @@ : "㉗" # U3257 : "㉘" # U3258 : "㉙" # U3259 - : "⓪" # U24ea - : "①" # U2460 : "⑩" # U2469 : "⑪" # U246a : "⑫" # U246b @@ -1658,7 +4674,6 @@ : "⑰" # U2470 : "⑱" # U2471 : "⑲" # U2472 - : "②" # U2461 : "⑳" # U2473 : "㉑" # U3251 : "㉒" # U3252 @@ -1680,7 +4695,6 @@ : "㉗" # U3257 : "㉘" # U3258 : "㉙" # U3259 - : "③" # U2462 : "㉚" # U325a : "㉛" # U325b : "㉜" # U325c @@ -1702,7 +4716,6 @@ : "㊲" # U32b2 : "㊳" # U32b3 : "㊴" # U32b4 - : "④" # U2463 : "㊵" # U32b5 : "㊶" # U32b6 : "㊷" # U32b7 @@ -1724,1936 +4737,12 @@ : "㊼" # U32bc : "㊽" # U32bd : "㊾" # U32be - : "⑤" # U2464 + : "㊿" # U32bf : "㊿" # U32bf - : "⑥" # U2465 - : "⑦" # U2466 - : "⑧" # U2467 - : "⑨" # U2468 - : "]" # U5d - : "}" # U7d - : "Ἀ" # U1f08 - : "Ἐ" # U1f18 - : "Ἠ" # U1f28 - : "Ἰ" # U1f38 - : "Ὀ" # U1f48 - : "Ὠ" # U1f68 - : "ἀ" # U1f00 - : "ἐ" # U1f10 - : "ἠ" # U1f20 - : "ἰ" # U1f30 - : "ὀ" # U1f40 - : "ῤ" # U1fe4 - : "ὐ" # U1f50 - : "ὠ" # U1f60 - : "Ǻ" # U1fa - : "ǻ" # U1fb - : "°" # Ub0 - : "Å" # Uc5 - : "Ů" # U16e - : "å" # Ue5 - : "ů" # U16f - : "⍣" # U2363 - : "⍟" # U235f - : "#" # U23 - : "±" # Ub1 - : "Ơ" # U1a0 - : "Ư" # U1af - : "ơ" # U1a1 - : "ư" # U1b0 - : "¸" # Ub8 - : "„" # U201e - : "‚" # U201a - : "¸" # Ub8 - : "¬" # Uac - : "Ą" # U104 - : "Ç" # Uc7 - : "Ḑ" # U1e10 - : "Ę" # U118 - : "Ģ" # U122 - : "Ḩ" # U1e28 - : "Į" # U12e - : "Ķ" # U136 - : "Ļ" # U13b - : "Ņ" # U145 - : "Ǫ" # U1ea - : "Ŗ" # U156 - : "Ş" # U15e - : "Ţ" # U162 - : "Ų" # U172 - : "ą" # U105 - : "ç" # Ue7 - : "ḑ" # U1e11 - : "ę" # U119 - : "ģ" # U123 - : "ḩ" # U1e29 - : "į" # U12f - : "ķ" # U137 - : "ļ" # U13c - : "ņ" # U146 - : "ǫ" # U1eb - : "ŗ" # U157 - : "ş" # U15f - : "ţ" # U163 - : "ų" # U173 - : "~" # U7e - : "{" # U7b - : "}" # U7d - : "±" # Ub1 - : "¬" # Uac - : "­" # Uad - : "—" # U2014 - : "–" # U2013 - : "⌿" # U233f - : "÷" # Uf7 - : "→" # U2192 - : "Ã" # Uc3 - : "Đ" # U110 - : "Ē" # U112 - : "Ī" # U12a - : "£" # Ua3 - : "Ñ" # Ud1 - : "Õ" # Ud5 - : "Ū" # U16a - : "¥" # Ua5 - : "⍀" # U2340 - : "¯" # Uaf - : "ā" # U101 - : "đ" # U111 - : "ē" # U113 - : "ī" # U12b - : "£" # Ua3 - : "ñ" # Uf1 - : "ō" # U14d - : "ū" # U16b - : "¥" # Ua5 - : "⊖" # U2296 - : "⍏" # U234f - : "⍖" # U2356 - : "Ṩ" # U1e68 - : "ṩ" # U1e69 - : "Ṥ" # U1e64 - : "ṥ" # U1e65 - : "·" # Ub7 - : "…" # U2026 - : "∵" # U2235 - : "‹" # U2039 - : "•" # U2022 - : "›" # U203a - : "Ȧ" # U226 - : "Ḃ" # U1e02 - : "Ċ" # U10a - : "Ḋ" # U1e0a - : "Ė" # U116 - : "Ḟ" # U1e1e - : "Ġ" # U120 - : "Ḣ" # U1e22 - : "İ" # U130 - : "Ṁ" # U1e40 - : "Ṅ" # U1e44 - : "Ȯ" # U22e - : "Ṗ" # U1e56 - : "Ṙ" # U1e58 - : "Ṡ" # U1e60 - : "Ṫ" # U1e6a - : "Ẇ" # U1e86 - : "Ẋ" # U1e8a - : "Ẏ" # U1e8e - : "Ż" # U17b - : "·" # Ub7 - : "ȧ" # U227 - : "ḃ" # U1e03 - : "ċ" # U10b - : "ḋ" # U1e0b - : "ė" # U117 - : "ḟ" # U1e1f - : "ġ" # U121 - : "ḣ" # U1e23 - : "ı" # U131 - : "ṁ" # U1e41 - : "ṅ" # U1e45 - : "ȯ" # U22f - : "ṗ" # U1e57 - : "ṙ" # U1e59 - : "ṡ" # U1e61 - : "ṫ" # U1e6b - : "ẇ" # U1e87 - : "ẋ" # U1e8b - : "ẏ" # U1e8f - : "ż" # U17c - : "Ṥ" # U1e64 - : "ṥ" # U1e65 - : "ẛ" # U1e9b - : "Ṥ" # U1e64 - : "Ṧ" # U1e66 - : "ṥ" # U1e65 - : "ṧ" # U1e67 - : "⊙" # U2299 - : "Ṩ" # U1e68 - : "ṩ" # U1e69 - : "Ṥ" # U1e64 - : "ṥ" # U1e65 - : "Ṧ" # U1e66 - : "ṧ" # U1e67 - : "Ṩ" # U1e68 - : "ṩ" # U1e69 - : "⌿" # U233f - : "\" # U5c - : "\" # U5c - : "≠" # U2260 - : "₡" # U20a1 - : "Đ" # U110 - : "Ǥ" # U1e4 - : "Ħ" # U126 - : "Ɨ" # U197 - : "Ł" # U141 - : "Ø" # Ud8 - : "Ŧ" # U166 - : "µ" # Ub5 - : "Ƶ" # U1b5 - : "|" # U7c - : "ƀ" # U180 - : "¢" # Ua2 - : "đ" # U111 - : "ǥ" # U1e5 - : "ħ" # U127 - : "ɨ" # U268 - : "ł" # U142 - : "₥" # U20a5 - : "ø" # Uf8 - : "ŧ" # U167 - : "µ" # Ub5 - : "√" # U221a - : "ƶ" # U1b6 - : "ʡ" # U2a1 - : "Ұ" # U4b0 - : "ұ" # U4b1 - : "ғ" # U493 - : "ҟ" # U49f - : "Ғ" # U492 - : "Ҟ" # U49e - : "↚" # U219a - : "↛" # U219b - : "↮" # U21ae - : "⍁" # U2341 - : "°" # Ub0 - : "↉" # U2189 - : "©" # Ua9 - : "§" # Ua7 - : "¤" # Ua4 - : "°" # Ub0 - : "©" # Ua9 - : "§" # Ua7 - : "¤" # Ua4 - : "⍬" # U236c - : "⅒" # U2152 - : "½" # Ubd - : "⅓" # U2153 - : "¼" # Ubc - : "⅕" # U2155 - : "⅙" # U2159 - : "⅐" # U2150 - : "⅛" # U215b - : "⅑" # U2151 - : "¹" # Ub9 - : "¹" # Ub9 - : "¹" # Ub9 - : "⅔" # U2154 - : "⅖" # U2156 - : "²" # Ub2 - : "²" # Ub2 - : "²" # Ub2 - : "¾" # Ube - : "⅗" # U2157 - : "⅜" # U215c - : "³" # Ub3 - : "³" # Ub3 - : "³" # Ub3 - : "⅘" # U2158 - : "⅚" # U215a - : "⅝" # U215d - : "⅞" # U215e - : "∞" # U221e - : "☹" # U2639 - : "☺" # U263a - : "÷" # Uf7 - : "∴" # U2234 - : "⍠" # U2360 - : "Ą" # U104 - : "Ę" # U118 - : "Į" # U12e - : "Ǫ" # U1ea - : "Ș" # U218 - : "Ț" # U21a - : "Ų" # U172 - : "⍮" # U236e - : "ą" # U105 - : "ę" # U119 - : "į" # U12f - : "ǫ" # U1eb - : "ș" # U219 - : "ț" # U21b - : "ų" # U173 - : "ˇ" # U2c7 - : "“" # U201c - : "‘" # U2018 - : "←" # U2190 - : "\" # U5c - : "♥" # U2665 - : "«" # Uab - : "≤" # U2264 - : "⋄" # U22c4 - : "Č" # U10c - : "Ď" # U10e - : "Ě" # U11a - : "Ľ" # U13d - : "Ň" # U147 - : "Ř" # U158 - : "Š" # U160 - : "Ť" # U164 - : "Ž" # U17d - : "≤" # U2264 - : "č" # U10d - : "ď" # U10f - : "ě" # U11b - : "ľ" # U13e - : "ň" # U148 - : "ř" # U159 - : "š" # U161 - : "ť" # U165 - : "ž" # U17e - : "≮" # U226e - : "⍃" # U2343 - : "≠" # U2260 - : "⇒" # U21d2 - : "€" # U20ac - : "€" # U20ac - : "₤" # U20a4 - : "₦" # U20a6 - : "Ő" # U150 - : "₽" # U20bd - : "₹" # U20b9 - : "Ű" # U170 - : "₩" # U20a9 - : "¥" # Ua5 - : "≡" # U2261 - : "€" # U20ac - : "₫" # U20ab - : "€" # U20ac - : "£" # Ua3 - : "ő" # U151 - : "₽" # U20bd - : "₹" # U20b9 - : "ű" # U171 - : "¥" # Ua5 - : "≠" # U2260 - : "ӳ" # U4f3 - : "₽" # U20bd - : "€" # U20ac - : "€" # U20ac - : "Ӳ" # U4f2 - : "₽" # U20bd - : "⌸" # U2338 - : "^" # U5e - : "”" # U201d - : "’" # U2019 - : "⋄" # U22c4 - : "≥" # U2265 - : "»" # Ubb - : "Â" # Uc2 - : "Ê" # Uca - : "Î" # Uce - : "Ô" # Ud4 - : "Û" # Udb - : "≥" # U2265 - : "â" # Ue2 - : "ê" # Uea - : "î" # Uee - : "ô" # Uf4 - : "û" # Ufb - : "⍩" # U2369 - : "≯" # U226f - : "⍄" # U2344 - : "⸘" # U2e18 - : "Ở" # U1ede - : "Ử" # U1eec - : "ở" # U1edf - : "ử" # U1eed - : "¿" # Ubf - : "Ả" # U1ea2 - : "Ẻ" # U1eba - : "Ỉ" # U1ec8 - : "Ỏ" # U1ece - : "Ủ" # U1ee6 - : "Ỷ" # U1ef6 - : "Ẩ" # U1ea8 - : "Ể" # U1ec2 - : "Ổ" # U1ed4 - : "ẩ" # U1ea9 - : "ể" # U1ec3 - : "ổ" # U1ed5 - : "ả" # U1ea3 - : "Ẳ" # U1eb2 - : "ẳ" # U1eb3 - : "ẻ" # U1ebb - : "ỉ" # U1ec9 - : "ỏ" # U1ecf - : "ủ" # U1ee7 - : "ỷ" # U1ef7 - : "Ẩ" # U1ea8 - : "Ể" # U1ec2 - : "Ổ" # U1ed4 - : "ẩ" # U1ea9 - : "ể" # U1ec3 - : "ổ" # U1ed5 - : "Ẳ" # U1eb2 - : "ẳ" # U1eb3 - : "⍰" # U2370 - : "Ẩ" # U1ea8 - : "Ể" # U1ec2 - : "Ổ" # U1ed4 - : "ẩ" # U1ea9 - : "ể" # U1ec3 - : "ổ" # U1ed5 - : "Ẳ" # U1eb2 - : "ẳ" # U1eb3 - : "Ở" # U1ede - : "Ử" # U1eec - : "ở" # U1edf - : "ử" # U1eed - : "Ä" # Uc4 - : "Á" # Uc1 - : "Ă" # U102 - : "Å" # Uc5 - : "Ą" # U104 - : "Ã" # Uc3 - : "Ą" # U104 - : "Â" # Uc2 - : "Å" # Uc5 - : "Æ" # Uc6 - : "@" # U40 - : "Â" # Uc2 - : "ª" # Uaa - : "À" # Uc0 - : "Ã" # Uc3 - : "Ä" # Uc4 - : "Á" # Uc1 - : "Ḃ" # U1e02 - : "Ć" # U106 - : "Ç" # Uc7 - : "Ċ" # U10a - : "₡" # U20a1 - : "©" # Ua9 - : "Č" # U10c - : "€" # U20ac : "☭" # U262d - : "₠" # U20a0 - : "©" # Ua9 - : "©" # Ua9 - : "₢" # U20a2 - : "¢" # Ua2 - : "Ḑ" # U1e10 - : "Đ" # U110 - : "Ḋ" # U1e0a - : "Ď" # U10e - : "Ð" # Ud0 - : "Ë" # Ucb - : "É" # Uc9 - : "Ę" # U118 - : "Ē" # U112 - : "Ė" # U116 - : "Ę" # U118 - : "Ě" # U11a - : "€" # U20ac - : "Ê" # Uca - : "Ê" # Uca - : "Ē" # U112 - : "È" # Uc8 - : "Ë" # Ucb - : "É" # Uc9 - : "Ḟ" # U1e1e - : "ffi" # Ufb03 - : "ffl" # Ufb04 - : "₣" # U20a3 - : "Ğ" # U11e - : "Ģ" # U122 - : "Ġ" # U120 - : ">" # U3e - : "Ğ" # U11e - : "Ğ" # U11e - : "Ğ" # U11e - : "Ḩ" # U1e28 - : "Ï" # Ucf - : "Í" # Ucd - : "Į" # U12e - : "Ī" # U12a - : "İ" # U130 - : "Į" # U12e - : "Î" # Uce - : "IJ" # U132 - : "Î" # Uce - : "Ī" # U12a - : "Ì" # Ucc - : "IJ" # U132 - : "Ĩ" # U128 - : "Ï" # Ucf - : "Í" # Ucd - : "Ķ" # U136 - : "Ĺ" # U139 - : "Ļ" # U13b - : "£" # Ua3 - : "Ł" # U141 - : "Ľ" # U13d - : "£" # Ua3 - : "<" # U3c - : "|" # U7c - : "Ṁ" # U1e40 - : "Ń" # U143 - : "Ņ" # U145 - : "Ñ" # Ud1 - : "Ň" # U147 - : "₦" # U20a6 - : "Ŋ" # U14a - : "№" # U2116 - : "№" # U2116 - : "Ñ" # Ud1 - : "Ö" # Ud6 - : "Ó" # Ud3 - : "Ǫ" # U1ea - : "Õ" # Ud5 - : "Ø" # Ud8 - : "Ǫ" # U1ea - : "Ô" # Ud4 - : "Ⓐ" # U24b6 - : "©" # Ua9 - : "Œ" # U152 - : "®" # Uae - : "§" # Ua7 - : "¤" # Ua4 - : "Ô" # Ud4 - : "º" # Uba - : "Ò" # Ud2 - : "©" # Ua9 - : "®" # Uae - : "¤" # Ua4 - : "Õ" # Ud5 - : "Ö" # Ud6 - : "Ó" # Ud3 - : "¶" # Ub6 - : "Ṗ" # U1e56 - : "₽" # U20bd - : "¶" # Ub6 - : "₧" # U20a7 - : "Ŕ" # U154 - : "Ŗ" # U156 - : "Ř" # U158 - : "₹" # U20b9 - : "®" # Uae - : "®" # Uae - : "₨" # U20a8 - : "§" # Ua7 - : "Ś" # U15a - : "Ş" # U15e - : "Ṡ" # U1e60 - : "§" # Ua7 - : "¹" # Ub9 - : "²" # Ub2 - : "³" # Ub3 - : "Ș" # U218 - : "Š" # U160 - : "℠" # U2120 - : "§" # Ua7 - : "ẞ" # U1e9e - : "℠" # U2120 - : "Ş" # U15e - : "Ţ" # U162 - : "Ŧ" # U166 - : "Ṫ" # U1e6a - : "Ŧ" # U166 - : "Ț" # U21a - : "Ť" # U164 - : "Þ" # Ude - : "™" # U2122 - : "™" # U2122 + : "🖖" # U1f596 : "Ḝ" # U1e1c : "ḝ" # U1e1d - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "Ü" # Udc - : "Ú" # Uda - : "Ů" # U16e - : "Ų" # U172 - : "Ū" # U16a - : "µ" # Ub5 - : "Ų" # U172 - : "Û" # Udb - : "Ă" # U102 - : "Ĕ" # U114 - : "Ğ" # U11e - : "Ĭ" # U12c - : "Ŏ" # U14e - : "Ŭ" # U16c - : "Û" # Udb - : "Ū" # U16a - : "Ù" # Ud9 - : "ă" # U103 - : "ĕ" # U115 - : "ğ" # U11f - : "ĭ" # U12d - : "ŏ" # U14f - : "ŭ" # U16d - : "Ũ" # U168 - : "Ü" # Udc - : "Ú" # Uda - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "ӑ" # U4d1 - : "ӗ" # U4d7 - : "й" # U439 - : "ў" # U45e - : "ӂ" # U4c2 - : "Ӑ" # U4d0 - : "Ӗ" # U4d6 - : "Й" # U419 - : "Ў" # U40e - : "Ӂ" # U4c1 - : "Ᾰ" # U1fb8 - : "Ῐ" # U1fd8 - : "Ῠ" # U1fe8 - : "ᾰ" # U1fb0 - : "ῐ" # U1fd0 - : "ῠ" # U1fe0 - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "|" # U7c - : "₩" # U20a9 - : "Ŵ" # U174 - : "¤" # Ua4 - : "¤" # Ua4 - : "¤" # Ua4 - : "Ÿ" # U178 - : "Ý" # Udd - : "¥" # Ua5 - : "¥" # Ua5 - : "Ŷ" # U176 - : "Ÿ" # U178 - : "Ý" # Udd - : "Ź" # U179 - : "Ż" # U17b - : "Ž" # U17d - : "⌷" # U2337 - : "⍀" # U2340 - : "⍉" # U2349 - : "⍂" # U2342 - : "⌷" # U2337 - : "^" # U5e - : "Ậ" # U1eac - : "Ệ" # U1ec6 - : "Ộ" # U1ed8 - : "ậ" # U1ead - : "ệ" # U1ec7 - : "ộ" # U1ed9 - : "⁽" # U207d - : "⁾" # U207e - : "⁺" # U207a - : "¯" # Uaf - : "·" # Ub7 - : "|" # U7c - : "⁰" # U2070 - : "¹" # Ub9 - : "²" # Ub2 - : "³" # Ub3 - : "⁴" # U2074 - : "⁵" # U2075 - : "⁶" # U2076 - : "⁷" # U2077 - : "⁸" # U2078 - : "⁹" # U2079 - : "⁼" # U207c - : "Â" # Uc2 - : "Ĉ" # U108 - : "Ê" # Uca - : "Ĝ" # U11c - : "Ĥ" # U124 - : "Î" # Uce - : "Ĵ" # U134 - : "Ô" # Ud4 - : "Ŝ" # U15c - : "Û" # Udb - : "Ŵ" # U174 - : "Ŷ" # U176 - : "Ẑ" # U1e90 - : "¯" # Uaf - : "ª" # Uaa - : "ʰ" # U2b0 - : "ⁱ" # U2071 - : "ʲ" # U2b2 - : "ˡ" # U2e1 - : "ⁿ" # U207f - : "º" # Uba - : "ʳ" # U2b3 - : "ˢ" # U2e2 - : "ʷ" # U2b7 - : "ˣ" # U2e3 - : "ʸ" # U2b8 - : "ˠ" # U2e0 - : "ʱ" # U2b1 - : "ʴ" # U2b4 - : "ʵ" # U2b5 - : "ʶ" # U2b6 - : "ˤ" # U2e4 - : "â" # Ue2 - : "ĉ" # U109 - : "ê" # Uea - : "ĝ" # U11d - : "ĥ" # U125 - : "î" # Uee - : "ĵ" # U135 - : "ô" # Uf4 - : "ŝ" # U15d - : "û" # Ufb - : "ŵ" # U175 - : "ŷ" # U177 - : "ẑ" # U1e91 - : "↑" # U2191 - : "ª" # Uaa - : "ʰ" # U2b0 - : "ⁱ" # U2071 - : "ʲ" # U2b2 - : "ˡ" # U2e1 - : "ⁿ" # U207f - : "º" # Uba - : "ʳ" # U2b3 - : "ˢ" # U2e2 - : "ʷ" # U2b7 - : "ˣ" # U2e3 - : "ʸ" # U2b8 - : "ˠ" # U2e0 - : "ʱ" # U2b1 - : "ʴ" # U2b4 - : "ʵ" # U2b5 - : "ʶ" # U2b6 - : "ˤ" # U2e4 - : "Ậ" # U1eac - : "ậ" # U1ead - : "Ệ" # U1ec6 - : "ệ" # U1ec7 - : "Ộ" # U1ed8 - : "ộ" # U1ed9 - : "⁻" # U207b - : "㆒" # U3192 - : "㆜" # U319c - : "㆔" # U3194 - : "㆖" # U3196 - : "㆘" # U3198 - : "㆛" # U319b - : "㆗" # U3197 - : "㆚" # U319a - : "㆓" # U3193 - : "㆟" # U319f - : "㆕" # U3195 - : "㆞" # U319e - : "㆝" # U319d - : "㆙" # U3199 - : "Ậ" # U1eac - : "Ệ" # U1ec6 - : "Ộ" # U1ed8 - : "ậ" # U1ead - : "ệ" # U1ec7 - : "ộ" # U1ed9 - : "²" # Ub2 - : "⁺" # U207a - : "⁰" # U2070 - : "¹" # Ub9 - : "²" # Ub2 - : "³" # Ub3 - : "⁴" # U2074 - : "⁵" # U2075 - : "⁶" # U2076 - : "⁷" # U2077 - : "⁸" # U2078 - : "⁹" # U2079 - : "⁼" # U207c - : "Ḹ" # U1e38 - : "Ṝ" # U1e5c - : "ḹ" # U1e39 - : "ṝ" # U1e5d - : "Ǟ" # U1de - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ȫ" # U22b - : "ǖ" # U1d6 - : "⍘" # U2358 - : "₍" # U208d - : "₎" # U208e - : "₊" # U208a - : "Ǡ" # U1e0 - : "Ȱ" # U230 - : "ǡ" # U1e1 - : "ȱ" # U231 - : "₀" # U2080 - : "₁" # U2081 - : "₂" # U2082 - : "₃" # U2083 - : "₄" # U2084 - : "₅" # U2085 - : "₆" # U2086 - : "₇" # U2087 - : "₈" # U2088 - : "₉" # U2089 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "≤" # U2264 - : "₌" # U208c - : "≥" # U2265 - : "Ā" # U100 - : "Ē" # U112 - : "Ḡ" # U1e20 - : "Ī" # U12a - : "Ō" # U14c - : "Ū" # U16a - : "Ȳ" # U232 - : "¯" # Uaf - : "¯" # Uaf - : "ā" # U101 - : "ē" # U113 - : "ḡ" # U1e21 - : "ī" # U12b - : "ō" # U14d - : "ū" # U16b - : "ȳ" # U233 - : "Ȭ" # U22c - : "ȭ" # U22d - : "Ǟ" # U1de - : "Ǣ" # U1e2 - : "Ȭ" # U22c - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ǣ" # U1e3 - : "ȭ" # U22d - : "ȫ" # U22b - : "ǖ" # U1d6 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ǡ" # U1e0 - : "ǡ" # U1e1 - : "Ȱ" # U230 - : "ȱ" # U231 - : "ӣ" # U4e3 - : "ӯ" # U4ef - : "Ӣ" # U4e2 - : "Ӯ" # U4ee - : "Ᾱ" # U1fb9 - : "Ῑ" # U1fd9 - : "Ῡ" # U1fe9 - : "ᾱ" # U1fb1 - : "ῑ" # U1fd1 - : "ῡ" # U1fe1 - : "⍜" # U235c - : "⍊" # U234a - : "Ḹ" # U1e38 - : "ḹ" # U1e39 - : "Ṝ" # U1e5c - : "ṝ" # U1e5d - : "⍙" # U2359 - : "⍷" # U2377 - : "₋" # U208b - : "⍛" # U235b - : "≢" # U2262 - : "⊆" # U2286 - : "⊇" # U2287 - : "⍚" # U235a - : "⍸" # U2378 - : "⍹" # U2379 - : "⍶" # U2376 - : "Ȭ" # U22c - : "ȭ" # U22d - : "Ǡ" # U1e0 - : "Ȱ" # U230 - : "ǡ" # U1e1 - : "ȱ" # U231 - : "Ǟ" # U1de - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ȫ" # U22b - : "ǖ" # U1d6 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ḹ" # U1e38 - : "Ṝ" # U1e5c - : "ḹ" # U1e39 - : "ṝ" # U1e5d - : "₂" # U2082 - : "₊" # U208a - : "₀" # U2080 - : "₁" # U2081 - : "₂" # U2082 - : "₃" # U2083 - : "₄" # U2084 - : "₅" # U2085 - : "₆" # U2086 - : "₇" # U2087 - : "₈" # U2088 - : "₉" # U2089 - : "₌" # U208c - : "`" # U60 - : "Ǜ" # U1db - : "ǜ" # U1dc - : "ῒ" # U1fd2 - : "ῢ" # U1fe2 - : "Ἃ" # U1f0b - : "Ἓ" # U1f1b - : "Ἣ" # U1f2b - : "Ἳ" # U1f3b - : "Ὃ" # U1f4b - : "Ὓ" # U1f5b - : "Ὣ" # U1f6b - : "ἃ" # U1f03 - : "ἓ" # U1f13 - : "ἣ" # U1f23 - : "ἳ" # U1f33 - : "ὃ" # U1f43 - : "ὓ" # U1f53 - : "ὣ" # U1f63 - : "Ἂ" # U1f0a - : "Ἒ" # U1f1a - : "Ἢ" # U1f2a - : "Ἲ" # U1f3a - : "Ὂ" # U1f4a - : "Ὢ" # U1f6a - : "ἂ" # U1f02 - : "ἒ" # U1f12 - : "ἢ" # U1f22 - : "ἲ" # U1f32 - : "ὂ" # U1f42 - : "ὒ" # U1f52 - : "ὢ" # U1f62 - : "Ờ" # U1edc - : "Ừ" # U1eea - : "ờ" # U1edd - : "ừ" # U1eeb - : "À" # Uc0 - : "È" # Uc8 - : "Ì" # Ucc - : "Ǹ" # U1f8 - : "Ò" # Ud2 - : "Ù" # Ud9 - : "Ẁ" # U1e80 - : "Ỳ" # U1ef2 - : "Ầ" # U1ea6 - : "Ề" # U1ec0 - : "Ồ" # U1ed2 - : "ầ" # U1ea7 - : "ề" # U1ec1 - : "ồ" # U1ed3 - : "Ḕ" # U1e14 - : "Ṑ" # U1e50 - : "ḕ" # U1e15 - : "ṑ" # U1e51 - : "à" # Ue0 - : "Ằ" # U1eb0 - : "ằ" # U1eb1 - : "è" # Ue8 - : "ì" # Uec - : "ǹ" # U1f9 - : "ò" # Uf2 - : "ù" # Uf9 - : "ẁ" # U1e81 - : "ỳ" # U1ef3 - : "Ḕ" # U1e14 - : "Ṑ" # U1e50 - : "ḕ" # U1e15 - : "ṑ" # U1e51 - : "Ầ" # U1ea6 - : "Ề" # U1ec0 - : "Ồ" # U1ed2 - : "Ǜ" # U1db - : "ầ" # U1ea7 - : "ề" # U1ec1 - : "ồ" # U1ed3 - : "ǜ" # U1dc - : "Ằ" # U1eb0 - : "ằ" # U1eb1 - : "Ḕ" # U1e14 - : "ḕ" # U1e15 - : "Ṑ" # U1e50 - : "ṑ" # U1e51 - : "ѐ" # U450 - : "ѝ" # U45d - : "Ѐ" # U400 - : "Ѝ" # U40d - : "ῒ" # U1fd2 - : "ῢ" # U1fe2 - : "Ὰ" # U1fba - : "Ὲ" # U1fc8 - : "Ὴ" # U1fca - : "Ὶ" # U1fda - : "Ὸ" # U1ff8 - : "Ὺ" # U1fea - : "Ὼ" # U1ffa - : "ὰ" # U1f70 - : "ὲ" # U1f72 - : "ὴ" # U1f74 - : "ὶ" # U1f76 - : "ὸ" # U1f78 - : "ὺ" # U1f7a - : "ὼ" # U1f7c - : "ἂ" # U1f02 - : "ἃ" # U1f03 - : "Ἂ" # U1f0a - : "Ἃ" # U1f0b - : "ἒ" # U1f12 - : "ἓ" # U1f13 - : "Ἒ" # U1f1a - : "Ἓ" # U1f1b - : "ἢ" # U1f22 - : "ἣ" # U1f23 - : "Ἢ" # U1f2a - : "Ἣ" # U1f2b - : "ἲ" # U1f32 - : "ἳ" # U1f33 - : "Ἲ" # U1f3a - : "Ἳ" # U1f3b - : "ὂ" # U1f42 - : "ὃ" # U1f43 - : "Ὂ" # U1f4a - : "Ὃ" # U1f4b - : "ὒ" # U1f52 - : "ὓ" # U1f53 - : "Ὓ" # U1f5b - : "ὢ" # U1f62 - : "ὣ" # U1f63 - : "Ὢ" # U1f6a - : "Ὣ" # U1f6b - : "Ầ" # U1ea6 - : "Ề" # U1ec0 - : "Ồ" # U1ed2 - : "ầ" # U1ea7 - : "ề" # U1ec1 - : "ồ" # U1ed3 - : "Ḕ" # U1e14 - : "Ṑ" # U1e50 - : "ḕ" # U1e15 - : "ṑ" # U1e51 - : "Ằ" # U1eb0 - : "ằ" # U1eb1 - : "Ǜ" # U1db - : "ǜ" # U1dc - : "ῒ" # U1fd2 - : "ῢ" # U1fe2 - : "Ờ" # U1edc - : "Ừ" # U1eea - : "ờ" # U1edd - : "ừ" # U1eeb - : "Ἂ" # U1f0a - : "Ἒ" # U1f1a - : "Ἢ" # U1f2a - : "Ἲ" # U1f3a - : "Ὂ" # U1f4a - : "Ὢ" # U1f6a - : "ἂ" # U1f02 - : "ἒ" # U1f12 - : "ἢ" # U1f22 - : "ἲ" # U1f32 - : "ὂ" # U1f42 - : "ὒ" # U1f52 - : "ὢ" # U1f62 - : "Ἃ" # U1f0b - : "Ἓ" # U1f1b - : "Ἣ" # U1f2b - : "Ἳ" # U1f3b - : "Ὃ" # U1f4b - : "Ὓ" # U1f5b - : "Ὣ" # U1f6b - : "ἃ" # U1f03 - : "ἓ" # U1f13 - : "ἣ" # U1f23 - : "ἳ" # U1f33 - : "ὃ" # U1f43 - : "ὓ" # U1f53 - : "ὣ" # U1f63 - : "ä" # Ue4 - : "á" # Ue1 - : "ă" # U103 - : "å" # Ue5 - : "ą" # U105 - : "ā" # U101 - : "ą" # U105 - : "â" # Ue2 - : "â" # Ue2 - : "ª" # Uaa - : "à" # Ue0 - : "å" # Ue5 - : "æ" # Ue6 - : "ã" # Ue3 - : "ä" # Ue4 - : "á" # Ue1 - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "ḃ" # U1e03 - : "Ă" # U102 - : "Ĕ" # U114 - : "Ğ" # U11e - : "Ĭ" # U12c - : "Ŏ" # U14e - : "Ŭ" # U16c - : "ă" # U103 - : "ĕ" # U115 - : "ğ" # U11f - : "ĭ" # U12d - : "ŏ" # U14f - : "ŭ" # U16d - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "ӑ" # U4d1 - : "ӗ" # U4d7 - : "й" # U439 - : "ў" # U45e - : "ӂ" # U4c2 - : "Ӑ" # U4d0 - : "Ӗ" # U4d6 - : "Й" # U419 - : "Ў" # U40e - : "Ӂ" # U4c1 - : "Ᾰ" # U1fb8 - : "Ῐ" # U1fd8 - : "Ῠ" # U1fe8 - : "ᾰ" # U1fb0 - : "ῐ" # U1fd0 - : "ῠ" # U1fe0 - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "Ḝ" # U1e1c - : "ḝ" # U1e1d - : "Ặ" # U1eb6 - : "ặ" # U1eb7 - : "Ǚ" # U1d9 - : "ǚ" # U1da - : "ć" # U107 - : "ç" # Ue7 - : "ċ" # U10b - : "¢" # Ua2 - : "©" # Ua9 - : "č" # U10d - : "€" # U20ac - : "Ǎ" # U1cd - : "Č" # U10c - : "Ď" # U10e - : "Ě" # U11a - : "Ǧ" # U1e6 - : "Ȟ" # U21e - : "Ǐ" # U1cf - : "Ǩ" # U1e8 - : "Ľ" # U13d - : "Ň" # U147 - : "Ǒ" # U1d1 - : "Ř" # U158 - : "Š" # U160 - : "Ť" # U164 - : "Ǔ" # U1d3 - : "Ž" # U17d - : "ǎ" # U1ce - : "č" # U10d - : "ď" # U10f - : "ě" # U11b - : "ǧ" # U1e7 - : "ȟ" # U21f - : "ǐ" # U1d0 - : "ǰ" # U1f0 - : "ǩ" # U1e9 - : "ľ" # U13e - : "ň" # U148 - : "ǒ" # U1d2 - : "ř" # U159 - : "š" # U161 - : "ť" # U165 - : "ǔ" # U1d4 - : "ž" # U17e - : "¢" # Ua2 - : "Ǚ" # U1d9 - : "ǚ" # U1da - : "Ǚ" # U1d9 - : "ǚ" # U1da - : "ḑ" # U1e11 - : "đ" # U111 - : "ḋ" # U1e0b - : "ď" # U10f - : "₫" # U20ab - : "ð" # Uf0 - : "⌀" # U2300 - : "ë" # Ueb - : "é" # Ue9 - : "ę" # U119 - : "ē" # U113 - : "ė" # U117 - : "ę" # U119 - : "ě" # U11b - : "€" # U20ac - : "ê" # Uea - : "ê" # Uea - : "ē" # U113 - : "è" # Ue8 - : "ə" # U259 - : "ë" # Ueb - : "é" # Ue9 - : "ḟ" # U1e1f - : "ſ" # U17f - : "ff" # Ufb00 - : "fi" # Ufb01 - : "fl" # Ufb02 - : "ſ" # U17f - : "ğ" # U11f - : "ģ" # U123 - : "ġ" # U121 - : "ğ" # U11f - : ">" # U3e - : "ğ" # U11f - : "ğ" # U11f - : "ḩ" # U1e29 - : "ï" # Uef - : "í" # Ued - : "į" # U12f - : "ī" # U12b - : "ı" # U131 - : "į" # U12f - : "î" # Uee - : "î" # Uee - : "ī" # U12b - : "ì" # Uec - : "ij" # U133 - : "ĩ" # U129 - : "ï" # Uef - : "í" # Ued - : "ķ" # U137 - : "ĸ" # U138 - : "ĺ" # U13a - : "ļ" # U13c - : "£" # Ua3 - : "ł" # U142 - : "ľ" # U13e - : "£" # Ua3 - : "<" # U3c - : "|" # U7c - : "ṁ" # U1e41 - : "₥" # U20a5 - : "µ" # Ub5 - : "ń" # U144 - : "ņ" # U146 - : "ñ" # Uf1 - : "ň" # U148 - : "ŋ" # U14b - : "ñ" # Uf1 - : "ö" # Uf6 - : "ó" # Uf3 - : "ǫ" # U1eb - : "ō" # U14d - : "ø" # Uf8 - : "ǫ" # U1eb - : "ô" # Uf4 - : "Å" # Uc5 - : "©" # Ua9 - : "®" # Uae - : "Ů" # U16e - : "¤" # Ua4 - : "ô" # Uf4 - : "º" # Uba - : "ò" # Uf2 - : "å" # Ue5 - : "©" # Ua9 - : "œ" # U153 - : "°" # Ub0 - : "®" # Uae - : "§" # Ua7 - : "ů" # U16f - : "ẘ" # U1e98 - : "¤" # Ua4 - : "ẙ" # U1e99 - : "õ" # Uf5 - : "ö" # Uf6 - : "ó" # Uf3 - : "¶" # Ub6 - : "ṗ" # U1e57 - : "₽" # U20bd - : "ŕ" # U155 - : "ŗ" # U157 - : "ř" # U159 - : "₹" # U20b9 - : "§" # Ua7 - : "ś" # U15b - : "ş" # U15f - : "ṡ" # U1e61 - : "§" # Ua7 - : "¹" # Ub9 - : "²" # Ub2 - : "³" # Ub3 - : "ș" # U219 - : "š" # U161 - : "℠" # U2120 - : "℠" # U2120 - : "§" # Ua7 - : "ß" # Udf - : "ş" # U15f - : "ţ" # U163 - : "ŧ" # U167 - : "ṫ" # U1e6b - : "ŧ" # U167 - : "ț" # U21b - : "ť" # U165 - : "™" # U2122 - : "þ" # Ufe - : "™" # U2122 - : "ü" # Ufc - : "ú" # Ufa - : "ů" # U16f - : "ų" # U173 - : "ū" # U16b - : "µ" # Ub5 - : "ų" # U173 - : "û" # Ufb - : "Ă" # U102 - : "Ĕ" # U114 - : "Ğ" # U11e - : "Ĭ" # U12c - : "Ŏ" # U14e - : "Ŭ" # U16c - : "û" # Ufb - : "ū" # U16b - : "ù" # Uf9 - : "ă" # U103 - : "ĕ" # U115 - : "ğ" # U11f - : "ĭ" # U12d - : "ŏ" # U14f - : "ŭ" # U16d - : "ũ" # U169 - : "ü" # Ufc - : "ú" # Ufa - : "√" # U221a - : "Ǎ" # U1cd - : "Č" # U10c - : "Ď" # U10e - : "Ě" # U11a - : "Ǧ" # U1e6 - : "Ȟ" # U21e - : "Ǐ" # U1cf - : "Ǩ" # U1e8 - : "Ň" # U147 - : "Ǒ" # U1d1 - : "Ř" # U158 - : "Š" # U160 - : "Ť" # U164 - : "Ǔ" # U1d3 - : "Ž" # U17d - : "ǎ" # U1ce - : "č" # U10d - : "ď" # U10f - : "ě" # U11b - : "ǧ" # U1e7 - : "ȟ" # U21f - : "ǐ" # U1d0 - : "ǰ" # U1f0 - : "ǩ" # U1e9 - : "|" # U7c - : "ň" # U148 - : "ǒ" # U1d2 - : "ř" # U159 - : "š" # U161 - : "ť" # U165 - : "ǔ" # U1d4 - : "ž" # U17e - : "↓" # U2193 - : "ŵ" # U175 - : "¤" # Ua4 - : "¤" # Ua4 - : "¤" # Ua4 - : "×" # Ud7 - : "ÿ" # Uff - : "ý" # Ufd - : "¥" # Ua5 - : "¥" # Ua5 - : "ŷ" # U177 - : "ÿ" # Uff - : "ý" # Ufd - : "ź" # U17a - : "ż" # U17c - : "ž" # U17e - : "∅" # U2205 - : "¢" # Ua2 - : "↑" # U2191 - : "¢" # Ua2 - : "↓" # U2193 - : "⍭" # U236d - : "⍦" # U2366 - : "⌽" # U233d - : "⍅" # U2345 - : "⍆" # U2346 - : "⍋" # U234b - : "⍒" # U2352 - : "⍧" # U2367 - : "~" # U7e - : "ῗ" # U1fd7 - : "ῧ" # U1fe7 - : "Ἇ" # U1f0f - : "Ἧ" # U1f2f - : "Ἷ" # U1f3f - : "Ὗ" # U1f5f - : "Ὧ" # U1f6f - : "ἇ" # U1f07 - : "ἧ" # U1f27 - : "ἷ" # U1f37 - : "ὗ" # U1f57 - : "ὧ" # U1f67 - : "Ἆ" # U1f0e - : "Ἦ" # U1f2e - : "Ἶ" # U1f3e - : "Ὦ" # U1f6e - : "ἆ" # U1f06 - : "ἦ" # U1f26 - : "ἶ" # U1f36 - : "ὖ" # U1f56 - : "ὦ" # U1f66 - : "Ỡ" # U1ee0 - : "Ữ" # U1eee - : "ỡ" # U1ee1 - : "ữ" # U1eef - : "⍬" # U236c - : "Ã" # Uc3 - : "Ẽ" # U1ebc - : "Ĩ" # U128 - : "Ñ" # Ud1 - : "Õ" # Ud5 - : "Ũ" # U168 - : "Ṽ" # U1e7c - : "Ỹ" # U1ef8 - : "Ẫ" # U1eaa - : "Ễ" # U1ec4 - : "Ỗ" # U1ed6 - : "ẫ" # U1eab - : "ễ" # U1ec5 - : "ỗ" # U1ed7 - : "ã" # Ue3 - : "Ẵ" # U1eb4 - : "ẵ" # U1eb5 - : "ẽ" # U1ebd - : "ĩ" # U129 - : "ñ" # Uf1 - : "õ" # Uf5 - : "ũ" # U169 - : "ṽ" # U1e7d - : "ỹ" # U1ef9 - : "⍭" # U236d - : "≈" # U2248 - : "⍨" # U2368 - : "Ẫ" # U1eaa - : "Ễ" # U1ec4 - : "Ỗ" # U1ed6 - : "ẫ" # U1eab - : "ễ" # U1ec5 - : "ỗ" # U1ed7 - : "Ẵ" # U1eb4 - : "ẵ" # U1eb5 - : "ῗ" # U1fd7 - : "ῧ" # U1fe7 - : "ᾶ" # U1fb6 - : "ῆ" # U1fc6 - : "ῖ" # U1fd6 - : "ῦ" # U1fe6 - : "ῶ" # U1ff6 - : "ἆ" # U1f06 - : "ἇ" # U1f07 - : "Ἆ" # U1f0e - : "Ἇ" # U1f0f - : "ἦ" # U1f26 - : "ἧ" # U1f27 - : "Ἦ" # U1f2e - : "Ἧ" # U1f2f - : "ἶ" # U1f36 - : "ἷ" # U1f37 - : "Ἶ" # U1f3e - : "Ἷ" # U1f3f - : "ὖ" # U1f56 - : "ὗ" # U1f57 - : "Ὗ" # U1f5f - : "ὦ" # U1f66 - : "ὧ" # U1f67 - : "Ὦ" # U1f6e - : "Ὧ" # U1f6f - : "⍫" # U236b - : "⍲" # U2372 - : "⍱" # U2371 - : "Ẫ" # U1eaa - : "Ễ" # U1ec4 - : "Ỗ" # U1ed6 - : "ẫ" # U1eab - : "ễ" # U1ec5 - : "ỗ" # U1ed7 - : "Ẵ" # U1eb4 - : "ẵ" # U1eb5 - : "ῗ" # U1fd7 - : "ῧ" # U1fe7 - : "Ỡ" # U1ee0 - : "Ữ" # U1eee - : "ỡ" # U1ee1 - : "ữ" # U1eef - : "Ἆ" # U1f0e - : "Ἦ" # U1f2e - : "Ἶ" # U1f3e - : "Ὦ" # U1f6e - : "ἆ" # U1f06 - : "ἦ" # U1f26 - : "ἶ" # U1f36 - : "ὖ" # U1f56 - : "ὦ" # U1f66 - : "Ἇ" # U1f0f - : "Ἧ" # U1f2f - : "Ἷ" # U1f3f - : "Ὗ" # U1f5f - : "Ὧ" # U1f6f - : "ἇ" # U1f07 - : "ἧ" # U1f27 - : "ἷ" # U1f37 - : "ὗ" # U1f57 - : "ὧ" # U1f67 - : "΅" # U385 - : "⍣" # U2363 - : "⍩" # U2369 - : "Ä" # Uc4 - : "Ë" # Ucb - : "Ï" # Ucf - : "Ö" # Ud6 - : "Ü" # Udc - : "Ÿ" # U178 - : "῭" # U1fed - : "ä" # Ue4 - : "ë" # Ueb - : "ï" # Uef - : "ö" # Uf6 - : "ü" # Ufc - : "ÿ" # Uff - : "῁" # U1fc1 - : "΅" # U385 - : "⍥" # U2365 - : "⍡" # U2361 - : "⍢" # U2362 - : "⍤" # U2364 - : "῭" # U1fed - : "΅" # U385 - : "῁" # U1fc1 - : "Ḹ" # U1e38 - : "Ṝ" # U1e5c - : "ḹ" # U1e39 - : "ṝ" # U1e5d - : "Ǟ" # U1de - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ȫ" # U22b - : "ǖ" # U1d6 - : "Ǡ" # U1e0 - : "Ȱ" # U230 - : "ǡ" # U1e1 - : "ȱ" # U231 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ā" # U100 - : "Ē" # U112 - : "Ḡ" # U1e20 - : "Ī" # U12a - : "Ō" # U14c - : "Ū" # U16a - : "Ȳ" # U232 - : "ā" # U101 - : "ē" # U113 - : "ḡ" # U1e21 - : "ī" # U12b - : "ō" # U14d - : "ū" # U16b - : "ȳ" # U233 - : "Ȭ" # U22c - : "ȭ" # U22d - : "Ǟ" # U1de - : "Ǣ" # U1e2 - : "Ȭ" # U22c - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ǣ" # U1e3 - : "ȭ" # U22d - : "ȫ" # U22b - : "ǖ" # U1d6 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ǡ" # U1e0 - : "ǡ" # U1e1 - : "Ȱ" # U230 - : "ȱ" # U231 - : "ӣ" # U4e3 - : "ӯ" # U4ef - : "Ӣ" # U4e2 - : "Ӯ" # U4ee - : "Ᾱ" # U1fb9 - : "Ῑ" # U1fd9 - : "Ῡ" # U1fe9 - : "ᾱ" # U1fb1 - : "ῑ" # U1fd1 - : "ῡ" # U1fe1 - : "⍑" # U2351 - : "Ḹ" # U1e38 - : "ḹ" # U1e39 - : "Ṝ" # U1e5c - : "ṝ" # U1e5d - : "Ȭ" # U22c - : "ȭ" # U22d - : "Ǡ" # U1e0 - : "Ȱ" # U230 - : "ǡ" # U1e1 - : "ȱ" # U231 - : "Ǟ" # U1de - : "Ȫ" # U22a - : "Ǖ" # U1d5 - : "ǟ" # U1df - : "ȫ" # U22b - : "ǖ" # U1d6 - : "Ǭ" # U1ec - : "ǭ" # U1ed - : "Ḹ" # U1e38 - : "Ṝ" # U1e5c - : "ḹ" # U1e39 - : "ṝ" # U1e5d - : "Ḯ" # U1e2e - : "Ǘ" # U1d7 - : "ḯ" # U1e2f - : "ǘ" # U1d8 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "Ἅ" # U1f0d - : "Ἕ" # U1f1d - : "Ἥ" # U1f2d - : "Ἵ" # U1f3d - : "Ὅ" # U1f4d - : "Ὕ" # U1f5d - : "Ὥ" # U1f6d - : "ἅ" # U1f05 - : "ἕ" # U1f15 - : "ἥ" # U1f25 - : "ἵ" # U1f35 - : "ὅ" # U1f45 - : "ὕ" # U1f55 - : "ὥ" # U1f65 - : "Ἄ" # U1f0c - : "Ἔ" # U1f1c - : "Ἤ" # U1f2c - : "Ἴ" # U1f3c - : "Ὄ" # U1f4c - : "Ὤ" # U1f6c - : "ἄ" # U1f04 - : "ἔ" # U1f14 - : "ἤ" # U1f24 - : "ἴ" # U1f34 - : "ὄ" # U1f44 - : "ὔ" # U1f54 - : "ὤ" # U1f64 - : "Ớ" # U1eda - : "Ứ" # U1ee8 - : "ớ" # U1edb - : "ứ" # U1ee9 - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "Á" # Uc1 - : "Ć" # U106 - : "É" # Uc9 - : "Ǵ" # U1f4 - : "Í" # Ucd - : "Ḱ" # U1e30 - : "Ĺ" # U139 - : "Ḿ" # U1e3e - : "Ń" # U143 - : "Ó" # Ud3 - : "Ṕ" # U1e54 - : "Ŕ" # U154 - : "Ś" # U15a - : "Ú" # Uda - : "Ẃ" # U1e82 - : "Ý" # Udd - : "Ź" # U179 - : "Ấ" # U1ea4 - : "Ế" # U1ebe - : "Ố" # U1ed0 - : "ấ" # U1ea5 - : "ế" # U1ebf - : "ố" # U1ed1 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "á" # Ue1 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "ć" # U107 - : "é" # Ue9 - : "ǵ" # U1f5 - : "í" # Ued - : "ḱ" # U1e31 - : "ĺ" # U13a - : "ḿ" # U1e3f - : "ń" # U144 - : "ó" # Uf3 - : "ṕ" # U1e55 - : "ŕ" # U155 - : "ś" # U15b - : "ú" # Ufa - : "ẃ" # U1e83 - : "ý" # Ufd - : "ź" # U17a - : "Ṍ" # U1e4c - : "Ṹ" # U1e78 - : "ṍ" # U1e4d - : "ṹ" # U1e79 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ấ" # U1ea4 - : "Ǻ" # U1fa - : "Ǽ" # U1fc - : "Ḉ" # U1e08 - : "Ế" # U1ebe - : "Ḯ" # U1e2e - : "Ố" # U1ed0 - : "Ṍ" # U1e4c - : "Ǿ" # U1fe - : "Ǘ" # U1d7 - : "ấ" # U1ea5 - : "ǻ" # U1fb - : "ǽ" # U1fd - : "ḉ" # U1e09 - : "ế" # U1ebf - : "ḯ" # U1e2f - : "ố" # U1ed1 - : "ṍ" # U1e4d - : "ǿ" # U1ff - : "ǘ" # U1d8 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "Ḗ" # U1e16 - : "ḗ" # U1e17 - : "Ṓ" # U1e52 - : "Ṹ" # U1e78 - : "ṓ" # U1e53 - : "ṹ" # U1e79 - : "ѓ" # U453 - : "ќ" # U45c - : "Ѓ" # U403 - : "Ќ" # U40c - : "ΐ" # U390 - : "ΰ" # U3b0 - : "Ά" # U386 - : "Έ" # U388 - : "Ή" # U389 - : "Ί" # U38a - : "Ό" # U38c - : "Ύ" # U38e - : "Ώ" # U38f - : "ά" # U3ac - : "έ" # U3ad - : "ή" # U3ae - : "ί" # U3af - : "ό" # U3cc - : "ύ" # U3cd - : "ώ" # U3ce - : "ἄ" # U1f04 - : "ἅ" # U1f05 - : "Ἄ" # U1f0c - : "Ἅ" # U1f0d - : "ἔ" # U1f14 - : "ἕ" # U1f15 - : "Ἔ" # U1f1c - : "Ἕ" # U1f1d - : "ἤ" # U1f24 - : "ἥ" # U1f25 - : "Ἤ" # U1f2c - : "Ἥ" # U1f2d - : "ἴ" # U1f34 - : "ἵ" # U1f35 - : "Ἴ" # U1f3c - : "Ἵ" # U1f3d - : "ὄ" # U1f44 - : "ὅ" # U1f45 - : "Ὄ" # U1f4c - : "Ὅ" # U1f4d - : "ὔ" # U1f54 - : "ὕ" # U1f55 - : "Ὕ" # U1f5d - : "ὤ" # U1f64 - : "ὥ" # U1f65 - : "Ὤ" # U1f6c - : "Ὥ" # U1f6d - : "Ấ" # U1ea4 - : "Ế" # U1ebe - : "Ố" # U1ed0 - : "ấ" # U1ea5 - : "ế" # U1ebf - : "ố" # U1ed1 - : "Ṍ" # U1e4c - : "Ṹ" # U1e78 - : "ṍ" # U1e4d - : "ṹ" # U1e79 - : "Ḗ" # U1e16 - : "Ṓ" # U1e52 - : "ḗ" # U1e17 - : "ṓ" # U1e53 - : "Ắ" # U1eae - : "ắ" # U1eaf - : "Ḯ" # U1e2e - : "Ǘ" # U1d7 - : "ḯ" # U1e2f - : "ǘ" # U1d8 - : "ΐ" # U390 - : "ΰ" # U3b0 - : "Ǻ" # U1fa - : "ǻ" # U1fb - : "Ḉ" # U1e08 - : "ḉ" # U1e09 - : "Ớ" # U1eda - : "Ứ" # U1ee8 - : "ớ" # U1edb - : "ứ" # U1ee9 - : "Ἄ" # U1f0c - : "Ἔ" # U1f1c - : "Ἤ" # U1f2c - : "Ἴ" # U1f3c - : "Ὄ" # U1f4c - : "Ὤ" # U1f6c - : "ἄ" # U1f04 - : "ἔ" # U1f14 - : "ἤ" # U1f24 - : "ἴ" # U1f34 - : "ὄ" # U1f44 - : "ὔ" # U1f54 - : "ὤ" # U1f64 - : "Ἅ" # U1f0d - : "Ἕ" # U1f1d - : "Ἥ" # U1f2d - : "Ἵ" # U1f3d - : "Ὅ" # U1f4d - : "Ὕ" # U1f5d - : "Ὥ" # U1f6d - : "ἅ" # U1f05 - : "ἕ" # U1f15 - : "ἥ" # U1f25 - : "ἵ" # U1f35 - : "ὅ" # U1f45 - : "ὕ" # U1f55 - : "ὥ" # U1f65 - : "Ǿ" # U1fe - : "ǿ" # U1ff - : "Ç" # Uc7 - : "Ḑ" # U1e10 - : "Ȩ" # U228 - : "Ģ" # U122 - : "Ḩ" # U1e28 - : "Ķ" # U136 - : "Ļ" # U13b - : "Ņ" # U145 - : "Ŗ" # U156 - : "Ş" # U15e - : "Ţ" # U162 - : "ç" # Ue7 - : "ḑ" # U1e11 - : "ȩ" # U229 - : "ģ" # U123 - : "ḩ" # U1e29 - : "ķ" # U137 - : "ļ" # U13c - : "ņ" # U146 - : "ŗ" # U157 - : "ş" # U15f - : "ţ" # U163 - : "⌹" # U2339 - : "Ğ" # U11e - : "ğ" # U11f - : "יִ" # Ufb1d - : "ײַ" # Ufb1f - : "אַ" # Ufb2e - : "אָ" # Ufb2f - : "וֹ" # Ufb4b - : "אּ" # Ufb30 - : "בּ" # Ufb31 - : "גּ" # Ufb32 - : "דּ" # Ufb33 - : "הּ" # Ufb34 - : "וּ" # Ufb35 - : "זּ" # Ufb36 - : "טּ" # Ufb38 - : "יּ" # Ufb39 - : "ךּ" # Ufb3a - : "כּ" # Ufb3b - : "לּ" # Ufb3c - : "מּ" # Ufb3e - : "נּ" # Ufb40 - : "סּ" # Ufb41 - : "ףּ" # Ufb43 - : "פּ" # Ufb44 - : "צּ" # Ufb46 - : "קּ" # Ufb47 - : "רּ" # Ufb48 - : "שּ" # Ufb49 - : "תּ" # Ufb4a - : "בֿ" # Ufb4c - : "כֿ" # Ufb4d - : "פֿ" # Ufb4e - : "שּׁ" # Ufb2c - : "שׁ" # Ufb2a - : "שּׁ" # Ufb2c - : "שּׂ" # Ufb2d - : "שׂ" # Ufb2b - : "שּׂ" # Ufb2d - : "آ" # U622 - : "أ" # U623 - : "ؤ" # U624 - : "ئ" # U626 - : "ۂ" # U6c2 - : "ۓ" # U6d3 - : "ۀ" # U6c0 - : "إ" # U625 - : "§" # Ua7 - : "₽" # U20bd - : "€" # U20ac - : "№" # U2116 - : "№" # U2116 - : "€" # U20ac - : "₽" # U20bd - : "Ά" # U386 - : "Έ" # U388 - : "Ή" # U389 - : "Ϊ" # U3aa - : "Ί" # U38a - : "Ό" # U38c - : "Ϋ" # U3ab - : "Ύ" # U38e - : "Ώ" # U38f - : "ά" # U3ac - : "έ" # U3ad - : "ή" # U3ae - : "ϊ" # U3ca - : "ί" # U3af : "ᾍ" # U1f8d : "ᾝ" # U1f9d : "ᾭ" # U1fad @@ -3666,21 +4755,6 @@ : "ᾄ" # U1f84 : "ᾔ" # U1f94 : "ᾤ" # U1fa4 - : "ᾴ" # U1fb4 - : "ῄ" # U1fc4 - : "ῴ" # U1ff4 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾬ" # U1fac - : "ᾭ" # U1fad : "ᾌ" # U1f8c : "ᾜ" # U1f9c : "ᾬ" # U1fac @@ -3693,18 +4767,6 @@ : "ᾅ" # U1f85 : "ᾕ" # U1f95 : "ᾥ" # U1fa5 - : "ᾉ" # U1f89 - : "ᾙ" # U1f99 - : "ᾩ" # U1fa9 - : "ᾁ" # U1f81 - : "ᾑ" # U1f91 - : "ᾡ" # U1fa1 - : "ᾈ" # U1f88 - : "ᾘ" # U1f98 - : "ᾨ" # U1fa8 - : "ᾀ" # U1f80 - : "ᾐ" # U1f90 - : "ᾠ" # U1fa0 : "ᾋ" # U1f8b : "ᾛ" # U1f9b : "ᾫ" # U1fab @@ -3717,21 +4779,6 @@ : "ᾂ" # U1f82 : "ᾒ" # U1f92 : "ᾢ" # U1fa2 - : "ᾲ" # U1fb2 - : "ῂ" # U1fc2 - : "ῲ" # U1ff2 - : "ᾂ" # U1f82 - : "ᾃ" # U1f83 - : "ᾊ" # U1f8a - : "ᾋ" # U1f8b - : "ᾒ" # U1f92 - : "ᾓ" # U1f93 - : "ᾚ" # U1f9a - : "ᾛ" # U1f9b - : "ᾢ" # U1fa2 - : "ᾣ" # U1fa3 - : "ᾪ" # U1faa - : "ᾫ" # U1fab : "ᾊ" # U1f8a : "ᾚ" # U1f9a : "ᾪ" # U1faa @@ -3756,21 +4803,6 @@ : "ᾆ" # U1f86 : "ᾖ" # U1f96 : "ᾦ" # U1fa6 - : "ᾷ" # U1fb7 - : "ῇ" # U1fc7 - : "ῷ" # U1ff7 - : "ᾆ" # U1f86 - : "ᾇ" # U1f87 - : "ᾎ" # U1f8e - : "ᾏ" # U1f8f - : "ᾖ" # U1f96 - : "ᾗ" # U1f97 - : "ᾞ" # U1f9e - : "ᾟ" # U1f9f - : "ᾦ" # U1fa6 - : "ᾧ" # U1fa7 - : "ᾮ" # U1fae - : "ᾯ" # U1faf : "ᾎ" # U1f8e : "ᾞ" # U1f9e : "ᾮ" # U1fae @@ -3795,21 +4827,6 @@ : "ᾄ" # U1f84 : "ᾔ" # U1f94 : "ᾤ" # U1fa4 - : "ᾴ" # U1fb4 - : "ῄ" # U1fc4 - : "ῴ" # U1ff4 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾬ" # U1fac - : "ᾭ" # U1fad : "ᾌ" # U1f8c : "ᾜ" # U1f9c : "ᾬ" # U1fac @@ -3822,69 +4839,6 @@ : "ᾅ" # U1f85 : "ᾕ" # U1f95 : "ᾥ" # U1fa5 - : "ᾴ" # U1fb4 - : "ῄ" # U1fc4 - : "ῴ" # U1ff4 - : "ᾼ" # U1fbc - : "ῌ" # U1fcc - : "ῼ" # U1ffc - : "ᾳ" # U1fb3 - : "ῃ" # U1fc3 - : "ῳ" # U1ff3 - : "ᾀ" # U1f80 - : "ᾁ" # U1f81 - : "ᾂ" # U1f82 - : "ᾃ" # U1f83 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾆ" # U1f86 - : "ᾇ" # U1f87 - : "ᾈ" # U1f88 - : "ᾉ" # U1f89 - : "ᾊ" # U1f8a - : "ᾋ" # U1f8b - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾎ" # U1f8e - : "ᾏ" # U1f8f - : "ᾐ" # U1f90 - : "ᾑ" # U1f91 - : "ᾒ" # U1f92 - : "ᾓ" # U1f93 - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾖ" # U1f96 - : "ᾗ" # U1f97 - : "ᾘ" # U1f98 - : "ᾙ" # U1f99 - : "ᾚ" # U1f9a - : "ᾛ" # U1f9b - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾞ" # U1f9e - : "ᾟ" # U1f9f - : "ᾠ" # U1fa0 - : "ᾡ" # U1fa1 - : "ᾢ" # U1fa2 - : "ᾣ" # U1fa3 - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾦ" # U1fa6 - : "ᾧ" # U1fa7 - : "ᾨ" # U1fa8 - : "ᾩ" # U1fa9 - : "ᾪ" # U1faa - : "ᾫ" # U1fab - : "ᾬ" # U1fac - : "ᾭ" # U1fad - : "ᾮ" # U1fae - : "ᾯ" # U1faf - : "ᾲ" # U1fb2 - : "ῂ" # U1fc2 - : "ῲ" # U1ff2 - : "ᾷ" # U1fb7 - : "ῇ" # U1fc7 - : "ῷ" # U1ff7 : "ᾋ" # U1f8b : "ᾛ" # U1f9b : "ᾫ" # U1fab @@ -3897,21 +4851,6 @@ : "ᾂ" # U1f82 : "ᾒ" # U1f92 : "ᾢ" # U1fa2 - : "ᾲ" # U1fb2 - : "ῂ" # U1fc2 - : "ῲ" # U1ff2 - : "ᾂ" # U1f82 - : "ᾃ" # U1f83 - : "ᾊ" # U1f8a - : "ᾋ" # U1f8b - : "ᾒ" # U1f92 - : "ᾓ" # U1f93 - : "ᾚ" # U1f9a - : "ᾛ" # U1f9b - : "ᾢ" # U1fa2 - : "ᾣ" # U1fa3 - : "ᾪ" # U1faa - : "ᾫ" # U1fab : "ᾊ" # U1f8a : "ᾚ" # U1f9a : "ᾪ" # U1faa @@ -3936,21 +4875,6 @@ : "ᾄ" # U1f84 : "ᾔ" # U1f94 : "ᾤ" # U1fa4 - : "ᾴ" # U1fb4 - : "ῄ" # U1fc4 - : "ῴ" # U1ff4 - : "ᾄ" # U1f84 - : "ᾅ" # U1f85 - : "ᾌ" # U1f8c - : "ᾍ" # U1f8d - : "ᾔ" # U1f94 - : "ᾕ" # U1f95 - : "ᾜ" # U1f9c - : "ᾝ" # U1f9d - : "ᾤ" # U1fa4 - : "ᾥ" # U1fa5 - : "ᾬ" # U1fac - : "ᾭ" # U1fad : "ᾌ" # U1f8c : "ᾜ" # U1f9c : "ᾬ" # U1fac @@ -3975,21 +4899,6 @@ : "ᾆ" # U1f86 : "ᾖ" # U1f96 : "ᾦ" # U1fa6 - : "ᾷ" # U1fb7 - : "ῇ" # U1fc7 - : "ῷ" # U1ff7 - : "ᾆ" # U1f86 - : "ᾇ" # U1f87 - : "ᾎ" # U1f8e - : "ᾏ" # U1f8f - : "ᾖ" # U1f96 - : "ᾗ" # U1f97 - : "ᾞ" # U1f9e - : "ᾟ" # U1f9f - : "ᾦ" # U1fa6 - : "ᾧ" # U1fa7 - : "ᾮ" # U1fae - : "ᾯ" # U1faf : "ᾎ" # U1f8e : "ᾞ" # U1f9e : "ᾮ" # U1fae @@ -4001,478 +4910,4 @@ : "ᾯ" # U1faf : "ᾇ" # U1f87 : "ᾗ" # U1f97 - : "ᾈ" # U1f88 - : "ᾘ" # U1f98 - : "ᾨ" # U1fa8 - : "ᾀ" # U1f80 - : "ᾐ" # U1f90 - : "ᾠ" # U1fa0 - : "ᾉ" # U1f89 - : "ᾙ" # U1f99 - : "ᾩ" # U1fa9 - : "ᾁ" # U1f81 - : "ᾑ" # U1f91 - : "ᾡ" # U1fa1 - : "ό" # U3cc - : "ϋ" # U3cb - : "ύ" # U3cd - : "ώ" # U3ce - : "≰" # U2270 - : "≱" # U2271 - : "≇" # U2247 - : "≢" # U2262 - : "⊄" # U2284 - : "⊅" # U2285 - : "⍦" # U2366 - : "क़" # U958 - : "ख़" # U959 - : "ग़" # U95a - : "ज़" # U95b - : "ड़" # U95c - : "ढ़" # U95d - : "ऩ" # U929 - : "फ़" # U95e - : "य़" # U95f - : "ऱ" # U931 - : "ऴ" # U934 - : "ড়" # U9dc - : "ঢ়" # U9dd - : "য়" # U9df - : "ো" # U9cb - : "ৌ" # U9cc - : "ਖ਼" # Ua59 - : "ਗ਼" # Ua5a - : "ਜ਼" # Ua5b - : "ਫ਼" # Ua5e - : "ਲ਼" # Ua33 - : "ਸ਼" # Ua36 - : "⍟" # U235f - : "⊖" # U2296 - : "⊙" # U2299 - : "⍉" # U2349 - : "⍜" # U235c - : "⌽" # U233d - : "⍥" # U2365 - : "⌾" # U233e - : "⌼" # U233c - : "ଡ଼" # Ub5c - : "ଢ଼" # Ub5d - : "ୋ" # Ub4b - : "ୈ" # Ub48 - : "ୌ" # Ub4c - : "≮" # U226e - : "≯" # U226f - : "⍊" # U234a - : "⌶" # U2336 - : "⍎" # U234e - : "₍" # U208d - : "₎" # U208e - : "₊" # U208a - : "₀" # U2080 - : "₁" # U2081 - : "₂" # U2082 - : "₃" # U2083 - : "₄" # U2084 - : "₅" # U2085 - : "₆" # U2086 - : "₇" # U2087 - : "₈" # U2088 - : "₉" # U2089 - : "₌" # U208c - : "ொ" # Ubca - : "ௌ" # Ubcc - : "₋" # U208b - : "₂" # U2082 - : "₊" # U208a - : "₀" # U2080 - : "₁" # U2081 - : "₂" # U2082 - : "₃" # U2083 - : "₄" # U2084 - : "₅" # U2085 - : "₆" # U2086 - : "₇" # U2087 - : "₈" # U2088 - : "₉" # U2089 - : "₌" # U208c - : "ோ" # Ubcb - : "⍡" # U2361 - : "⍑" # U2351 - : "⌶" # U2336 - : "⍕" # U2355 - : "ஔ" # Ub94 - : "⊅" # U2285 - : "⊄" # U2284 - : "⊬" # U22ac - : "ై" # Uc48 - : "ೀ" # Ucc0 - : "ೊ" # Ucca - : "ೇ" # Ucc7 - : "ೈ" # Ucc8 - : "ೋ" # Uccb - : "ൊ" # Ud4a - : "ൌ" # Ud4c - : "ോ" # Ud4b - : "ේ" # Udda - : "ො" # Uddc - : "ෞ" # Udde - : "ෝ" # Uddd - : "ཱི" # Uf73 - : "ཱུ" # Uf75 - : "ཱྀ" # Uf81 - : "ྐྵ" # Ufb9 - : "ྒྷ" # Uf93 - : "ྜྷ" # Uf9d - : "ྡྷ" # Ufa2 - : "ྦྷ" # Ufa7 - : "ྫྷ" # Ufac - : "ྲྀ" # Uf76 - : "ླྀ" # Uf78 - : "ཀྵ" # Uf69 - : "གྷ" # Uf43 - : "ཌྷ" # Uf4d - : "དྷ" # Uf52 - : "བྷ" # Uf57 - : "ཛྷ" # Uf5c - : "ဦ" # U1026 - : "ᄁ" # U1101 - : "ᄓ" # U1113 - : "ᄔ" # U1114 - : "ᄕ" # U1115 - : "ᄖ" # U1116 - : "ᄗ" # U1117 - : "ᄄ" # U1104 - : "ᄘ" # U1118 - : "ᄙ" # U1119 - : "ᄛ" # U111b - : "ᄚ" # U111a - : "ᄜ" # U111c - : "ᄝ" # U111d - : "ᄞ" # U111e - : "ᄟ" # U111f - : "ᄠ" # U1120 - : "ᄈ" # U1108 - : "ᄡ" # U1121 - : "ᄥ" # U1125 - : "ᄫ" # U112b - : "ᄧ" # U1127 - : "ᄨ" # U1128 - : "ᄩ" # U1129 - : "ᄪ" # U112a - : "ᄬ" # U112c - : "ᄢ" # U1122 - : "ᄣ" # U1123 - : "ᄤ" # U1124 - : "ᄦ" # U1126 - : "ᄬ" # U112c - : "ᄭ" # U112d - : "ᄮ" # U112e - : "ᄯ" # U112f - : "ᄰ" # U1130 - : "ᄱ" # U1131 - : "ᄲ" # U1132 - : "ᄊ" # U110a - : "ᄴ" # U1134 - : "ᄵ" # U1135 - : "ᄶ" # U1136 - : "ᄷ" # U1137 - : "ᄸ" # U1138 - : "ᄹ" # U1139 - : "ᄺ" # U113a - : "ᄻ" # U113b - : "ᄳ" # U1133 - : "ᄴ" # U1134 - : "ᅁ" # U1141 - : "ᅂ" # U1142 - : "ᅃ" # U1143 - : "ᅄ" # U1144 - : "ᅅ" # U1145 - : "ᅇ" # U1147 - : "ᅈ" # U1148 - : "ᅉ" # U1149 - : "ᅊ" # U114a - : "ᅋ" # U114b - : "ᅆ" # U1146 - : "ᅍ" # U114d - : "ᄍ" # U110d - : "ᅒ" # U1152 - : "ᅓ" # U1153 - : "ᅖ" # U1156 - : "ᅗ" # U1157 - : "ᅘ" # U1158 - : "ᄢ" # U1122 - : "ᄣ" # U1123 - : "ᄤ" # U1124 - : "ᄥ" # U1125 - : "ᄦ" # U1126 - : "ᄳ" # U1133 - : "ᄽ" # U113d - : "ᄿ" # U113f - : "ᅏ" # U114f - : "ᅑ" # U1151 - : "ᅶ" # U1176 - : "ᅷ" # U1177 - : "ᅢ" # U1162 - : "ᅸ" # U1178 - : "ᅹ" # U1179 - : "ᅤ" # U1164 - : "ᅺ" # U117a - : "ᅻ" # U117b - : "ᅼ" # U117c - : "ᅦ" # U1166 - : "ᅽ" # U117d - : "ᅾ" # U117e - : "ᅨ" # U1168 - : "ᅪ" # U116a - : "ᅫ" # U116b - : "ᅿ" # U117f - : "ᆀ" # U1180 - : "ᆁ" # U1181 - : "ᆂ" # U1182 - : "ᆃ" # U1183 - : "ᅬ" # U116c - : "ᅫ" # U116b - : "ᆄ" # U1184 - : "ᆅ" # U1185 - : "ᆆ" # U1186 - : "ᆇ" # U1187 - : "ᆈ" # U1188 - : "ᆉ" # U1189 - : "ᆊ" # U118a - : "ᅯ" # U116f - : "ᅰ" # U1170 - : "ᆌ" # U118c - : "ᆍ" # U118d - : "ᅱ" # U1171 - : "ᆋ" # U118b - : "ᆋ" # U118b - : "ᅰ" # U1170 - : "ᆎ" # U118e - : "ᆏ" # U118f - : "ᆐ" # U1190 - : "ᆑ" # U1191 - : "ᆒ" # U1192 - : "ᆓ" # U1193 - : "ᆔ" # U1194 - : "ᆕ" # U1195 - : "ᆖ" # U1196 - : "ᅴ" # U1174 - : "ᆗ" # U1197 - : "ᆘ" # U1198 - : "ᆙ" # U1199 - : "ᆚ" # U119a - : "ᆛ" # U119b - : "ᆜ" # U119c - : "ᆝ" # U119d - : "ᆟ" # U119f - : "ᆠ" # U11a0 - : "ᆡ" # U11a1 - : "ᆢ" # U11a2 - : "ᆩ" # U11a9 - : "ᇃ" # U11c3 - : "ᆪ" # U11aa - : "ᇄ" # U11c4 - : "ᇄ" # U11c4 - : "ᇅ" # U11c5 - : "ᇆ" # U11c6 - : "ᇇ" # U11c7 - : "ᆬ" # U11ac - : "ᇉ" # U11c9 - : "ᆭ" # U11ad - : "ᇈ" # U11c8 - : "ᇊ" # U11ca - : "ᇋ" # U11cb - : "ᆰ" # U11b0 - : "ᇌ" # U11cc - : "ᇍ" # U11cd - : "ᇎ" # U11ce - : "ᇐ" # U11d0 - : "ᆱ" # U11b1 - : "ᆲ" # U11b2 - : "ᇓ" # U11d3 - : "ᆳ" # U11b3 - : "ᇖ" # U11d6 - : "ᇘ" # U11d8 - : "ᆴ" # U11b4 - : "ᆵ" # U11b5 - : "ᆶ" # U11b6 - : "ᇑ" # U11d1 - : "ᇒ" # U11d2 - : "ᇔ" # U11d4 - : "ᇕ" # U11d5 - : "ᇗ" # U11d7 - : "ᇙ" # U11d9 - : "ᇌ" # U11cc - : "ᇑ" # U11d1 - : "ᇒ" # U11d2 - : "ᇓ" # U11d3 - : "ᇕ" # U11d5 - : "ᇔ" # U11d4 - : "ᇖ" # U11d6 - : "ᇚ" # U11da - : "ᇛ" # U11db - : "ᇜ" # U11dc - : "ᇝ" # U11dd - : "ᇞ" # U11de - : "ᇢ" # U11e2 - : "ᇠ" # U11e0 - : "ᇡ" # U11e1 - : "ᇟ" # U11df - : "ᇣ" # U11e3 - : "ᆹ" # U11b9 - : "ᇦ" # U11e6 - : "ᇤ" # U11e4 - : "ᇥ" # U11e5 - : "ᇧ" # U11e7 - : "ᇨ" # U11e8 - : "ᇩ" # U11e9 - : "ᇪ" # U11ea - : "ᆻ" # U11bb - : "ᇬ" # U11ec - : "ᇭ" # U11ed - : "ᇮ" # U11ee - : "ᇯ" # U11ef - : "ᇳ" # U11f3 - : "ᇴ" # U11f4 - : "ᇵ" # U11f5 - : "ᇶ" # U11f6 - : "ᇷ" # U11f7 - : "ᇸ" # U11f8 - : "ᇏ" # U11cf - : "ᇞ" # U11de - : "ᇭ" # U11ed - : "ᇱ" # U11f1 - : "ᇲ" # U11f2 - : "῎" # U1fce - : "῍" # U1fcd - : "῏" # U1fcf - : "῎" # U1fce - : "῍" # U1fcd - : "῎" # U1fce - : "῏" # U1fcf - : "῞" # U1fde - : "῝" # U1fdd - : "῟" # U1fdf - : "῞" # U1fde - : "῝" # U1fdd - : "῞" # U1fde - : "῟" # U1fdf - : "⍅" # U2345 - : "⍇" # U2347 - : "⍏" # U234f - : "⍐" # U2350 - : "⍆" # U2346 - : "⍈" # U2348 - : "⍖" # U2356 - : "⍗" # U2357 - : "∄" # U2204 - : "⍙" # U2359 - : "⍋" # U234b - : "⍍" # U234d - : "⍒" # U2352 - : "⍫" # U236b - : "⍢" # U2362 - : "⍔" # U2354 - : "∉" # U2209 - : "⍷" # U2377 - : "∌" # U220c - : "⍛" # U235b - : "⍤" # U2364 - : "⌾" # U233e - : "⍎" # U234e - : "⍕" # U2355 - : "⍝" # U235d - : "⌻" # U233b - : "∤" # U2224 - : "∦" # U2226 - : "⍲" # U2372 - : "⋄" # U22c4 - : "⍓" # U2353 - : "⍱" # U2371 - : "⋄" # U22c4 - : "⍌" # U234c - : "⍝" # U235d - : "≁" # U2241 - : "≄" # U2244 - : "≉" # U2249 - : "≭" # U226d - : "≢" # U2262 - : "⍯" # U236f - : "≴" # U2274 - : "≵" # U2275 - : "≸" # U2278 - : "≹" # U2279 - : "⊀" # U2280 - : "⊁" # U2281 - : "⋠" # U22e0 - : "⋡" # U22e1 - : "⊆" # U2286 - : "⍧" # U2367 - : "⊇" # U2287 - : "⊈" # U2288 - : "⊉" # U2289 - : "⋢" # U22e2 - : "⋣" # U22e3 - : "⊭" # U22ad - : "⊮" # U22ae - : "⊯" # U22af - : "⋪" # U22ea - : "⋫" # U22eb - : "⋬" # U22ec - : "⋭" # U22ed - : "⍚" # U235a - : "⌺" # U233a - : "⍸" # U2378 - : "⍹" # U2379 - : "⍶" # U2376 - : "⍞" # U235e - : "⍁" # U2341 - : "⍠" # U2360 - : "⍃" # U2343 - : "⌸" # U2338 - : "⍄" # U2344 - : "⍰" # U2370 - : "⍂" # U2342 - : "⌹" # U2339 - : "⌼" # U233c - : "⍇" # U2347 - : "⍐" # U2350 - : "⍈" # U2348 - : "⍗" # U2357 - : "⍍" # U234d - : "⍔" # U2354 - : "⌻" # U233b - : "⍓" # U2353 - : "⍌" # U234c - : "⍯" # U236f - : "⌺" # U233a - : "⫝̸" # U2adc - : "ẛ" # U1e9b - : "Đ" # U110 - : "Ǥ" # U1e4 - : "Ħ" # U126 - : "Ɨ" # U197 - : "Ł" # U141 - : "Ø" # Ud8 - : "Ŧ" # U166 - : "Ƶ" # U1b5 - : "ƀ" # U180 - : "đ" # U111 - : "ǥ" # U1e5 - : "ħ" # U127 - : "ɨ" # U268 - : "ł" # U142 - : "ø" # Uf8 - : "ŧ" # U167 - : "ƶ" # U1b6 - : "ʡ" # U2a1 - : "Ұ" # U4b0 - : "ұ" # U4b1 - : "ғ" # U493 - : "ҟ" # U49f - : "Ғ" # U492 - : "Ҟ" # U49e - : "↚" # U219a - : "↛" # U219b - : "↮" # U21ae - : "≠" # U2260 + : "ᾧ" # U1fa7 diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index f2875c46c1..23a95b0d27 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -1,6 +1,8 @@ #include #include +#include + #include "../gtk/gtkcomposetable.h" #include "../gtk/gtkimcontextsimpleseqs.h" #include "testsuite/testutils.h" @@ -33,43 +35,59 @@ append_escaped (GString *str, } } +static void +print_sequence (gunichar *sequence, + int len, + const char *value, + gpointer data) +{ + GString *str = data; + + for (int j = 0; j < len; j++) + g_string_append_printf (str, " ", sequence[j]); + + g_string_append (str, ": \""); + append_escaped (str, value); + g_string_append (str, "\""); + + if (g_utf8_strlen (value, -1) == 1) + { + gunichar ch = g_utf8_get_char (value); + g_string_append_printf (str, " # U%x", ch); + } + + g_string_append_c (str, '\n'); +} + static char * gtk_compose_table_print (GtkComposeTable *table) { - int i, j; - guint16 *seq; GString *str; str = g_string_new (""); - g_string_append_printf (str, "# n_seqs: %d\n# max_seq_len: %d\n", - table->n_seqs, - table->max_seq_len); + g_string_append_printf (str, "# max_seq_len: %d\n# n_index_size: %d\n# data_size: %d\n# n_chars: %d\n", + table->max_seq_len, + table->n_index_size, + table->data_size, + table->n_chars); - for (i = 0, seq = table->data; i < table->n_seqs; i++, seq += table->max_seq_len + 2) - { - gunichar value; - char buf[8] = { 0 }; +#if 0 + int index_stride = table->max_seq_len + 1; - for (j = 0; j < table->max_seq_len; j++) - g_string_append_printf (str, " ", seq[j]); + for (int idx = 0; idx < table->n_index_size; idx++) + { + const guint16 *seq_index = table->data + (idx * index_stride); - value = (seq[table->max_seq_len] << 16) | seq[table->max_seq_len + 1]; - if ((value & (1 << 31)) != 0) - { - const char *out = &table->char_data[value & ~(1 << 31)]; - - g_string_append (str, ": \""); - append_escaped (str, out); - g_string_append (str, "\"\n"); - } - else - { - g_unichar_to_utf8 (value, buf); - g_string_append_printf (str, ": \"%s\" # U%x\n", buf, value); - } + g_print ("", seq_index[0]); + for (int i = 1; i < index_stride; i++) + g_print (" %d", seq_index[i]); + g_print ("\n"); } +#endif + + gtk_compose_table_foreach (table, print_sequence, str); return g_string_free (str, FALSE); } @@ -80,7 +98,7 @@ generate_output (const char *file) GtkComposeTable *table; char *output; - table = gtk_compose_table_new_with_file (file); + table = gtk_compose_table_parse (file); output = gtk_compose_table_print (table); g_print ("%s", output); @@ -97,12 +115,12 @@ compose_table_compare (gconstpointer data) char *diff; GError *error = NULL; - file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", basename, NULL); + file = g_test_build_filename (G_TEST_DIST, "compose", basename, NULL); expected = g_strconcat (file, ".expected", NULL); - table = gtk_compose_table_new_with_file (file); - + table = gtk_compose_table_parse (file); output = gtk_compose_table_print (table); + diff = diff_with_file (expected, output, -1, &error); g_assert_no_error (error); @@ -125,9 +143,9 @@ compose_table_cycle (void) char *file; GtkComposeTable *table; - file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "cycle", NULL); + file = g_test_build_filename (G_TEST_DIST, "compose", "cycle", NULL); - table = gtk_compose_table_new_with_file (file); + table = gtk_compose_table_parse (file); g_assert_nonnull (table); g_free (file); @@ -149,7 +167,7 @@ compose_table_nofile (void) file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "nofile", NULL); - table = gtk_compose_table_new_with_file (file); + table = gtk_compose_table_parse (file); g_assert_nonnull (table); g_free (file); @@ -175,7 +193,7 @@ compose_table_match (void) file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "match", NULL); - table = gtk_compose_table_new_with_file (file); + table = gtk_compose_table_parse (file); buffer[0] = GDK_KEY_Multi_key; buffer[1] = 0; @@ -229,39 +247,38 @@ compose_table_match (void) g_free (file); } +extern const GtkComposeTable builtin_compose_table; + /* just check some random sequences */ static void -compose_table_match_compact (void) +compose_table_match_builtin (void) { - const GtkComposeTableCompact table = { - gtk_compose_seqs_compact, - 5, - 30, - 6 - }; + const GtkComposeTable *table = &builtin_compose_table; guint16 buffer[8] = { 0, }; gboolean finish, match, ret; - gunichar ch; + GString *s; buffer[0] = GDK_KEY_Multi_key; buffer[1] = 0; - ret = gtk_compose_table_compact_check (&table, buffer, 1, &finish, &match, &ch); + s = g_string_new (""); + + ret = gtk_compose_table_check (table, buffer, 1, &finish, &match, s); g_assert_true (ret); g_assert_false (finish); g_assert_false (match); - g_assert_true (ch == 0); + g_assert_true (s->len == 0); buffer[0] = GDK_KEY_a; buffer[1] = GDK_KEY_b; buffer[2] = GDK_KEY_c; buffer[3] = 0; - ret = gtk_compose_table_compact_check (&table, buffer, 3, &finish, &match, &ch); + ret = gtk_compose_table_check (table, buffer, 3, &finish, &match, s); g_assert_false (ret); g_assert_false (finish); g_assert_false (match); - g_assert_true (ch == 0); + g_assert_true (s->len == 0); buffer[0] = GDK_KEY_Multi_key; buffer[1] = GDK_KEY_parenleft; @@ -269,31 +286,37 @@ compose_table_match_compact (void) buffer[3] = GDK_KEY_parenright; buffer[4] = 0; - ret = gtk_compose_table_compact_check (&table, buffer, 4, &finish, &match, &ch); + ret = gtk_compose_table_check (table, buffer, 4, &finish, &match, s); g_assert_true (ret); g_assert_true (finish); g_assert_true (match); - g_assert_true (ch == 0x24d9); /* CIRCLED LATIN SMALL LETTER J */ + g_assert_cmpstr (s->str, ==, "ⓙ"); /* CIRCLED LATIN SMALL LETTER J */ buffer[0] = GDK_KEY_dead_acute; buffer[1] = GDK_KEY_space; buffer[2] = 0; - ret = gtk_compose_table_compact_check (&table, buffer, 2, &finish, &match, &ch); + g_string_set_size (s, 0); + + ret = gtk_compose_table_check (table, buffer, 2, &finish, &match, s); g_assert_true (ret); g_assert_true (finish); g_assert_true (match); - g_assert_true (ch == 0x27); + g_assert_cmpstr (s->str, ==, "'"); buffer[0] = GDK_KEY_dead_acute; buffer[1] = GDK_KEY_dead_acute; buffer[2] = 0; - ret = gtk_compose_table_compact_check (&table, buffer, 2, &finish, &match, &ch); + g_string_set_size (s, 0); + + ret = gtk_compose_table_check (table, buffer, 2, &finish, &match, s); g_assert_true (ret); g_assert_true (finish); g_assert_true (match); - g_assert_true (ch == 0xb4); + g_assert_cmpstr (s->str, ==, "´"); + + g_string_free (s, TRUE); } static void @@ -381,16 +404,16 @@ match_algorithmic (void) int main (int argc, char *argv[]) { - char *dir; - - g_setenv ("LC_ALL", "en_US.UTF-8", TRUE); - dir = g_dir_make_tmp ("composetableXXXXXX", NULL); - g_setenv ("XDG_CACHE_HOME", dir, TRUE); - g_free (dir); - if (argc == 3 && strcmp (argv[1], "--generate") == 0) { - setlocale (LC_ALL, ""); + gtk_disable_setlocale(); + setlocale (LC_ALL, "en_US.UTF-8"); + + gtk_init (); + + /* Ensure that the builtin table is initialized */ + GtkIMContext *ctx = gtk_im_context_simple_new (); + g_object_unref (ctx); generate_output (argv[2]); return 0; @@ -398,6 +421,10 @@ main (int argc, char *argv[]) gtk_test_init (&argc, &argv, NULL); + /* Ensure that the builtin table is initialized */ + GtkIMContext *ctx = gtk_im_context_simple_new (); + g_object_unref (ctx); + g_test_add_data_func ("/compose-table/basic", "basic", compose_table_compare); g_test_add_data_func ("/compose-table/long", "long", compose_table_compare); g_test_add_data_func ("/compose-table/octal", "octal", compose_table_compare); @@ -410,7 +437,7 @@ main (int argc, char *argv[]) g_test_add_func ("/compose-table/include-cycle", compose_table_cycle); g_test_add_func ("/compose-table/include-nofile", compose_table_nofile); g_test_add_func ("/compose-table/match", compose_table_match); - g_test_add_func ("/compose-table/match-compact", compose_table_match_compact); + g_test_add_func ("/compose-table/match-builtin", compose_table_match_builtin); g_test_add_func ("/compose-table/match-algorithmic", match_algorithmic); return g_test_run (); -- cgit v1.2.1 From 92129a20119cd11a8f31b2500d921e6184944149 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 13 Jul 2021 06:59:26 -0400 Subject: imcontext: Simplify checking compose seqs Add the builtin table to the list of tables, and remove the duplicated code that checks builtin sequences separately. --- gtk/gtkimcontextsimple.c | 82 +++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 53 deletions(-) diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 5ad9f8c8ab..68253797d9 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -102,7 +102,6 @@ init_builtin_table (void) G_LOCK_DEFINE_STATIC (global_tables); static GSList *global_tables; -static gboolean omit_builtin_sequences; static const guint16 gtk_compose_ignore[] = { 0, /* Yes, XKB will send us key press events with NoSymbol :( */ @@ -188,11 +187,11 @@ gtk_compose_table_find (gconstpointer data1, return compose_table->id != hash; } -static void -add_compose_table_from_file (const char *compose_file, - gboolean replace_builtin) +static gboolean +add_compose_table_from_file (const char *compose_file) { guint hash; + gboolean ret = FALSE; G_LOCK (global_tables); @@ -205,13 +204,24 @@ add_compose_table_from_file (const char *compose_file, if (table) { + ret = TRUE; global_tables = g_slist_prepend (global_tables, table); - if (replace_builtin) - omit_builtin_sequences = TRUE; } } G_UNLOCK (global_tables); + + return ret; +} + +static void +add_builtin_compose_table (void) +{ + G_LOCK (global_tables); + + global_tables = g_slist_prepend (global_tables, &builtin_compose_table); + + G_UNLOCK (global_tables); } static void @@ -245,6 +255,7 @@ gtk_im_context_simple_init_compose_table (void) const char *locale; char **langs = NULL; char **lang = NULL; + gboolean added; const char * const sys_langs[] = { "el_gr", "fi_fi", "pt_br", NULL }; const char * const *sys_lang = NULL; char *x11_compose_file_dir = get_x11_compose_file_dir (); @@ -252,9 +263,10 @@ gtk_im_context_simple_init_compose_table (void) path = g_build_filename (g_get_user_config_dir (), "gtk-4.0", "Compose", NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) { - add_compose_table_from_file (path, TRUE); + added = add_compose_table_from_file (path); g_free (path); - return; + if (added) + return; } g_clear_pointer (&path, g_free); @@ -265,9 +277,10 @@ gtk_im_context_simple_init_compose_table (void) path = g_build_filename (home, ".XCompose", NULL); if (g_file_test (path, G_FILE_TEST_EXISTS)) { - add_compose_table_from_file (path, TRUE); + added = add_compose_table_from_file (path); g_free (path); - return; + if (added) + return; } g_clear_pointer (&path, g_free); @@ -310,10 +323,13 @@ gtk_im_context_simple_init_compose_table (void) if (path != NULL) { - add_compose_table_from_file (path, TRUE); + added = add_compose_table_from_file (path); + g_free (path); } + if (added) + return; - g_free (path); + add_builtin_compose_table (); } static void @@ -1084,46 +1100,6 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, G_UNLOCK (global_tables); - if (success) - { - g_string_free (output, TRUE); - return TRUE; - } - - G_LOCK (global_tables); - - if (!omit_builtin_sequences && - gtk_compose_table_check (&builtin_compose_table, - priv->compose_buffer, n_compose, - &compose_finish, &compose_match, - output)) - { - if (!priv->in_compose_sequence) - { - priv->in_compose_sequence = TRUE; - g_signal_emit_by_name (context_simple, "preedit-start"); - } - - if (compose_finish) - { - if (compose_match) - gtk_im_context_simple_commit_string (context_simple, output->str); - } - else - { - if (compose_match) - { - g_string_assign (priv->tentative_match, output->str); - priv->tentative_match_len = n_compose; - } - g_signal_emit_by_name (context_simple, "preedit-changed"); - } - - success = TRUE; - } - - G_UNLOCK (global_tables); - g_string_free (output, TRUE); if (success) @@ -1308,5 +1284,5 @@ gtk_im_context_simple_add_compose_file (GtkIMContextSimple *context_simple, { g_return_if_fail (GTK_IS_IM_CONTEXT_SIMPLE (context_simple)); - add_compose_table_from_file (compose_file, FALSE); + add_compose_table_from_file (compose_file); } -- cgit v1.2.1 From 4390f8102bb40a351cec1f6065e369a87ed7a09d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 13 Jul 2021 07:10:01 -0400 Subject: imcontext: Improve the docs Add more details about supported input methods. --- gtk/gtkimcontextsimple.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 68253797d9..7183205646 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -40,6 +40,8 @@ * * `GtkIMContextSimple` is an input method supporting table-based input methods. * + * ## Compose sequences + * * `GtkIMContextSimple` reads compose sequences from the first of the * following files that is found: ~/.config/gtk-4.0/Compose, ~/.XCompose, * /usr/share/X11/locale/$locale/Compose (for locales that have a nontrivial @@ -49,6 +51,10 @@ * If none of these files is found, `GtkIMContextSimple` uses a built-in table * of compose sequences that is derived from the X11 Compose files. * + * Note that compose sequences typically start with the Compose_key, which is + * often not available as a dedicated key on keyboards. Keyboard layouts may + * map this keysym to other keys, such as the right Control key. + * * ## Unicode characters * * `GtkIMContextSimple` also supports numeric entry of Unicode characters @@ -60,6 +66,15 @@ * Ctrl-Shift-u 1 2 3 Enter * * yields U+0123 LATIN SMALL LETTER G WITH CEDILLA, i.e. ģ. + * + * ## Dead keys + * + * `GtkIMContextSimple` supports dead keys. For example, typing + * + * dead_acute a + * + * yields U+00E! LATIN SMALL LETTER_A WITH ACUTE, i.e. á. Note that this + * depends on the keyboard layout including dead keys. */ struct _GtkIMContextSimplePrivate -- cgit v1.2.1 From 0ad50941193fcd2d7454b5be032fde28f31c4a56 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 15 Jul 2021 07:58:09 -0400 Subject: Remove some leftover debug code --- testsuite/gtk/composetable.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index 23a95b0d27..ca5a5c0eea 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -72,21 +72,6 @@ gtk_compose_table_print (GtkComposeTable *table) table->data_size, table->n_chars); -#if 0 - int index_stride = table->max_seq_len + 1; - - for (int idx = 0; idx < table->n_index_size; idx++) - { - const guint16 *seq_index = table->data + (idx * index_stride); - - g_print ("", seq_index[0]); - - for (int i = 1; i < index_stride; i++) - g_print (" %d", seq_index[i]); - g_print ("\n"); - } -#endif - gtk_compose_table_foreach (table, print_sequence, str); return g_string_free (str, FALSE); -- cgit v1.2.1 From 264d592012c3d909e5fc4d07198ede73e1badbec Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 15 Jul 2021 08:14:40 -0400 Subject: composetable: Keep the number of sequences And print it out in tests. Update all tests for this. --- gtk/gtkcomposetable.c | 5 +++++ gtk/gtkcomposetable.h | 1 + testsuite/gtk/compose/basic.expected | 1 + testsuite/gtk/compose/codepoint.expected | 1 + testsuite/gtk/compose/comments.expected | 1 + testsuite/gtk/compose/hex.expected | 1 + testsuite/gtk/compose/include.expected | 1 + testsuite/gtk/compose/long.expected | 1 + testsuite/gtk/compose/match.expected | 5 +++-- testsuite/gtk/compose/multi.expected | 1 + testsuite/gtk/compose/octal.expected | 1 + testsuite/gtk/compose/strings.expected | 1 + testsuite/gtk/compose/system.expected | 1 + testsuite/gtk/composetable.c | 3 ++- 14 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index eb1ceeeca1..39ca2e3e92 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -879,6 +879,7 @@ parser_get_compose_table (GtkComposeParser *parser) int first_pos; int rest_pos; int index_rowstride; + int n_sequences; gunichar current_first; parser_remove_duplicates (parser); @@ -899,6 +900,7 @@ parser_get_compose_table (GtkComposeParser *parser) char_data = g_string_new (""); + n_sequences = 0; current_first = 0; first_pos = 0; rest_pos = n_first * index_rowstride; @@ -958,6 +960,8 @@ parser_get_compose_table (GtkComposeParser *parser) g_assert (encoded_value != 0); data[rest_pos + len - 1] = encoded_value; + n_sequences++; + rest_pos += len; for (i = len; i <= max_compose_len; i++) @@ -980,6 +984,7 @@ parser_get_compose_table (GtkComposeParser *parser) table->n_index_size = n_first; table->n_chars = char_data->len; table->char_data = g_string_free (char_data, FALSE); + table->n_sequences = n_sequences; table->id = g_str_hash (parser->compose_file); g_list_free (sequences); diff --git a/gtk/gtkcomposetable.h b/gtk/gtkcomposetable.h index 0e6c1aec9c..7a4c952f33 100644 --- a/gtk/gtkcomposetable.h +++ b/gtk/gtkcomposetable.h @@ -53,6 +53,7 @@ struct _GtkComposeTable int n_index_size; int data_size; int n_chars; + int n_sequences; guint32 id; }; diff --git a/testsuite/gtk/compose/basic.expected b/testsuite/gtk/compose/basic.expected index 96e2f4e0e3..465a4e37f8 100644 --- a/testsuite/gtk/compose/basic.expected +++ b/testsuite/gtk/compose/basic.expected @@ -1,3 +1,4 @@ +# n_sequences: 1 # max_seq_len: 4 # n_index_size: 1 # data_size: 9 diff --git a/testsuite/gtk/compose/codepoint.expected b/testsuite/gtk/compose/codepoint.expected index 295e71882f..c1d11e791e 100644 --- a/testsuite/gtk/compose/codepoint.expected +++ b/testsuite/gtk/compose/codepoint.expected @@ -1,3 +1,4 @@ +# n_sequences: 1 # max_seq_len: 4 # n_index_size: 1 # data_size: 9 diff --git a/testsuite/gtk/compose/comments.expected b/testsuite/gtk/compose/comments.expected index 683486e499..891c490a1a 100644 --- a/testsuite/gtk/compose/comments.expected +++ b/testsuite/gtk/compose/comments.expected @@ -1,3 +1,4 @@ +# n_sequences: 3 # max_seq_len: 2 # n_index_size: 1 # data_size: 9 diff --git a/testsuite/gtk/compose/hex.expected b/testsuite/gtk/compose/hex.expected index f753c59688..7d2d26af98 100644 --- a/testsuite/gtk/compose/hex.expected +++ b/testsuite/gtk/compose/hex.expected @@ -1,3 +1,4 @@ +# n_sequences: 1 # max_seq_len: 4 # n_index_size: 1 # data_size: 9 diff --git a/testsuite/gtk/compose/include.expected b/testsuite/gtk/compose/include.expected index bb0bd50a9c..8307b1c594 100644 --- a/testsuite/gtk/compose/include.expected +++ b/testsuite/gtk/compose/include.expected @@ -1,3 +1,4 @@ +# n_sequences: 1 # max_seq_len: 4 # n_index_size: 1 # data_size: 9 diff --git a/testsuite/gtk/compose/long.expected b/testsuite/gtk/compose/long.expected index e50a95d39a..0846c7f6e9 100644 --- a/testsuite/gtk/compose/long.expected +++ b/testsuite/gtk/compose/long.expected @@ -1,3 +1,4 @@ +# n_sequences: 1 # max_seq_len: 11 # n_index_size: 1 # data_size: 23 diff --git a/testsuite/gtk/compose/match.expected b/testsuite/gtk/compose/match.expected index 6a2deaa724..bed10c5a10 100644 --- a/testsuite/gtk/compose/match.expected +++ b/testsuite/gtk/compose/match.expected @@ -1,7 +1,8 @@ +# n_sequences: 3 # max_seq_len: 7 # n_index_size: 1 # data_size: 24 -# n_chars: 4 +# n_chars: 5 : "!" # U21 : "?" # U3f - : "🥂" + : "🥂" # U1f942 diff --git a/testsuite/gtk/compose/multi.expected b/testsuite/gtk/compose/multi.expected index 72a9fbe92d..078f21f441 100644 --- a/testsuite/gtk/compose/multi.expected +++ b/testsuite/gtk/compose/multi.expected @@ -1,3 +1,4 @@ +# n_sequences: 3 # max_seq_len: 5 # n_index_size: 1 # data_size: 19 diff --git a/testsuite/gtk/compose/octal.expected b/testsuite/gtk/compose/octal.expected index 96e2f4e0e3..465a4e37f8 100644 --- a/testsuite/gtk/compose/octal.expected +++ b/testsuite/gtk/compose/octal.expected @@ -1,3 +1,4 @@ +# n_sequences: 1 # max_seq_len: 4 # n_index_size: 1 # data_size: 9 diff --git a/testsuite/gtk/compose/strings.expected b/testsuite/gtk/compose/strings.expected index 4eff96267a..84f13c765b 100644 --- a/testsuite/gtk/compose/strings.expected +++ b/testsuite/gtk/compose/strings.expected @@ -1,3 +1,4 @@ +# n_sequences: 4 # max_seq_len: 5 # n_index_size: 1 # data_size: 24 diff --git a/testsuite/gtk/compose/system.expected b/testsuite/gtk/compose/system.expected index 04902d2c76..aac5ac82ea 100644 --- a/testsuite/gtk/compose/system.expected +++ b/testsuite/gtk/compose/system.expected @@ -1,3 +1,4 @@ +# n_sequences: 4909 # max_seq_len: 5 # n_index_size: 30 # data_size: 16521 diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index ca5a5c0eea..9c3a4a6142 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -66,7 +66,8 @@ gtk_compose_table_print (GtkComposeTable *table) str = g_string_new (""); - g_string_append_printf (str, "# max_seq_len: %d\n# n_index_size: %d\n# data_size: %d\n# n_chars: %d\n", + g_string_append_printf (str, "# n_sequences: %d\n# max_seq_len: %d\n# n_index_size: %d\n# data_size: %d\n# n_chars: %d\n", + table->n_sequences, table->max_seq_len, table->n_index_size, table->data_size, -- cgit v1.2.1 From 87e2a02e0c69cec7c04a48265761da13b99c9a2b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 14 Jul 2021 07:38:32 -0400 Subject: composetable: Rewrite Compose files if necessary Apply heuristics to avoid breaking users existing configurations with the change to not always add the default sequences. If we find a cache that was generated before 4.4, and the Compose file does not have an include, and doesn't contain so many sequences that it is probably a copy of the system one, we take steps to keep things working, and thell the user about it. --- gtk/compose/compose-parse.c | 2 +- gtk/gtkcomposetable.c | 122 +++++++++++++++++++++++++++++++++++++++---- gtk/gtkcomposetable.h | 3 +- testsuite/gtk/composetable.c | 10 ++-- 4 files changed, 119 insertions(+), 18 deletions(-) diff --git a/gtk/compose/compose-parse.c b/gtk/compose/compose-parse.c index 55e9331f3e..e80b270453 100644 --- a/gtk/compose/compose-parse.c +++ b/gtk/compose/compose-parse.c @@ -26,7 +26,7 @@ main (int argc, char *argv[]) exit (1); } - table = gtk_compose_table_parse (argv[1]); + table = gtk_compose_table_parse (argv[1], NULL); if (!table) g_error ("Failed to parse %s", argv[1]); diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index 39ca2e3e92..c95b153e6f 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -83,6 +83,7 @@ typedef struct { GHashTable *sequences; GList *files; const char *compose_file; + gboolean found_include; } GtkComposeParser; static GtkComposeParser * @@ -95,6 +96,7 @@ parser_new (void) parser->sequences = g_hash_table_new_full (sequence_hash, sequence_equal, g_free, g_free); parser->files = NULL; parser->compose_file = NULL; + parser->found_include = FALSE; return parser; } @@ -357,6 +359,8 @@ parser_handle_include (GtkComposeParser *parser, const char *start, *end; char *path; + parser->found_include = TRUE; + p = line + strlen ("include "); while (g_ascii_isspace (*p)) @@ -719,7 +723,8 @@ gtk_compose_table_serialize (GtkComposeTable *compose_table, } static GtkComposeTable * -gtk_compose_table_load_cache (const char *compose_file) +gtk_compose_table_load_cache (const char *compose_file, + gboolean *found_old_cache) { guint32 hash; char *path = NULL; @@ -740,6 +745,8 @@ gtk_compose_table_load_cache (const char *compose_file) char *char_data = NULL; GtkComposeTable *retval; + *found_old_cache = FALSE; + hash = g_str_hash (compose_file); if ((path = gtk_compose_hash_get_cache_path (hash)) == NULL) return NULL; @@ -780,8 +787,8 @@ gtk_compose_table_load_cache (const char *compose_file) GET_GUINT16 (version); if (version != GTK_COMPOSE_TABLE_VERSION) { - g_warning ("cache version is different %u != %u", - version, GTK_COMPOSE_TABLE_VERSION); + if (version < GTK_COMPOSE_TABLE_VERSION) + *found_old_cache = TRUE; goto out_load_cache; } @@ -993,15 +1000,15 @@ parser_get_compose_table (GtkComposeParser *parser) } static char * -canonicalize_filename (GtkComposeParser *parser, - const char *path) +canonicalize_filename (const char *parent_path, + const char *path) { GFile *file; char *retval; - if (path[0] != '/' && parser->compose_file) + if (path[0] != '/' && parent_path) { - GFile *orig = g_file_new_for_path (parser->compose_file); + GFile *orig = g_file_new_for_path (parent_path); GFile *parent = g_file_get_parent (orig); file = g_file_resolve_relative_path (parent, path); g_object_unref (parent); @@ -1029,7 +1036,7 @@ parser_parse_file (GtkComposeParser *parser, if (parser->compose_file == NULL) parser->compose_file = compose_file; - path = canonicalize_filename (parser, compose_file); + path = canonicalize_filename (parser->compose_file, compose_file); if (g_list_find_custom (parser->files, path, (GCompareFunc)strcmp)) { @@ -1046,7 +1053,8 @@ parser_parse_file (GtkComposeParser *parser, } GtkComposeTable * -gtk_compose_table_parse (const char *compose_file) +gtk_compose_table_parse (const char *compose_file, + gboolean *found_include) { GtkComposeParser *parser; GtkComposeTable *compose_table; @@ -1054,23 +1062,115 @@ gtk_compose_table_parse (const char *compose_file) parser = parser_new (); parser_parse_file (parser, compose_file); compose_table = parser_get_compose_table (parser); + if (found_include) + *found_include = parser->found_include; parser_free (parser); return compose_table; } +static const char *prefix = + "# GTK has rewritten this file to add the line:\n" + "\n" + "include \"%L\"\n" + "\n" + "# This is necessary to add your own Compose sequences\n" + "# in addition to the builtin sequences of GTK. If this\n" + "# is not what you want, just remove that line.\n" + "#\n" + "# A backup of the previous file contents has been made.\n" + "\n" + "\n"; + +static gboolean +rewrite_compose_file (const char *compose_file) +{ + char *path = NULL; + char *content = NULL; + gsize content_len; + GFile *file = NULL; + GOutputStream *stream = NULL; + gboolean ret = FALSE; + + path = canonicalize_filename (NULL, compose_file); + + if (!g_file_get_contents (path, &content, &content_len, NULL)) + goto out; + + file = g_file_new_for_path (path); + stream = G_OUTPUT_STREAM (g_file_replace (file, NULL, TRUE, 0, NULL, NULL)); + + if (stream == NULL) + goto out; + + if (!g_output_stream_write (stream, prefix, strlen (prefix), NULL, NULL)) + goto out; + + if (!g_output_stream_write (stream, content, content_len, NULL, NULL)) + goto out; + + if (!g_output_stream_close (stream, NULL, NULL)) + goto out; + + ret = TRUE; + +out: + g_clear_object (&stream); + g_clear_object (&file); + g_clear_pointer (&path, g_free); + g_clear_pointer (&content, g_free); + + return ret; +} + GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file) { GtkComposeTable *compose_table; + gboolean found_old_cache = FALSE; + gboolean found_include = FALSE; g_assert (compose_file != NULL); - compose_table = gtk_compose_table_load_cache (compose_file); + compose_table = gtk_compose_table_load_cache (compose_file, &found_old_cache); if (compose_table != NULL) return compose_table; - compose_table = gtk_compose_table_parse (compose_file); +parse: + compose_table = gtk_compose_table_parse (compose_file, &found_include); + + /* This is where we apply heuristics to avoid breaking users existing configurations + * with the change to not always add the default sequences. + * + * If we find a cache that was generated before 4.4, and the Compose file + * does not have an include, and doesn't contain so many sequences that it + * is probably a copy of the system one, we take steps to keep things working, + * and thell the user about it. + */ + if (found_old_cache && !found_include && compose_table->n_sequences < 100) + { + if (rewrite_compose_file (compose_file)) + { + g_warning ("\nSince GTK 4.4, Compose files replace the builtin\n" + "compose sequences. To keep them and add your own\n" + "sequences on top, the line:\n" + "\n" + " include \"%%L\"\n" + "\n" + "has been added to the Compose file\n%s.\n", compose_file); + goto parse; + } + else + { + g_warning ("\nSince GTK 4.4, Compose files replace the builtin\n" + "compose sequences. To keep them and add your own\n" + "sequences on top, you need to add the line:\n" + "\n" + " include \"%%L\"\n" + "\n" + "to the Compose file\n%s.\n", compose_file); + } + } if (compose_table != NULL) gtk_compose_table_save_cache (compose_table); diff --git a/gtk/gtkcomposetable.h b/gtk/gtkcomposetable.h index 7a4c952f33..1398559a66 100644 --- a/gtk/gtkcomposetable.h +++ b/gtk/gtkcomposetable.h @@ -58,7 +58,8 @@ struct _GtkComposeTable }; GtkComposeTable * gtk_compose_table_new_with_file (const char *compose_file); -GtkComposeTable * gtk_compose_table_parse (const char *compose_file); +GtkComposeTable * gtk_compose_table_parse (const char *compose_file, + gboolean *found_include); GtkComposeTable * gtk_compose_table_new_with_data (const guint16 *data, int max_seq_len, int n_seqs); diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index 9c3a4a6142..1a77e5bc93 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -84,7 +84,7 @@ generate_output (const char *file) GtkComposeTable *table; char *output; - table = gtk_compose_table_parse (file); + table = gtk_compose_table_parse (file, NULL); output = gtk_compose_table_print (table); g_print ("%s", output); @@ -104,7 +104,7 @@ compose_table_compare (gconstpointer data) file = g_test_build_filename (G_TEST_DIST, "compose", basename, NULL); expected = g_strconcat (file, ".expected", NULL); - table = gtk_compose_table_parse (file); + table = gtk_compose_table_parse (file, NULL); output = gtk_compose_table_print (table); diff = diff_with_file (expected, output, -1, &error); @@ -131,7 +131,7 @@ compose_table_cycle (void) file = g_test_build_filename (G_TEST_DIST, "compose", "cycle", NULL); - table = gtk_compose_table_parse (file); + table = gtk_compose_table_parse (file, NULL); g_assert_nonnull (table); g_free (file); @@ -153,7 +153,7 @@ compose_table_nofile (void) file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "nofile", NULL); - table = gtk_compose_table_parse (file); + table = gtk_compose_table_parse (file, NULL); g_assert_nonnull (table); g_free (file); @@ -179,7 +179,7 @@ compose_table_match (void) file = g_build_filename (g_test_get_dir (G_TEST_DIST), "compose", "match", NULL); - table = gtk_compose_table_parse (file); + table = gtk_compose_table_parse (file, NULL); buffer[0] = GDK_KEY_Multi_key; buffer[1] = 0; -- cgit v1.2.1

: "ṗ" U1E57 - : "ṡ" U1E61 - : "Ṫ" U1E6A - : "ṫ" U1E6B - : "ė" U0117 - : "¢" U00A2 - : "¢" U00A2 - : "£" U00A3 - : "£" U00A3 - : "£" U00A3 - : "£" U00A3 - : "£" U00A3 - <0> : "¤" U00A4 - <0> : "¤" U00A4 - : "¤" U00A4 - : "¤" U00A4 - <0> : "¤" U00A4 - : "¤" U00A4 - : "¤" U00A4 - : "¤" U00A4 - <0> : "¤" U00A4 - : "¤" U00A4 - : "¥" U00A5 - : "¥" U00A5 - : "¥" U00A5 - : "¥" U00A5 - : "¥" U00A5 - : "¥" U00A5 - <0> : "§" U00A7 - <0> : "§" U00A7 - : "§" U00A7 - : "§" U00A7 - <0> : "§" U00A7 - : "§" U00A7 - : "§" U00A7 - <0> : "§" U00A7 - : "¨" U00A8 - : "©" U00A9 - <0> : "©" U00A9 - <0> : "©" U00A9 - <0> : "©" U00A9 - : "©" U00A9 - : "©" U00A9 - <0> : "©" U00A9 - : "ª" U00AA - : "ª" U00AA - : "Ç" U00C7 - : "­" U00AD - : "®" U00AE - : "®" U00AE - : "¯" U00AF - : "¯" U00AF - : "¯" U00AF - : "¯" U00AF - : "¯" U00AF - <0> : "°" U00B0 - <0> : "°" U00B0 - <0> : "°" U00B0 - : "±" U00B1 - <2> : "²" U00B2 - <2> : "²" U00B2 - <2> : "²" U00B2 - <2> : "²" U00B2 - <2> : "²" U00B2 - <3> : "³" U00B3 - <3> : "³" U00B3 - <3> : "³" U00B3 - <3> : "³" U00B3 - <3> : "³" U00B3 - : "´" U00B4 - : "µ" U00B5 - : "µ" U00B5 - : "µ" U00B5 - : "µ" U00B5 -