Как прочитать Unicode-строку в виде отдельных символов ASCII и обнаружить, что это был Unicode самым быстрым способом? - PullRequest
0 голосов
/ 22 мая 2019

Я делаю библиотеку, которая позволяет пользователю вставлять и искать пары ключ-значение в виде структуры данных trie.Когда я вставляю строку Unicode, она разбивается на 4 символа (utf-8) (что нормально), но каждый символ становится «?».Поэтому я попытался использовать setlocale(LC_ALL, ""), который не работал (или, может быть, я просто не знаю, каковы правильные аргументы для моего случая и как его вызвать).Я действительно не забочусь о печати или чтении персонажа как есть.Все, что я хочу, - это то, что это может быть представлено как-то однозначно.

В моем трее есть ссылки типа node *next[256].

Так что все, что я хочу, это когда вставляется строка в кодировке Юникод, она вставляется как уникальная комбинация, которая позволяет искатьСтрока однозначно.Также мне нужен способ обнаружить, что юникодный символ был разбит на 4 отдельных символа.Это потому, что, например, если в строке «wxyz» символ юникода «x» разбит на a, b, c, d, то три будет хранить «wabcdyz». Но если бы я на самом деле искал строку wabcdyz (не unicode), тогда он найдет запись для этой строки, но это будет несоответствие.

Вот программа, которая показывает Unicode-символ, разбитый на четыре ? символа:

#include <stdio.h>

int main()
{
    printf("Hello World");

    char a[] = "Ƃ";

    int i;
    for(i = 0 ; a[i] != '\0' ; ++i)
    {
        printf("%c", a[i]);
    }

    return 0;
}

1 Ответ

1 голос
/ 22 мая 2019

UTF-8 - это механизм для кодирования последовательностей символов Unicode в виде байтовых последовательностей, но не единственным способом. Unicode не подразумевает UTF-8, и технически UTF-8 также не подразумевает Unicode.

Когда я вставляю строку в юникоде, она разбивается на 4 символа (utf-8)

Это функция того, как вы храните строковые данные, и

  • звучит сломано
  • вероятно не с использованием UTF-8, вопреки вашему утверждению

Так что все, что я хочу, это когда вставляется строка Unicode, она вставляется как уникальная комбинация, которая позволила бы искать, что Строка однозначно.

Это относительно просто: закодируйте все свои строки одинаково. Я бы выбрал кодирование всех из них в UTF-8, но вы также можете использовать любую другую кодировку без сохранения состояния, которая поддерживает все символы, которые могут появиться в ваших строках, например UTF-16 или UTF-32. Но вы должны использовать согласованную кодировку для всех символов всех строк.

Сделав это должным образом, вам не обязательно делать что-то особенное, чтобы заставить ваше дерево работать. * Однако, если вы выберете UTF-16 или UTF-32, я бы предложил структурировать три вокруг размера их кодовых единиц (16 или 32 бита, соответственно). В этом нет необходимости, но, скорее всего, это даст преимущества в виде более мелких и, следовательно, более эффективных попыток.


* Обратите внимание, однако, что кодовые блоки UTF-16 и UTF-32 включают в себя множество охватывающих байтов со значением 0, например 0x0031 и 0x00000200. Если вы рассматриваете их как последовательности байтов вместо последовательностей кодовых единиц, то вы должны учитывать это. В частности, вы должны избегать предположения, что отдельные нулевые байты служат терминаторами.

...