Конвертация из wchar_t символа и наоборот

0

Я пишу шаблон класса String (только для учебных целей) и имею небольшую проблему. Если T - wchar_t и U - char, и наоборот, что мне не хватает для этого метода?

template<typename U>
String<T> operator + (const U* other)
{
    String<T> newString;
    uint32_t otherLength = length(other);
    uint32_t stringLength = m_length + otherLength;
    uint32_t totalLength = stringLength * sizeof(T) + sizeof(T);

    T *buffer = new T[totalLength];

    memset(buffer, 0, totalLength);
    memcpy(buffer, m_value, m_length * sizeof(T));
    newString.m_value = buffer;
    newString.m_length = stringLength;
    memcpy(newString.m_value + m_length, other, otherLength * sizeof(T));

    return newString;
}

Хорошо, Джаред ниже предложил решение, так что-то вроде этого (есть ошибки, я знаю, только шаблон)?

template<typename U>
String<T> operator + (const U* other)
{
    String<T> newString;

    uint32_t sizeOfT = sizeof(T); // wchar_t is 4
    uint32_t sizeOfU = sizeof(U); // char is 1

    T* convertedString;

    int i = 0;
    while (*other != 0)
    {
        convertedString[i] = ConvertChar(*other);
        other++;
        i++;
    }

    return newString;
}

template <typename U>
T ConvertChar(U character)
{

}
  • 0
    Если все ваши персонажи - ASCII, то глупый wchar_t to char - это хорошо. в любом другом случае вам нужно конвертировать Unicode в UTF8. utfcpp.sourceforge.net
Теги:
encoding
char
wchar-t

2 ответа

1
Лучший ответ

В настоящий момент ваш код по существу использует копии памяти при конвертации из U* в String<T>. Это, к сожалению, не сработает, потому что wchar_t и char имеют разные макеты памяти. В частности, wchar_t обычно занимает 2 байта, а char - один byte. То, что вам нужно установить здесь, - это правильная функция преобразования, которая должна применяться к каждому элементу строки

T ConvertChar(U c) { ... }
  • 0
    Правда. Кроме того, преобразование wchar_t <-> char - это не только усечение / расширение каждого элемента. Это так, если ваша локаль английская и вы используете только wchar_t в интервале [0, 256)
  • 0
    Эй, Джаред, я отредактировал свой первый пост, что-то вроде этого?
Показать ещё 1 комментарий
1

Хотя вы можете просто расширить при преобразовании из char в wchar_t (т. wchar_t(c) Использовать wchar_t(c)), но это, вероятно, происходит не так. При преобразовании из wchar_t в char очевидно, что вы, вероятно, потеряете информацию. Общепринято, что индивидуальные символы фактически не представляют отдельные символы, а фактически представляют собой байты, представляющие UTF-8 или UTF-16. В этом случае элементы, вероятно, должны быть закодированы/декодированы в соответствующее другое представление. Очевидно, что преобразование не один к одному: некоторые символы Unicode состоят из нескольких байтов UTF-8 и нескольких слов UTF-16.

Возможно, вы захотите взглянуть на std::codecvt<...> для преобразования кодировок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню