Как назначить 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_string
s, скорее всего, используют 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 и т. д.