diff --git a/src/SFML/Window/Win32/ClipboardImpl.cpp b/src/SFML/Window/Win32/ClipboardImpl.cpp index 6b133ed6e..f81bd2ee2 100644 --- a/src/SFML/Window/Win32/ClipboardImpl.cpp +++ b/src/SFML/Window/Win32/ClipboardImpl.cpp @@ -33,6 +33,7 @@ #include #include +#include #include @@ -65,7 +66,8 @@ String ClipboardImpl::getString() return text; } - text = String(static_cast(GlobalLock(clipboardHandle))); + const std::u16string_view string(static_cast(GlobalLock(clipboardHandle))); + text = String::fromUtf16(string.begin(), string.end()); GlobalUnlock(clipboardHandle); CloseClipboard(); @@ -90,10 +92,11 @@ void ClipboardImpl::setString(const String& text) } // Create a Win32-compatible string - const std::size_t stringSize = (text.getSize() + 1) * sizeof(WCHAR); + const auto string = text.toUtf16(); + const std::size_t stringSize = (string.size() + 1) * sizeof(char16_t); if (const HANDLE stringHandle = GlobalAlloc(GMEM_MOVEABLE, stringSize)) { - std::memcpy(GlobalLock(stringHandle), text.toWideString().data(), stringSize); + std::memcpy(GlobalLock(stringHandle), string.data(), stringSize); GlobalUnlock(stringHandle); SetClipboardData(CF_UNICODETEXT, stringHandle); } diff --git a/test/Window/Clipboard.test.cpp b/test/Window/Clipboard.test.cpp index 68200a321..47fcc8e3f 100644 --- a/test/Window/Clipboard.test.cpp +++ b/test/Window/Clipboard.test.cpp @@ -12,12 +12,32 @@ TEST_CASE("[Window] sf::Clipboard", runDisplayTests()) // Capture current clipboard state const auto currentClipboard = sf::Clipboard::getString(); - SECTION("Set/get string") + sf::String string; + + SECTION("ASCII") { - sf::Clipboard::setString("Welcome to SFML!"); - CHECK(sf::Clipboard::getString() == "Welcome to SFML!"); + string = "Snail"; } + SECTION("Latin1") + { + string = U"Limacé"; + } + + SECTION("Basic Multilingual Plane") + { + string = U"カタツムリ"; + } + + SECTION("Emoji") + { + string = U"🐌"; + } + + INFO("String: " << reinterpret_cast(string.toUtf8().c_str())); + sf::Clipboard::setString(string); + CHECK(sf::Clipboard::getString() == string); + // Restore clipboard sf::Clipboard::setString(currentClipboard);