Как назначить std::string для std::basic_string<unsigned short int, TRAITS_CLASS>(Unicode2String) в Linux

Я работаю над системой Linux, и я думаю, что стандартный Linux поддерживает символы Unicode и ASCII. Итак, я хочу использовать в своем коде, но получаю строки из приложения в формате std::basic_string<unsigned short int, TRAIT_CLASS>(для поддержки как Windows, так и Linux). TRAITS_CLASSкак показано ниже:

      class TRAITS_CLASS
{
    public:
        typedef unsigned short char_type;
        typedef unsigned short int_type;
        typedef size_t pos_type;
        typedef size_t off_type;
        typedef int state_type;

        static inline void assign(unsigned short &dest, const unsigned short &src)
        {
            dest = src;
        }

        static inline bool eq(const unsigned short &left, const unsigned short &right)
        {
            return left == right;
        }

        static inline bool lt(const unsigned short &left, const unsigned short &right)
        {
            return left < right;
        }

        static int compare(const unsigned short *p1, const unsigned short *p2, size_t count)
        {
            for (; 0 < count; --count, ++p1, ++p2)
            {
                if (!eq(*p1, *p2))
                {
                    return lt(*p1, *p2) ? -1 : 1;
                }
            }
            return 0;
        }

        static size_t length(const unsigned short *p)
        {
            size_t count = 0;
            while (*p++)
            {
                ++count;
            }
            return count;
        }

        static unsigned short* copy(unsigned short *p1, const unsigned short *p2, size_t count)
        {
            unsigned short *res = p1;
            for (; 0 < count; --count, ++p1, ++p2)
            {
                assign(*p1, *p2);
            }
            return res;
        }

        static const unsigned short* find(const unsigned short *p, size_t count,
                const unsigned short &value)
        {
            for (; 0 < count; --count, ++p)
            {
                if (eq(*p, value))
                {
                    return p;
                }
            }
            return 0;
        }

        static unsigned short* move(unsigned short *dest, const unsigned short *src, size_t count)
        {
            unsigned short *res = dest;
            if ((src < dest) && (dest < src + count))
            {
                for (dest += count, src += count; 0 < count; --count)
                {
                    assign(*--dest, *--src);
                }
            }
            else
            {
                for (; 0 < count; --count, ++dest, ++src)
                {
                    assign(*dest, *src);
                }
            }
            return res;
        }

        static unsigned short* assign(unsigned short *dest, size_t count, unsigned short value)
        {
            unsigned short *res = dest;
            for (; 0 < count; --count, ++dest)
            {
                assign(*dest, value);
            }
            return res;
        }

        static inline unsigned short to_char_type(const int_type &arg)
        {
            return static_cast<unsigned short>(arg);
        }

        static inline int_type to_int_type(const unsigned short &value)
        {
            return static_cast<int_type>(value);
        }

        static inline bool eq_int_type(const int_type &left, const int_type &right)
        {
            return left == right;
        }

        static inline int_type eof()
        {
            return static_cast<int_type>(EOF);
        }

        static inline int_type not_eof(const int_type &value)
        {
            return value != eof() ? value : 1;
        }
};

Как я могу назначить нормальный std::stringк вышеизложенному std::basic_stringшаблон? Нравиться:

      basic_string<unsigned short int, TRAIT_ClASS> temp = u"string";

Если присвоение невозможно, как я могу использовать вышеуказанное basic_stringшаблон?

1 ответ

Я думаю, что стандартный Linux std::string поддерживает символы Unicode и ASCII.

(иначе std::basic_string<char>) не имеет представления о Unicode или ASCII, он знает только об элементах, не более того. Вас может смутить тот факт, что приложения Linux обычно используют строки UTF-8, а UTF-8 может храниться в (или предпочтительно в std::u8stringон же std:::basic_string<char8_t>в С++20). Но задача вашего кода — возложить такую ​​ответственность на любое использование .

Как я могу назначить нормаль выше std::basic_stringшаблон?

Вы не можете напрямую присвоить/от другого std::basic_string<CharT>куда CharTотличается от .

Вам нужно будет использовать приведение типов, чтобы обойти это, предполагая, что данные совместимы, что в вашем примере НЕ имеет места! имеет размер 1 байт, но unsigned short intсоставляет 2 байта. Итак, ваше другое приложение basic_strings, скорее всего, используют UCS-2/UTF-16, которые вы не можете хранить в (ну, во всяком случае, не так, как вы хотите), но вы можете хранить в std::u16string(иначе std::basic_string<char16_t>), или в std::wstring(иначе std::basic_string<wchar_t>) в Windows, например:

      std::basic_string<unsigned short int, TRAITS_CLASS> temp =
    reinterpret_cast<const unsigned short int*>(u"string");

// or:
std::basic_string<unsigned short int, TRAITS_CLASS> temp(
    reinterpret_cast<const unsigned short int*>(u"string"),
    6);
      std::u16string str = u"string";

std::basic_string<unsigned short int, TRAITS_CLASS> temp =
    reinterpret_cast<const unsigned short int*>(str.c_str());

// or:
std::basic_string<unsigned short int, TRAITS_CLASS> temp(
    reinterpret_cast<const unsigned short int*>(str.c_str()),
    str.size());
      std::basic_string<unsigned short int, TRAITS_CLASS> temp = ...;

std::u16string str =
    reinterpret_cast<const char16_t*>(temp.c_str());

// or:
std::u16string str(
    reinterpret_cast<const char16_t*>(temp.c_str()),
    temp.size());

Если вам абсолютно необходимо использовать std::stringв вашем коде, вам придется конвертировать между UTF-8 (или любым другим char-совместимая кодировка, которую вы хотите) и 16-битный формат другого приложения (при условии, что UCS-2/UTF-16), например, с std::wstring_convertили сторонняя библиотека Unicode, такая как libiconv, ICU и т. д.

Другие вопросы по тегам