BITERP / PinkRabbitMQ

Внешняя Native API компонента для взаимодействия с RabbitMQ из 1С
MIT License
264 stars 107 forks source link

Преобразование из string в wstring #44

Open Shanginre opened 3 years ago

Shanginre commented 3 years ago

В файле /PinkRabbitMQWindows/NativeAPI/CAddInNative.cpp есть такой код

std::string outdata;
...
setWStringToTVariant(&paParams[1], Utils::stringToWs(outdata).c_str());
...

В методе Utils::stringToWs реализовано такое преобразование из string в широкую строку wstring:

std::wstring Utils::stringToWs(const std::string& s)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
    return conv.from_bytes(s);
}

Если строка s будет содержать некоторые спец символы unicode, например такие как неразрывный пробел (U+00A0), то это вызовет ошибку преобразования и исходная строка в лучшем случае получится обрезанной. Может будет более безопаснее использовать проверенную?

boost::locale::conv::utf_to_utf<wchar_t>(s);
Begemoth2 commented 3 years ago

@Shanginre

Если строка s будет содержать некоторые спец символы unicode, например такие как неразрывный пробел (U+00A0), то это вызовет ошибку преобразования и исходная строка в лучшем случае получится обрезанной

Мы с такой ошибкой/особенностью в "типовой функции" не сталкивались (и в "интернетах" о такой особенности не пишут).

Тащить boost внутрь компоненты пока не планируем.

Shanginre commented 3 years ago

@Begemoth2 неразрывный пробел появляется например когда число 1С преобразуют сразу в строку не используя Формат(). В практике, это иногда случается по невнимательности разработчика.

Вы сами попробуйте перевести такую строку "1<здесь неразрывный пробел>000" в wstring. Вы в функции conv.from_bytes(s) получите исключение и строка у вас обрежется.

Begemoth2 commented 3 years ago

@Shanginre

Если строка s будет содержать некоторые спец символы unicode, например такие как неразрывный пробел (U+00A0)

Здесь нет символа 00. nobreak space в utf-8 равен 0xC2 0xA0

Выложите пожалуйста код, который иллюстрирует ошибку (на 1С с использованием компоненты или на c++ )