Сбой wcstombs_s, когда входная строка "€" (ASCII 128d) в C ++ \ CLI - PullRequest
1 голос
/ 16 июня 2011

Вот метод для преобразования из управляемой строки в собственный указатель на символ, он вернет код ошибки 42, когда входная строка равна «€» (ASCII 128d):

void StringUtility::ManagedToNative(String^ source, char* pTarget, Int32 targetLength)
{
    if(pTarget == NULL)
        throw gcnew System::ArgumentNullException("The source pointer cannot be empty.");
    if(targetLength <= 0)
        throw gcnew System::ArgumentOutOfRangeException("The target length has to be larger than 0.");

    memset(pTarget, 0, targetLength);
    if(String::IsNullOrEmpty(source))
    {
        pTarget[0] = '\0';
        return;
    }

    // Conversion to char* :
    size_t convertedChars = 0;
    size_t sizeInBytes = targetLength;
    size_t count = (source->Length > targetLength) ? _TRUNCATE : targetLength;
    errno_t err = 0;
    {
        /* minimize the scope of pined object */
        pin_ptr<const wchar_t> wch = PtrToStringChars(source);
        err = wcstombs_s(&convertedChars, pTarget, sizeInBytes, wch, count);
    }

    // if truncate did happen and it's intended, return as successful.
    if( count == _TRUNCATE && err == STRUNCATE )
        return;
    if (err != 0)
        throw gcnew System::InvalidOperationException("convert from String^ to char* failed");
}  

Это просто потому, что я не могу конвертировать ни одну строку (с байтами> = 128), используя wcstombs_s? (см. это )

1 Ответ

0 голосов
/ 06 июня 2012

Из документа MSDN о wcstombs_s :

Если wcstombs_s встречает широкий символ, он не может преобразоваться в многобайтовый символ, он помещает 0 в * pReturnValue, устанавливает буфер назначения напустая строка, устанавливает errno в EILSEQ и возвращает EILSEQ.

EILSEQ - это код ошибки 42.

Чтобы преобразовать строку Unicode в массив char *, я бы предложил получить двоичный файлмассив строки Unicode и закодировать его с помощью Base64 и сохранить закодированный результат в массиве char *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...