Dites-moi s’il vous plaît, pourquoi je reçois ce problème:
si presse-papiers contient des caractères Unicode (eq russe), je ne reçois que le premier mot sélectionné. Premier mot avant le caractère “espace”.
si presse-papiers ne contient pas de caractères unicode (anglais uniquement), le premier caractère du texte sélectionné est obtenu.
Obtenir le texte sélectionné:
CSsortingngA getClipboard() { CSsortingngA strData; if (OpenClipboard(NULL)){ HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); char *pchData = (char*)GlobalLock(hClipboardData); strData = pchData; GlobalUnlock(hClipboardData); CloseClipboard(); } return strData; }
Définir le texte:
bool setClipboard(CSsortingngA textToclipboard) { bool success = true; if (OpenClipboard(NULL)){ EmptyClipboard(); HGLOBAL hClipboardData; size_t size = (textToclipboard.GetLength()+1) * sizeof(TCHAR); hClipboardData = GlobalAlloc(NULL, size); TCHAR* pchData = (TCHAR*)GlobalLock(hClipboardData); memcpy(pchData, LPCTSTR(textToclipboard.GetSsortingng()), size); SetClipboardData(CF_UNICODETEXT, hClipboardData); GlobalUnlock(hClipboardData); CloseClipboard(); } return success; }
Simplement obtenir et définir le contenu du presse-papiers.
CSsortingngA str = getClipboard(); setClipboard(str);
CF_UNICODETEXT
utilise UTF-16. Sous Windows, les éléments de données wchar_t
sont utilisés pour UTF-16, mais votre code utilise plutôt char
. CSsortingngA
n’est pas compatible avec UTF-16. Vous ne concordez pas les données dans les deux fonctions, c’est pourquoi vous n’obtenez pas les résultats escomptés.
Une solution consiste à utiliser CSsortingngW
au lieu de CSsortingngA
:
CSsortingngW getClipboard() { CSsortingngW strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); if (hClipboardData) { WCHAR *pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return strData; } bool setClipboard(CSsortingngW textToclipboard) { bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(WCHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { WCHAR* pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (WCHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_UNICODETEXT, hClipboardData); } } CloseClipboard(); } return success; }
Si vous devez restr avec CSsortingngA
, alors soit:
utilisez CF_TEXT
au lieu de CF_UNICODETEXT
et laissez le presse-papiers gérer les conversions entre Ansi et Unicode pour vous:
CSsortingngA getClipboard() { CSsortingngA strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_TEXT); if (hClipboardData) { CHAR *pchData = (CHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return strData; } bool setClipboard(CSsortingngA textToclipboard) { bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(CHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { CHAR* pchData = (CHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (CHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_TEXT, hClipboardData); } } CloseClipboard(); } return success; }
convertir manuellement vers / depuis UTF-16 lors de l’utilisation de CF_UNICODETEXT
:
CSsortingngA getClipboard() { CSsortingngW strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); if (hClipboardData) { WCHAR *pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return CSsortingngA((WCHAR*)strData.GetSsortingng()); } bool setClipboard(CSsortingngA strData) { CSsortingngW textToclipboard((CHAR*)strData.GetSsortingng()); bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(WCHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { WCHAR* pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (WCHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_UNICODETEXT, hClipboardData); } } CloseClipboard(); } return success; }
Une autre solution consiste à utiliser CSsortingng
au lieu de CSsortingngA
ou CSsortingngW
, puis de CF_TEXT
ou CF_UNICODETEXT
selon que TCHAR
est Ansi ou Unicode:
#ifdef UNICODE #define CF_TEXT_T CF_UNICODETEXT #else #define CF_TEXT_T CF_TEXT #endif CSsortingng getClipboard() { CSsortingng strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_TEXT_T); if (hClipboardData) { TCHAR *pchData = (TCHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return strData; } bool setClipboard(CSsortingng textToclipboard) { bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(TCHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { TCHAR* pchData = (TCHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (TCHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_TEXT_T, hClipboardData); } } CloseClipboard(); } return success; }
Les deux sont Unicode …
Mais en Unicode, plus d’un octet représente un caractère. Par exemple, 2 octets sont utilisés pour un caractère. Donc:
Quand c’est russe, la corde est comme
'\0' ---- 0x04 0x3F 0x04 0x40 0x04 0x38 0x04 0x32 0x04 0x35 0x04 0x42 0x00 0x20 ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ п р и в е т space
Il lit jusqu’à l’espace.
Quand c’est anglais, la chaîne est comme
'\0' ---- 0x00 0x48 0x00 0x65 0x00 0x6C 0x00 0x6C 0x00 0x6F 0x00 0x20 ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ H ello space
Il ne lit rien. (Si vous lisez en premier, c’est à cause de l’ordre de stockage des octets, LE ou BE)
Remarque: je ne suis peut-être pas précis dans le choix des mots (Unicode, UTF, …)