FString FGenericPlatformHttp::UrlEncode(const FString &UnencodedString) { FTCHARToUTF8 Converter(*UnencodedString); //url encoding must be encoded over each utf-8 byte const UTF8CHAR* UTF8Data = (UTF8CHAR*) Converter.Get(); //converter uses ANSI instead of UTF8CHAR - not sure why - but other code seems to just do this cast. In this case it really doesn't matter FString EncodedString = TEXT(""); TCHAR Buffer[2] = { 0, 0 }; for (int32 ByteIdx = 0, Length = Converter.Length(); ByteIdx < Length; ++ByteIdx) { UTF8CHAR ByteToEncode = UTF8Data[ByteIdx]; if (IsAllowedChar(ByteToEncode)) { Buffer[0] = ByteToEncode; FString TmpString = Buffer; EncodedString += TmpString; } else if (ByteToEncode != '\0') { EncodedString += TEXT("%"); EncodedString += FString::Printf(TEXT("%.2X"), ByteToEncode); } } return EncodedString; }
bool EditField::OnKeyboardEvent(bool bKeyDown, unsigned int sym, unsigned int mod) { if (!bKeyDown) return true; switch (sym) { case SDLK_LEFT: if (m_uiCaretPos > 0) m_uiCaretPos--; UpdateCaretPos(); break; case SDLK_RIGHT: if (m_uiCaretPos < static_cast<unsigned int>(m_cszText.GetLength())) m_uiCaretPos++; UpdateCaretPos(); break; case SDLK_HOME: m_uiCaretPos = 0; UpdateCaretPos(); break; case SDLK_END: m_uiCaretPos = m_cszText.GetLength(); UpdateCaretPos(); break; case SDLK_DELETE: if (m_uiCaretPos < static_cast<unsigned int>(m_cszText.GetLength())) { m_cszText.Delete(m_uiCaretPos); UpdateTexture(); } break; case SDLK_BACKSPACE: if (m_uiCaretPos > 0) { m_cszText.Delete(--m_uiCaretPos); UpdateTexture(); } break; case SDLK_ESCAPE: GetWindowManager().SetFocus(); m_bFocused = false; break; default: if (IsAllowedChar(sym, mod)) { unsigned int ch = sym; if (sym >= SDLK_a && sym <= SDLK_z && (mod & KMOD_SHIFT) != 0) ch -= 32; // make uppercase m_cszText.Insert(m_uiCaretPos++, static_cast<TCHAR>(ch)); UpdateTexture(); } break; } // update text attribute SetAttr(EditFieldAttr::Text, m_cszText, true); return true; }