Преобразование std :: string в FString (TCHAR / wstring) со специальными символами

Используя Unreal Engine 4, я хочу загрузить с машины файл, который содержит такие символы, как , , и .

Все попытки преобразования приводят к тому, что окончательный FString либо содержит вместо ? символ, либо вообще не содержит символа.

FString - это внутренний строковый класс UE4, который использует TCHAR (wchar_t), который использует кодировку UTF-16.

Даже отчаянные попытки использовать это не увенчались успехом:

std::replace(str.begin(), str.end(), L'“', L'\"');

Ничего не произошло.

Как правильно преобразовать std::string в FString?


person Sebastian Schon    schedule 13.06.2018    source источник
comment
Во-первых, вам нужно решить, какую кодировку использует std::string. Использует ли он UTF-8 или системный языковой стандарт? Вы не можете преобразовать его, не ответив сначала. Но когда вы все-таки конвертируете, вы можете использовать переносимые функции STL, такие как std::wstring_convert() или mbsrtowcs(), или библиотеки Unicode, такие как ICONV или ICU, или специфичные для платформы функции, такие как MultiByteToWideChar() в Windows и т. Д.   -  person Remy Lebeau    schedule 13.06.2018
comment
Спасибо за ваш ответ. Как это, возможно, стало очевидным, я не осведомлен обо всем этом, поэтому мои ответы могут показаться глупыми. Мы хотим, чтобы пользователь мог читать файлы любого типа, поэтому было бы неплохо, если бы мы могли работать с любой (общей) кодировкой. Но я полагаю, вы имеете в виду кодировку самой строки? Когда я проводил свое исследование, он сказал, что строка не использует какую-либо конкретную кодировку сама по себе, а просто хранит байты. Как мне узнать, какую кодировку он использует?   -  person Sebastian Schon    schedule 15.06.2018
comment
это вам решать, когда вы заполняете строку. Когда вы читаете файлы, нет общей кодировки. Вы должны знать кодировку каждого файла. Если вы не знаете, то вам не повезло, если вы не спросите пользователя или не воспользуетесь иерархией, чтобы угадать.   -  person Remy Lebeau    schedule 15.06.2018


Ответы (2)


Преобразуйте свой std::string в std::wstring, поскольку он также задан на wchar_t, и попробуйте инициализировать им свой FString.
Если вы не знаете, как преобразовать в wstring: c ++ не может преобразовать строку в wstring
Тогда вы можете сделать что-нибудь вроде:
FString str = FString(your_wstring.c_str()); или
FString str(your_wstring.c_str());

Вы также можете попытаться прочитать данные из файла прямо в wstring или даже в FString, потому что UE4 имеет свои собственные классы для управления файлами, например FFileHelper: http://api.unrealengine.com/INT/API/Runtime/Core/Misc/FFileHelper/index.html, и я бы действительно порекомендовал вам этот последний вариант :-)

person Paradowski    schedule 25.06.2018
comment
Привет, спасибо за ответ, я уже пробовал это, wstring просто полностью отбросил символы, не распознаваемые FString. Никаких особенных "?", Просто их больше нет. В другом методе преобразования я, по крайней мере, теперь распознал символ -, но ничего больше. - person Sebastian Schon; 30.06.2018

Вы можете преобразовать std :: string в FString, а затем записать это следующим образом.

std::string someString = "Hello!";

FString unrealString(someString .c_str());

UE_LOG(LogTemp, Warning, TEXT("%s"), *unrealString);

Затем вы можете выполнить на нем функцию замены FString. https://docs.unrealengine.com/en-US/API/Runtime/Core/Containers/FString/Replace/index.html

person Mohit Pundir    schedule 12.11.2019